STMCU小助手
发布时间:2021-2-3 09:54
|
关于读取STM32RTC 日历值不更新的话题 在使用STM32芯片的RTC日历功能时,偶尔有人反映读取日历时间不动、不更新甚至说RTC不运行的情况。 前不久就有人反馈,说STM32F4和STM32L4的RTC脱机运行跑不起来,不运行。奇怪的是调试时不论单步还是全速运行,查看日历寄存器都显示正常运行,数据也正常。 可当烧录代码到芯片后,通过调试助手查看日历的数据则原地不动了,感觉RTC没有运行。客户用STM32F4和STM32L4的板都测试过,出现同样问题。怀疑STM32F4和L4芯片的RTC是否有BUG。客户使用STM32CUBEMX自己配置过、用STM32的CUBE库里的RTC工程也测试过,都有同样问题。 查看客户的测试代码,就是读RTC的日历,很简单。如下:
从上面代码不难看出就是不停地去读当前的时、分、秒时间。STM32参考手册在关于RTC日历读取操作部分有相关描述,为了读取时间的一致性,读取日历操作要求先读时分秒然后还得读日期,这样做为一个完整的操作。所以在读取TIME【时分秒】后,硬件会将当前日历值锁住,直到读取了日期寄存器。否则当你读了TIME而不读DATE的话,再去读TIME时还是原来的值维持不变。显然,客户这里的代码只有读取TIME时间的语句,没有读取DATE日期的代码。
或许有人会问,为什么同样代码在调试情况下打开RTC寄存器查看窗口时又能正常运行呢?那是因为在打开RTC寄存器查看窗口时,虽然用户代码没去读DATE,但调试组件读了DATE寄存器,所以一切风调雨顺。 不妨在保持客户上面代码情况下,把读到的时分秒的值放到三个全局变量里,然后通过WATCH窗口观察这三个变量的数据变化。 当你打开RTC寄存器查看窗口时,时分秒变量的数据正常变化; 当你关闭RTC寄存器查看窗口时,时分秒变量的数据保持不变;
【以上截图来自ARM MDK IDE的调试界面】 所以,要想每次正确读取RTC日历数据,还得加一句读DATE的代码HAL_RTC_GetDate( )。 最后小结下: 对于RTC日历的读取要注意读取动作的完整性,读了TIME还要读取DATE才算一个完整操作。另外要注意按照先TIME后DATE的顺序读取,以保持读取时间的一致性。不然的话,有时会遇到一些“有趣”而折腾人的事情,折腾了半天甚至多天后才发现原来都是些小细节、小误解。 文章出处: 茶话MCU |
微信公众号
手机版