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

STM32CubeL4 固件库 V1.13.0 版的 RTC唤醒问题

[复制链接]
STMCU小助手 发布时间:2022-8-7 14:52
前言
& J! U9 X* A( L1 E因为 STM32L4 极其出色的低功耗性能,越来越多的用户在使用 STM32L4 系列开发产品。谈到低功耗,自然就少不了低功耗模式。进入低功耗模式,自然需要能够唤醒。很多用户在产品开发中会使用 RTC 的定时唤醒从低功耗状态。
1 D- j. s/ e& T1 }; k# \; r2 s

  I4 N8 [- S. V% r- E8 y  p1 F问题   e1 o4 w3 O( ]/ K
某客户在其产品的设计中,使用了 STM32L476RGT6。客户使用 RTC 的定时唤醒来将系统从 STOP2 模式中唤醒,但是发现无法唤醒。. r" ]8 a; W: N2 L* T3 v. S6 l

' Y% S7 s7 U; t7 x8 ?. Y
3 K. e' _; ?- E6 |  y+ L
调研
+ |. }: k4 C6 q6 ~( _: t  v- k  z1.了解问题
2 H. d1 ]6 r, r3 b% I+ P5 d客户参考\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 模式了。
/ L0 W, T+ w, t- g
. T) x% k% y4 f+ O; b7 ~9 R) |% Y
/ I! ^1 e' i; W9 t: G
2.分析问题
9 v4 b# _7 }* K; v9 G' l0 r# o为进一步确认问题,使用另一版本的固件库的相关例程\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 唤醒定时器中断的配置函数。$ I* U( V: q- ^. u0 {# {$ i6 S
  1. HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 0x0FFFF, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
复制代码
HAL_RTCEx_SetWakeUpTimer_IT()函数位于 stm32l4xx_hal_rtc_ex.c 中。对比 V1.12.0 版本和 V1.13.0 版本中的这个函数,发现在 V1.13.0 为了加入对 STM32L412 和 STM32L422 的支持,对此函数内容进行了修改。最后发现,在 V1.13.0 版本中,修改后的这个函数出现了一个 Bug:0 a! v6 a! J1 m$ V- h/ g- e
  1. #if defined(STM32L412xx) || defined(STM32L422xx)
    : e  h' Z, x8 w
  2. /* In case of WUT autoclr, the IRQ handler should not be called */
    / x# R- p& J3 Y
  3. if (WakeUpAutoClr != 0u)
    ; V# e" P+ K, `) [9 n
  4. {
    : n; N  m0 B5 k3 C) o; W. g+ W) p
  5. /* RTC WakeUpTimer EXTI Configuration: Event configuration */) [5 M% G( S) l
  6. __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_EVENT();3 l! J1 v( A: i* [9 z
  7. }& C% p6 v7 _& e3 ~7 o
  8. else
    - a3 ]& ]! b5 p( v7 ^' a; F
  9. {0 W4 H- @8 m" `4 s; ~
  10. /* RTC WakeUpTimer EXTI Configuration: Interrupt configuration */4 j4 D. b; p7 v+ ]/ }
  11. __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_IT();
    " ~+ `6 t9 V4 M0 k
  12. }' U  x* l& b$ c# U6 G8 v5 u
  13. #else /* defined(STM32L412xx) || defined(STM32L422xx) */9 L8 Z6 t! @0 D5 q" B: s
  14. __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_EVENT(); //L9121 Z7 [8 P  C. L( p( s
  15. #endif /* defined(STM32L412xx) || defined(STM32L422xx) */
复制代码

6 j4 U7 v/ Q$ R9 K/ ?8 n* W在 L912 行的位置,也就是针对非 STM32L412/STM32L422 的部分,它使用的语句是:
! M7 a8 ?# j/ N0 h4 g5 L
  1. __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_EVENT();
复制代码

. |5 Z* L+ E" p+ b: s而在 V1.12.0 中,使用的是:! g  P) \3 L" q# H
  1. /* RTC WakeUpTimer Interrupt Configuration: EXTI configuration */
    4 m+ r. f  @# x/ S7 A
  2. __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_IT();
复制代码
3 P/ }) D2 L! U4 ]* Q" f" e; O4 E
这个看起来就很明显了,在 V1.13.0 中使能的是事件,而非中断。所以导致了 RTC 唤醒定时器事件没有产生中断。& z9 F. j: H4 ?

$ G) d8 e6 d+ T4 M* b) b4 s
+ T4 O8 U4 L/ P/ A完整版请查看:附件
* w* _3 E7 a9 ^8 w2 \- Y
$ m" W( Q% `$ K. q/ H( k1 C$ r" b- ~2 f) y% F4 p) h

Wake RTC based on STM32CubeL4.pdf

下载

319.63 KB, 下载次数: 4

赞 收藏 评论0 发布时间:2022-8-7 14:52

举报

0个回答

所属标签

相似技术帖

官网相关资源

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