这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STM32L0进入STOP模式后串口中断方式唤醒

共3条 1/1 1 跳转至

STM32L0进入STOP模式后串口中断方式唤醒

院士
2023-05-29 23:46:02     打赏

实现方法:

1、定时休眠唤醒code

  1. HAL_Delay(2000);//进行采样的时间

  2. HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle);

  3. HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 2, RTC_WAKEUPCLOCK_RTCCLK_DIV16);

  4. HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);//调用库函数进入STOP模式

  5. SystemClockConfig_STOP();//停机模式后唤醒,恢复时钟源

  6. count1++;

  7. while(count1==1)//循环的次数

  8. {

  9. Rx_Init();

  10. count1=0;

  11. flag3=0;

  12. __HAL_RTC_ALARM_DISABLE_IT(&RTCHandle, RTC_IT_ALRA);

  13. __HAL_RTC_ALARM_CLEAR_FLAG(&RTCHandle, RTC_IT_ALRA);

  14. HAL_TIM_Base_Stop(&TimHandle);   //定时器停止

  15. HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle);

  16. HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);//调用库函数进入STOP模式

  17. }

  18. 计算方法:例如休眠4s

  19. /*  RTC Wakeup Interrupt Generation:

  20. Wakeup Time Base = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSE or LSI))

  21. Wakeup Time = Wakeup Time Base * WakeUpCounter

  22. = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSE or LSI)) * WakeUpCounter

  23. ==> WakeUpCounter = Wakeup Time / Wakeup Time BaseTo configure the wake up timer to 4s the WakeUpCounter is set to 0x1FFF:

  24. RTC_WAKEUPCLOCK_RTCCLK_DIV = RTCCLK_Div16 = 16

  25. Wakeup Time Base = 16 /(~39.000KHz) = ~0,410 ms

  26. Wakeup Time = ~4s = 0,410ms  * WakeUpCounter

  27. ==> WakeUpCounter = ~4s/0,410ms = 9750 = 0x2616 */

  28. HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 0x2616, RTC_WAKEUPCLOCK_RTCCLK_DIV16);



局限性:用内部时钟LSI,大小固定导致Wakeup Time Base 被限制。 Wakeup Time(最大)=0.41ms*65535(0xffff)=26.869s,可能达不到休眠时间要求。

另一种方法:改HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 2, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);

这里RTC_WAKEUPCLOCK_CK_SPRE_16BITS是设置CR寄存器中的低三位,唤醒时钟选择,这里选择1hz,2表示工作2S后进入唤醒中断,这个数随便改,改成多少就是休眠多少时间。


2、串口中断唤醒

唤醒机制:在MCU进入STOP状态后,不能直接通过UART等外设唤醒,在MCU进入STOP前将RX脚设为EXTI模式,并使能对应的中断。唤醒后重新初始化串口、配置时钟。

  1. void Rx_Init()

  2. {

  3. GPIO_InitTypeDef GPIO_InitStruct;

  4. __HAL_RCC_GPIOA_CLK_ENABLE();

  5.   // 配置UART1的Rx引脚为EXIT模式

  6.   GPIO_InitStruct.Pin = USARTx_RX_PIN;

  7.   GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // 特别注意这里要使用中断模式

  8.   GPIO_InitStruct.Pull = GPIO_PULLUP;

  9.   HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);

  10.   HAL_NVIC_SetPriority(EXTI4_15_IRQn, 2, 0);

  11.   HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);

  12. }

  13. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

  14. {

  15. if(GPIO_Pin==USARTx_RX_PIN)

  16. {

  17. //  HAL_NVIC_EnableIRQ(SysTick_IRQn);

  18. SystemClockConfig_STOP();//停机模式后唤醒,恢复时钟源

  19. HAL_Init();

  20. SystemClock_Config();

  21. SystemPower_Config();

  22. HAL_SPI_DeInit(&hspi1);

  23. HAL_GPIO_DeInit(GPIOA,GPIO_PIN_10);//串口重新初始化时HAL_UART_Init()函数会判断if(huart->State == HAL_UART_STATE_RESET),此时才会执行HAL_UART_MspInit(huart),配置串口IO口,这句话必须有!

  24. __HAL_RCC_GPIOA_CLK_ENABLE();

  25. __HAL_RCC_GPIOA_CLK_ENABLE();

  26. __HAL_RCC_GPIOB_CLK_ENABLE();

  27. SPI_GPIO_Init();

  28. UartHandle.Instance        = USARTx;

  29. UartHandle.Init.BaudRate   = uart_baud;

  30. UartHandle.Init.WordLength = UART_WORDLENGTH_8B;

  31. UartHandle.Init.StopBits   = UART_STOPBITS_1;

  32. UartHandle.Init.Parity     = UART_PARITY_NONE;

  33. UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;

  34. UartHandle.Init.Mode       = UART_MODE_TX_RX;

  35. GPIO_InitTypeDef  GPIO_InitStruct;

  36. /*##-1- Enable peripherals and GPIO Clocks #################################*/

  37. /* Enable GPIO TX/RX clock */

  38. USARTx_TX_GPIO_CLK_ENABLE();

  39. USARTx_RX_GPIO_CLK_ENABLE();

  40. /* Enable USART2 clock */

  41. USARTx_CLK_ENABLE();

  42. /*##-2- Configure peripheral GPIO ##########################################*/

  43. /* UART TX GPIO pin configuration  */

  44. GPIO_InitStruct.Pin       = USARTx_TX_PIN;

  45. GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;

  46. GPIO_InitStruct.Pull      = GPIO_NOPULL;

  47. GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH  ;

  48. GPIO_InitStruct.Alternate = USARTx_TX_AF;

  49. HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);

  50. /* UART RX GPIO pin configuration  */

  51. GPIO_InitStruct.Pin = USARTx_RX_PIN;

  52. GPIO_InitStruct.Alternate = USARTx_RX_AF;

  53. HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct);

  54. HAL_NVIC_DisableIRQ(EXTI4_15_IRQn);

  55. __HAL_GPIO_EXTI_CLEAR_IT(USARTx_RX_PIN);

  56. HAL_NVIC_SetPriority(USARTx_IRQn, 4, 0);

  57. HAL_NVIC_EnableIRQ(USARTx_IRQn);

  58. }

  59. }




专家
2023-05-30 01:32:11     打赏
2楼

感谢楼主的分享,很实用了。


专家
2023-05-30 01:32:35     打赏
3楼

感谢楼主的分享,很实用了。


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]