• 正文
  • 相关推荐
申请入驻 产业图谱

省去LSE的代价:一次STM32的RTC断电停摆的排查与设计反思

05/28 15:35
2628
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

马上就要毕设答辩了,我的毕设也基本已经完成了,但是还一直没有把每次上电都会重置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部分从而导致出现的这个错误。

说明在以后的学习和使用中,也要注意此类问题,不可主观独断,认真阅读参考手册。

也希望其他学习者引以为戒,不能因为自己的主观臆断去设计,很多问题都可以在参考手册中发现和解决,在此过程中积累经验。

相关推荐