STM32停止模式进入中断以及中断唤醒遇到的问题及解决办法

本文探讨了在STM32L051K8T6平台上实现低功耗stop模式遇到的问题,包括进入和退出机制、中断抢占优先级调整、串口通信异常及解决策略。通过设置标志位和中断优先级调整,作者分享了关键步骤和注意事项。
摘要由CSDN通过智能技术生成
首先介绍一下使用环境:STM32CUBEIDE、STM32L051K8T6、Stop模式。

由于最近需要用到低功耗模式,所以也是第一次使用低功耗模式,把自己遇到的问题记录一下。

  1. 无法进入stop模式

通过按键外部中断实现进入stop模式,长按进入,按键唤醒,由于识别短按、长按、单击、连击,选择了上下沿触发
在这里插入图片描述
由于长按的时候在按键过程中已经识别了按键动作,所以在按键松开之前就已经进入了stop模式,但忘记了按键松开也会触发中断!!!导致按下进入stop,松开退出中断,所以看起来就一直无法进入中断。

  1. stop模式无法唤醒

希望通过按键中断进入stop模式,同一个按键中断退出stop模式,但进入后一直无法退出。

原因:用于进入停止模式的中断和用于产生唤醒的中断,后者要抢占优先级一定要高,否则无法唤醒。由于进入停止模式后,调节器以低功耗模式提供1.8V电源未断开,寄存器的内容还是保持的,所以程序还处在中断里面。但另一个中断来唤醒时,由于抢占的优先级不够高,无法抢占原来的中断,故无法唤醒。所以只有用来唤醒的中断抢占优先级高,才可以唤醒!!

解决办法:采用标志位,在中断中对标志位进行操作,然后再其他地方对标志位进行判断,决定是否要进入stop模式。而且,并不推荐在中断中进入stop模式,因为从stop模式出来后还要执行下面的程序。

  1. 唤醒后串口传输有问题

具体表现在收发数据由问题,原本是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(),解决问题!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是along不是alone

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值