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

关于读取STM32 RTC 日历值不更新的话题

[复制链接]
STMCU小助手 发布时间:2021-2-3 09:54
关于读取STM32RTC 日历值不更新的话题
4 K$ }8 J6 F( i% l) b
在使用STM32芯片的RTC日历功能时,偶尔有人反映读取日历时间不动、不更新甚至说RTC不运行的情况。

; T# _7 D! I0 c7 A( O& m
前不久就有人反馈,说STM32F4和STM32L4的RTC脱机运行跑不起来,不运行。奇怪的是调试时不论单步还是全速运行,查看日历寄存器都显示正常运行,数据也正常。

1 M$ d6 |; L( ]
可当烧录代码到芯片后,通过调试助手查看日历的数据则原地不动了,感觉RTC没有运行。客户用STM32F4和STM32L4的板都测试过,出现同样问题。怀疑STM32F4和L4芯片的RTC是否有BUG。客户使用STM32CUBEMX自己配置过、用STM32的CUBE库里的RTC工程也测试过,都有同样问题。
查看客户的测试代码,就是读RTC的日历,很简单。如下:
  1. while (1)
    3 E3 s, m& u" C! `" x' j
  2. {0 E, q' A8 l. @/ V# P
  3. HAL_RTC_GetTime(&hrtc,&rtcTime,RTC_FORMAT_BIN);
    / K( z! {5 q7 C2 ?# ~8 A; R
  4. printf( ...... );
    * _5 ~8 L2 ]. r# g% {
  5. HAL_Delay(1000);
    , C- J! L! b+ v7 x, {
  6. }
复制代码

7 H( \& _3 c$ E2 F
从上面代码不难看出就是不停地去读当前的时、分、秒时间。STM32参考手册在关于RTC日历读取操作部分有相关描述,为了读取时间的一致性,读取日历操作要求先读时分秒然后还得读日期,这样做为一个完整的操作。所以在读取TIME【时分秒】后,硬件会将当前日历值锁住,直到读取了日期寄存器。否则当你读了TIME而不读DATE的话,再去读TIME时还是原来的值维持不变。显然,客户这里的代码只有读取TIME时间的语句,没有读取DATE日期的代码。

! ~* U% K4 X. K
1.1.jpg
, j$ M$ z1 o; i. a! t5 f7 Q
或许有人会问,为什么同样代码在调试情况下打开RTC寄存器查看窗口时又能正常运行呢?那是因为在打开RTC寄存器查看窗口时,虽然用户代码没去读DATE,但调试组件读了DATE寄存器,所以一切风调雨顺。

6 Q. N$ a$ P' G8 E4 n* b% H
不妨在保持客户上面代码情况下,把读到的时分秒的值放到三个全局变量里,然后通过WATCH窗口观察这三个变量的数据变化。
0 M9 l& {7 j: {$ o* v
当你打开RTC寄存器查看窗口时,时分秒变量的数据正常变化;
当你关闭RTC寄存器查看窗口时,时分秒变量的数据保持不变;

4 l! y: j/ b2 K' S; w) T
1.2.jpg
9 {# {" c2 A6 b1 D
【以上截图来自ARM MDK IDE的调试界面】

; a6 W" }4 e* s1 N" D7 x+ i
所以,要想每次正确读取RTC日历数据,还得加一句读DATE的代码HAL_RTC_GetDate( )。
8 @! M: p' j  V
最后小结下:
$ t8 U5 p$ i4 c# p
对于RTC日历的读取要注意读取动作的完整性,读了TIME还要读取DATE才算一个完整操作。另外要注意按照先TIME后DATE的顺序读取,以保持读取时间的一致性。不然的话,有时会遇到一些“有趣”而折腾人的事情,折腾了半天甚至多天后才发现原来都是些小细节、小误解。
! l/ c; u# l8 P* o+ S
文章出处: 茶话MCU
赞 收藏 评论0 发布时间:2021-2-3 09:54

举报

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