你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32L0 进入STOP模式后串口中断方式唤醒

[复制链接]
STMCU小助手 发布时间:2021-11-16 01: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模式,并使能对应的中断。唤醒后重新初始化串口、配置时钟。(这里贴两份代码,一份是我参考的百战天虫的code,另一份我自己的)

by:百战天虫
  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. }
复制代码

结束!


收藏 评论0 发布时间:2021-11-16 01:02

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版