关于STM32开发板RTC计时不准的问题

在想要作一个简单的电子时钟+闹钟的时候,手上刚好有一个买来的STM32的最小系统板,就考虑使用RTC功能完成。

硬件:

淘宝购入STM32f103c8t6最小系统板,大概长这样在这里插入图片描述
这个板子虽然没有备份区单独的电池供电,但是也是有低速外部晶振的,就是LED旁边黑黑的那个小方块,至于STM32为什么要设计两个晶振大部分的说法是一个高速晶振给PLL倍频后提供给CPU运行,一个低频晶振转门供RTC精准计时使用,**那么再多问一句,就是为什么要单独使用一个晶振给RTC计时用,用CPU主频分出来的时钟给RTC使用不可以么?**当然是可以的,我个人的理解32.768KHz晶振存在的意义大概有两点:第一是跟电源低功耗的设计有关,当MCU全功率运行时,所有时钟振荡器都是工作的,但为了在一些场景下实现低功耗,MCU设计了低功耗模式,此时会关闭大部分外设和高速振荡器来降低功耗,这时候使用一个单独的晶振单独为后备区域供电让在低功耗模式下也可以计时成为可能;第二个原因就是低速晶振的精度会更高一些(传言,没有仔细探究,同为无源晶振为什么32.768更精准还是因为不倍频所以更容易走时精准也未知,感兴趣的胖友可以探究交流,)

软件设计:

RTC功能直接实现全套时钟+定时的功能。使用外部低速晶振驱动。

RTC的使用步骤:

  1. 使能电源时钟和备份区
  2. 取消备份区写保护
  3. 复位备份区,开启外部低速振荡器
  4. 选择RTC时钟源并使能
  5. 设置分频等参数
  6. 配置中断
  7. 编写中断函数,结束

测试:

下载程序后发现RTC正常运行于是插上电就出门了,由于没有后备区域电池,这里直接通过USB口给最小系统板供了电,等回家时候检查了一下时钟大吃一惊发现出门大概8个小时,计时走慢了大概两三分钟就是150多秒。以为对表没对好就重新校准了一次,第二天发现依旧是这样,没有多想想着直接按少的秒数大概补偿一下,反正我这个也不需要很准,后来晚上睡了一觉发现少计数竟然还不是线性的,补偿也不好补偿。于是仔细检查了一下自己的程序,发现:没毛病,又在网上浏览了一些资料,发现大家都在夸32.768的晶振如何如何准,走几个月不差一秒,关于走时不准的问题了了无几。怀疑是我的这个低速晶振有漂移,但是由于缺乏设备我也没有单独看晶振波形,就大概检测了一下,用HSE开了一个TIMER跟RTC的走时比了一下,发现果然RTC走时差很多,每几分钟大概都会差1s,RTC的时钟切换到HSE发现和TIMER的计数值对上了,说明RTC的配置并没有问题,主要来源应该还是晶振漂移的问题。简单拿了手机秒表和HSE驱动下的RTC时钟对了一下觉得还比较准,由于我没有低功耗使用的需求,因此就直接用HSE驱动RTC使用了,走时精准度大概没24H差几秒,也可以接受,至此完成功能。

总结:

由于网上对于RTC走时不准的问题其实分析的不多,尤其是对走的这么不准的问题,我这里简单总结一下。如果RTC走时不准:
第一可以使用一个TIMER跟RTC的计时对比一下,看一下这两个时钟源驱动下计数是否有差异,然后可以将RTC时钟源切换至HSE重新配置分频测试一下走时是否准确,如果差的很多考虑是配置有问题需要重新检查一下;
第二如果走时正常只是差几秒,考虑是晶振不准,可以采用RTC的校准功能,校准功能的核心是用一个高精度的时钟对低精度的时钟进行校准,两个同时计数一段时间然后差的值就作为补偿值进行补偿,这个方法有两个问题,第一是你要有一个高精度的时钟源,第二个是只能应对时钟不准但很稳的情况,如果时钟不稳就没办法了;
第三是可以考虑从硬件上入手,在设计时候通过匹配合适的电容电阻以及走线设计上保证时钟的尽可能的准确性。

总的说一句就是不要盲目相信RTC时钟的精确性,买回来的成品也不一定做的很好。