
RTC在断电后不再更新,但是上电的话都是能正常工作的。而备用电池肯定是没有问题的,那么要么是程序上的问题,要么是硬件问题。后来发现自己犯了一个很抽象的错误,今天来分享一下排错过程和哪里犯错了。在解决这个问题之前,让我们先回顾一下RTC时钟的工作流程。

RTC时钟有一个电压检测开关,当检测到低电压的时候会使用VBAT引脚即备用电池进行供电。
从RCT的时钟树中我们可以看到,RTC的时钟来源可以来自于三个渠道,分别是:LSI内部低速时钟、LSE外部低速时钟、外部高速时钟的32分频。

RTC的主时钟经过两个分配器之后会更新时钟,前者Asynchronous Predivider(默认值128)用于亚秒寄存器的更新,配合后者Synchronous Predivider(默认值256)实现总时钟的更新。

32.768kHZ的低速晶振合被这两个分频器分频后正好会产生1HZ的时钟用于寄存器更新。因此如果是出现RTC时钟不准的问题可以检查一下分频系数和LSE是否匹配,否则会产生过快或者过慢的情况。那为什么我的时钟掉电之后不走呢?
后来我想起来自己在设计第二版原理图的时候,当时为了省事去掉了外部低速时钟(LSE)当时主要是认为外部低速时钟在这个项目中用不到,而且引脚资源也比较紧张,脑子一热就把LSE去掉了。

由于没有外部LSE,我的RTC的时钟源选择自LSI,但是恰恰是这个选择导致了问题。我们看看电源部分的描述:

VBAT电源仅为RTC模块,外部32KHZ晶振和备份寄存器供电。那么问题就非常明显了,由于没使用外部低速晶振,而LSI并不能在掉电后继续使用,因此就会出现关机后RTC时钟不继续运行的情况。当时大家对LSE的简单描述是:STM32的LSE(低速外部振荡器)提供32.768kHz精准时钟,主要用于RTC和低功耗模式计时。当时注意力主要放在了精准二字上,因为LSI的时钟确实存在较大误差,但是恰恰的忽略了只有LSE能在备用电池作用下继续工作的特性。
因此在设计的过程中还是要思考仔细,这也是源自于自己之前并没有怎么自主设计和使用过STM32的RTC部分从而导致出现的这个错误。说明在以后的学习和使用中,也要注意此类问题,不可主观独断,认真阅读参考手册。也希望其他学习者引以为戒,不能因为自己的主观臆断去设计,很多问题都可以在参考手册中发现和解决,在此过程中积累经验。


登录 或 注册 后才可以进行评论哦!
还没有评论,抢个沙发!