首先介绍一下使用环境:STM32CUBEIDE、STM32L051K8T6、Stop模式。
由于最近需要用到低功耗模式,所以也是第一次使用低功耗模式,把自己遇到的问题记录一下。
- 无法进入stop模式
通过按键外部中断实现进入stop模式,长按进入,按键唤醒,由于识别短按、长按、单击、连击,选择了上下沿触发
由于长按的时候在按键过程中已经识别了按键动作,所以在按键松开之前就已经进入了stop模式,但忘记了按键松开也会触发中断!!!导致按下进入stop,松开退出中断,所以看起来就一直无法进入中断。
- stop模式无法唤醒
希望通过按键中断进入stop模式,同一个按键中断退出stop模式,但进入后一直无法退出。
原因:用于进入停止模式的中断和用于产生唤醒的中断,后者要抢占优先级一定要高,否则无法唤醒。由于进入停止模式后,调节器以低功耗模式提供1.8V电源未断开,寄存器的内容还是保持的,所以程序还处在中断里面。但另一个中断来唤醒时,由于抢占的优先级不够高,无法抢占原来的中断,故无法唤醒。所以只有用来唤醒的中断抢占优先级高,才可以唤醒!!
解决办法:采用标志位,在中断中对标志位进行操作,然后再其他地方对标志位进行判断,决定是否要进入stop模式。而且,并不推荐在中断中进入stop模式,因为从stop模式出来后还要执行下面的程序。
- 唤醒后串口传输有问题
具体表现在收发数据由问题,原本是ADC采集,串口DMA收发,进入stop之前通信正常,上位机发送一个消息,STM32传输一次数据,但从stop模式唤醒后,上位机发了十多次消息,STM32都不发送数据。
原因:串口重新初始化时HAL_UART_Init()函数中会判断if(huart->State == HAL_UART_STATE_RESET),此时才会执行HAL_UART_MspInit(huart),配置串口IO口。
解决办法:每次将UART_HandleTypeDef结构体中的State成员初始化为HAL_UART_STATE_RESET。或者再次初始化之前调用HAL_UART_DeInit()。即在进入stop模式之前加入HAL_UART_DeInit(),解决问题!