因为STM32L4极其出色的低功耗性能,越来越多的用户在使用STM32L4系列开发产品。谈到低功耗,就少不了低功耗模式。进入低功耗模式,自然需要能够唤醒。很多用户在产品开发中会使用RTC把系统从低功耗模式定时唤醒。
问
题
客户在产品的设计中,使用STM32L476RGT6。客户使用RTC的定时唤醒来将系统从STOP2模式中唤醒,但是发现无法唤醒。
调
研
01
了解问题
客户参考\STM32Cube_FW_L4_V1.13.0\Projects\NUCLEO-L476RG\Examples\PWR\PWR_STOP2_RTC的代码,加入其工程项目中,发现无法使用RTC将系统从STOP2模式中唤醒。电路跟客户以前的板子没有区别,觉得不会是电路的问题。为了验证问题,使用了NUCLEO-L476RG板来跑这段例程,结果,发现此例程并没有如readme.txt中描述的那样,进入STOP2模式后经过大约33秒的时间后唤醒。按照readme.txt的说明,应该是LED先闪烁5秒,然后熄灭,进入STOP2模式,RTC定时33秒后将系统唤醒,再回到闪灯,如此循环。但是,实际上这个例程的结果是LED闪烁5秒后进入STOP2模式后就再也没有见到LED闪烁了,即死在STOP2模式了。
02
分析问题
为进一步确认问题,使用另一版本的固件库的相关例程\STM32Cube_FW_L4_V1.12.0\Projects\NUCLEO-L476RG\Examples\PWR\PWR_STOP2_RTC进行验证,结果却发现功能是正常的。难道客户描述有误?下载跟客户相同的STM32CubeL4版本库,即用STM32Cube_FW_L4_V1.13.0来进行验证,发现客户描述的问题确实存在。也就是说,V1.12.0和V1.13.0在这个例程上存在差异。检查main.c源代码,并没有存在区别。所以,猜测驱动代码出问题了。可能时没有产生中断去唤醒STOP2模式,所以特别来检查一下main.c中调用的RTC唤醒定时器中断的配置函数。
(点击图片可放大查看)
HAL_RTCEx_SetWakeUpTimer_IT()函数位于stm32l4xx_hal_rtc_ex.c中。对比V1.12.0版本和V1.13.0版本中的这个函数,发现在V1.13.0为了加入对STM32L412和STM32L422的支持,对此函数内容进行了修改。最后发现,在V1.13.0版本中,修改后的这个函数出现了一个Bug:
在L912行的位置,也就是针对非STM32L412/STM32L422的部分,它使用的语句是:
而在V1.12.0中,使用的是:
这个看起来就很明显了,在V1.13.0中使能的是事件,而非中断。所以导致了RTC唤醒定时器事件没有产生中断。
03
问题解决
将L912行位置上的
修改为:
问题解决。
结论
处理