马上就要毕设答辩了,我的毕设也基本已经完成了,但是还一直没有把每次上电都会重置RTC这个地方给注释掉,所以我的设备每次上电,时间都是从0:00开始的。
于是今天把重置的这个部分给去掉了,这样子RTC时钟就可以正常工作了。
但是我又发现一件奇怪的事情:RTC在断电后不再更新,但是上电的话都是能正常工作的。而备用电池肯定是没有问题的,那么要么是程序上的问题,要么是硬件问题。
后来发现自己犯了一个很抽象的错误,今天来分享一下排错过程和哪里犯错了。
1、RTC是如何运行的
在解决这个问题之前,让我们先回顾一下RTC时钟的工作流程。
RTC时钟有一个电压检测开关,当检测到低电压的时候会使用VBAT引脚即备用电池进行供电。
从RCT的时钟树中我们可以看到,RTC的时钟来源可以来自于三个渠道,分别是:
LSI内部低速时钟、LSE外部低速时钟、外部高速时钟的32分频。
RTC的主时钟经过两个分配器之后会更新时钟,前者Asynchronous Predivider(默认值128)用于亚秒寄存器的更新,配合后者Synchronous Predivider(默认值256)实现总时钟的更新。
32.768kHZ的低速晶振合被这两个分频器分频后正好会产生1HZ的时钟用于寄存器更新。
因此如果是出现RTC时钟不准的问题可以检查一下分频系数和LSE是否匹配,否则会产生过快或者过慢的情况。
那为什么我的时钟掉电之后不走呢?
2、一时省事酿成大祸
后来我想起来自己在设计第二版原理图的时候,当时为了省事去掉了外部低速时钟(LSE)当时主要是认为外部低速时钟在这个项目中用不到,而且引脚资源也比较紧张,脑子一热就把LSE去掉了。
由于没有外部LSE,我的RTC的时钟源选择自LSI,但是恰恰是这个选择导致了问题。
我们看看电源部分的描述:
VBAT电源仅为RTC模块,外部32KHZ晶振和备份寄存器供电。
那么问题就非常明显了,由于没使用外部低速晶振,而LSI并不能在掉电后继续使用,因此就会出现关机后RTC时钟不继续运行的情况。
当时大家对LSE的简单描述是:STM32的LSE(低速外部振荡器)提供32.768kHz精准时钟,主要用于RTC和低功耗模式计时。当时注意力主要放在了精准二字上,因为LSI的时钟确实存在较大误差,但是恰恰的忽略了只有LSE能在备用电池作用下继续工作的特性。
3、反思
因此在设计的过程中还是要思考仔细,这也是源自于自己之前并没有怎么自主设计和使用过STM32的RTC部分从而导致出现的这个错误。
说明在以后的学习和使用中,也要注意此类问题,不可主观独断,认真阅读参考手册。
也希望其他学习者引以为戒,不能因为自己的主观臆断去设计,很多问题都可以在参考手册中发现和解决,在此过程中积累经验。
2628