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

【经验分享】STM32CubeL4 固件库 V1.13.0 版的 RTC唤醒问题

[复制链接]
STMCU小助手 发布时间:2022-3-4 19:42
前言+ A2 c+ R) a. ]8 p1 W
因为 STM32L4 极其出色的低功耗性能,越来越多的用户在使用 STM32L4 系列开发产品。谈到低功耗,自然就少不了低功耗模式。进入低功耗模式,自然需要能够唤醒。很多用户在产品开发中会使用 RTC 的定时唤醒从低功耗状态。+ L. H, N8 |5 u+ Q. y' W
问题
, Q& G" m; N* V! l某客户在其产品的设计中,使用了 STM32L476RGT6。客户使用 RTC 的定时唤醒来将系统从 STOP2 模式中唤醒,但是发现无法唤醒。
, G, a( m, _, {  _. F' @% g, S- Q4 ^/ p

% C! ~8 Z1 n0 z0 v; j9 L' U, [$ I调研
+ @/ B/ ^8 V" a1.了解问题

. ?) ]! y4 T1 v% M2 A0 d  X客户参考\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 模式了。
. v* O3 B. v. e# a- ^# |8 R, c2.分析问题
- I0 ?$ a* }8 H/ i5 Y& }: L为进一步确认问题,使用另一版本的固件库的相关例程\STM32Cube_FW_L4_V1.12.0\Projects\NUCLEOL476RG\Examples\PWR\PWR_STOP2_RTC 进行验证,结果却发现功能是正常的。难道客户描述有误?下载跟客户相同的STM32CubeL4 版本库,即用 STM32Cube_FW_L4_V1.13.0 来进行验证,发现客户描述的问题确实存在。也就是说,V1.12.0 和 V1.13.0 在这个例程上存在差异。检查 main.c 源代码,并没有存在区别。所以,猜测驱动代码出问题了。可能时没有产生中断去唤醒 STOP2 模式,所以特别来检查一下 main.c 中调用的 RTC 唤醒定时器中断的配置函数。
6 h- _8 O3 I3 s1 H: j- F" j+ Y4 y
  1. HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 0x0FFFF, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
复制代码

7 a3 H2 {  C( t8 j' PHAL_RTCEx_SetWakeUpTimer_IT()函数位于 stm32l4xx_hal_rtc_ex.c 中。对比 V1.12.0 版本和 V1.13.0 版本中的这个函数,发现在 V1.13.0 为了加入对 STM32L412 和 STM32L422 的支持,对此函数内容进行了修改。最后发现,在 V1.13.0 版本中,修改后的这个函数出现了一个 Bug:
5 e! q# T& Y) h( z& q
  1. #if defined(STM32L412xx) || defined(STM32L422xx)
    4 ]8 G5 J( I7 L6 X8 U) }9 n
  2. /* In case of WUT autoclr, the IRQ handler should not be called */8 d" b1 m! U# N  X/ g9 U
  3. if (WakeUpAutoClr != 0u)
    / S/ P1 T& X+ Z% Y% j+ g# D
  4. {0 q0 A3 ?. n0 E& l9 k: a; t" k9 |
  5. /* RTC WakeUpTimer EXTI Configuration: Event configuration */
    & B8 z  K: |9 F6 u$ C1 U
  6. __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_EVENT();8 t& K: ]& h( u1 X/ W% @
  7. }
    - X0 F8 y6 |$ V, k2 j3 I
  8. else
    # w$ R* C2 M" c) i  v. ~
  9. {
    0 H* X: V8 ?- i2 @/ h
  10. /* RTC WakeUpTimer EXTI Configuration: Interrupt configuration */
    , R( e1 q9 O4 o
  11. __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_IT();. t; P2 l6 ?* m" E, S7 d9 t
  12. }- A* r# [; Y% O( n" X; u
  13. #else /* defined(STM32L412xx) || defined(STM32L422xx) */
    9 J' N5 {; n% s2 h
  14. __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_EVENT(); //L912
    9 C) X4 D( G. E0 p: Q: V' p
  15. #endif /* defined(STM32L412xx) || defined(STM32L422xx) */
复制代码

1 T+ U- W* p& g; @0 ?% A1 A在 L912 行的位置,也就是针对非 STM32L412/STM32L422 的部分,它使用的语句是:
- L# o/ X0 ~' J8 U7 ~/ X2 z
  1. __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_EVENT();
复制代码

' [- k8 s9 a0 a: c- {0 n而在 V1.12.0 中,使用的是:
2 Q& m/ ], Q% t! ?; g9 O
  1. /* RTC WakeUpTimer Interrupt Configuration: EXTI configuration */
      h1 w1 ~6 Q% u5 i% |% T. K! L
  2. __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_IT();
复制代码

: H, n2 u9 e) F) \2 @2 I1 H这个看起来就很明显了,在 V1.13.0 中使能的是事件,而非中断。所以导致了 RTC 唤醒定时器事件没有产生中断。
7 E5 o* A* f% P/ [) V3 N2 \  T' S1 }8 F9 }4 o
3.问题解决
. [, m$ p. U8 I2 N将 L912 行位置上的
) [& ?% Q8 H, p5 K5 s1 N( Y% a  J
  1. __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_EVENT();
复制代码
( l! b; [' S" u+ L
修改为:1 k% ]7 [! t" d" f: H. ~
  1. __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_IT();
复制代码
7 }9 i( \5 @* j7 L9 C
问题解决。
$ f2 f0 n5 i) B$ C& C7 u' k
, J% f2 m! V  |' z) ?/ s结论及处理
5 |3 @0 f- A) d; C8 @3 ~+ n# p由于在\STM32Cube_FW_L4_V1.13.0\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rtc_ex.c 中存在的 bug 导致了RTC 唤醒定时器中断无法产生中断,无法将系统从 STOP2 模式唤醒。- p) O: m3 W+ k, i
我们可以直接修复 bug 或者使用 STM32Cube_FW_L4_V1.14.0 版本的库。STM32Cube_FW_L4_V1.14.0 版本已修复此问题,可参考\STM32Cube_FW_L4_V1.14.0\Drivers\STM32L4xx_HAL_Driver\Release_Notes.html 中的相关描述。我们知道,STM32 系列众多,相应的固件库庞大且一直在不断丰富完善中,在怀疑驱动库代码方面问题时不妨进一步查看相
$ U/ U# B8 H( x8 |. }关实现代码或使用不同版本库代码做比较验证。6 u/ q2 {' \8 K, G  s9 }' ]' [
5 W+ V5 S/ w. C+ E1 r' y# F  U: h( j
赞 收藏 评论0 发布时间:2022-3-4 19:42

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版