hal库开启中断关中断_技术笔记STM32CubeL4 固件库V1.13.0版的RTC唤醒

因为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唤醒定时器中断的配置函数。

be19ce47766a488ddda54113a452455a.png

(点击图片可放大查看)

HAL_RTCEx_SetWakeUpTimer_IT()函数位于stm32l4xx_hal_rtc_ex.c中。对比V1.12.0版本和V1.13.0版本中的这个函数,发现在V1.13.0为了加入对STM32L412和STM32L422的支持,对此函数内容进行了修改。最后发现,在V1.13.0版本中,修改后的这个函数出现了一个Bug:

f21508e94496958b3ddbb9b665fea789.png

在L912行的位置,也就是针对非STM32L412/STM32L422的部分,它使用的语句是:

1595bf9766d3394d4c6ba4e2db5d9f86.png

而在V1.12.0中,使用的是:

87591b3d0be24bf1859e5b552c73ff00.png

这个看起来就很明显了,在V1.13.0中使能的是事件,而非中断。所以导致了RTC唤醒定时器事件没有产生中断。

03

问题解决

将L912行位置上的

ff9e1dab50c698a52c8fb80d5ff3e255.png

修改为:

fa5b330e1bc4b569c65abef873a6ff5b.png

问题解决。

结论

处理

4902b55b128121546e53dc9cabfe9ed6.png
Version: 2.5.0 (2020-10-21) Keil.STM32L4xx_DFP.2.5.0.pack Updated Pack to STM32Cube_FW_L4 Firmware Package version V1.16.0 using HAL Drivers V1.12.0 Package Description (pdsc): Added global define USE_HAL_DRIVER to the component ::Device:STM32Cube HAL:Common. Device support: Aligned devices with CubeMX DB. CMSIS Flash Algorithm: Removed targets (STM32L4xx_512, STM32L4xx_256) from STM32L4Rx Flash Algorithm project. Added source code for: STM32L476G-Disco QSPI, STM32L4P5G-DK OSPI, STM32L4P5G-DK PSRAM STM32L4R9I-DK PSRAM, STM32L4R9I-DK OSPI1 and STM32L4R9I-EVAL OSPI. Added PSRAM external Loader support for STM32L4R9I-Disco. Fixed STM32L4P5 1M internal flash Loader sector erase with DBANK mode. Fixed STM32L4xx 512K and 128K internal flash Loader sector erase. CMSIS-Driver: MCI: Replaced empty delay loops with _NOP(). Added handling for separate SD and MMC HAL layers. Added busy signal handling after CMDREND interrupt. SPI: Corrected PowerControl function (to return error if Initialize was not called, to abort active transfer if power off was requested). Updated GetDataCount function to give accurate count. Corrected Uninitialize function (to power off the peripheral if it is powered). USART: Added Driver_USART6 (uses LPUART1). Corrected GetTxCount/GetRxCount implementation. USBD: Removed include of stm32l4xx_hal_pcd.h header. Corrected documentation of STM32CubeMx configuration. Updated Boards Examples: Migrated CubeMX projects to V6.0.1. Changed variant selection to "MDK-Plus" where possible. Updated all USB Host/Device examples with user templates from MDK-Middleware v7.11.1.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值