打印

测试发现STM32H7的LPTIM1的中断可以唤醒停机模式,其它几个LPTIM2-5无法唤醒,邪门

[复制链接]
299|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
对于LPTIM1,各种中断方式都可以唤醒停机模式,比如PWM中断,超时中断等(含软件触发和外部触发)。

而LPTIM2-LPTIM5的各种中断方式却都无法唤醒停机模式,但不做唤醒使用,也都正常,邪门了,看勘误手册也没有这种bug。

邪门,备份下这个问题吧。

停机模式下使用的LSE或者LSI为LPTIM提供时钟。

LPTIM1软件触发超时中断方式。

程序里面配置了8分频,4秒后唤醒。

LPTIM_HandleTypeDef             LptimHandle = {0};
void bsp_InitLPTIM2(void)
{
        GPIO_InitTypeDef   GPIO_InitStruct = {0};
        RCC_OscInitTypeDef RCC_OscInitStruct = {0};

        /* ## - 1 - Enable LPTIM clock ############################################ */
        __HAL_RCC_LPTIM1_CLK_ENABLE();
        __HAL_RCC_LPTIM2_CLK_ENABLE();
        
        __HAL_RCC_GPIOE_CLK_ENABLE();
        
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF1_LPTIM1;
        GPIO_InitStruct.Pin = GPIO_PIN_0;
        HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

        RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
        RCC_OscInitStruct.LSEState = RCC_LSE_ON;
        RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

        if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)
        {
        Error_Handler(__FILE__, __LINE__);
        }      

        RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPTIM1;
        RCC_PeriphCLKInitStruct.Lptim1ClockSelection = RCC_LPTIM1CLKSOURCE_LSE;
        HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);

        /* ### - 2 - Initialize the LPTIM peripheral ############################## */
        LptimHandle.Instance = LPTIM1;

        LptimHandle.Init.Clock.Source    = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;
        LptimHandle.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV8;
        LptimHandle.Init.CounterSource   = LPTIM_COUNTERSOURCE_INTERNAL;
        LptimHandle.Init.Trigger.Source  = LPTIM_TRIGSOURCE_SOFTWARE;
//        LptimHandle.Init.Trigger.Source     = LPTIM_TRIGSOURCE_0;
//        LptimHandle.Init.Trigger.ActiveEdge = LPTIM_ACTIVEEDGE_FALLING;
        LptimHandle.Init.OutputPolarity  = LPTIM_OUTPUTPOLARITY_HIGH;
        LptimHandle.Init.UpdateMode      = LPTIM_UPDATE_IMMEDIATE;
        LptimHandle.Init.Input1Source    = LPTIM_INPUT1SOURCE_GPIO;
        LptimHandle.Init.Input2Source    = LPTIM_INPUT2SOURCE_GPIO;

        /* Initialize LPTIM peripheral according to the passed parameters */
        if (HAL_LPTIM_Init(&LptimHandle) != HAL_OK)
        {
        Error_Handler(__FILE__, __LINE__);
        }

        /* Enable and set LPTIM Interrupt to the highest priority */
        HAL_NVIC_SetPriority(LPTIM1_IRQn, 1, 0);
        HAL_NVIC_EnableIRQ(LPTIM1_IRQn);
        
        /* ### - 3 - Start counting in interrupt mode ############################# */
        if (HAL_LPTIM_TimeOut_Start_IT(&LptimHandle, 32768, 32768/2) != HAL_OK)
        {
        Error_Handler(__FILE__, __LINE__);
        }
        
//        if (HAL_LPTIM_PWM_Start_IT(&LptimHandle, 32768, 32768/2) != HAL_OK)
//         {
//       Error_Handler(__FILE__, __LINE__);
//         }
        
        /* ### - 4 - Enter in Stop mode ########################################### */
        HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

        SystemClock_Config();  
}

void LPTIM1_IRQHandler(void)
{
        HAL_LPTIM_IRQHandler(&LptimHandle);
        bsp_LedToggle(4);
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

393

主题

393

帖子

0

粉丝