RTC时钟不准的原因分析

学习了一段时间的STM32以后,开发了一个双通道的ADC数据采集系统。为了让它每隔一段时间自动采集一组数据,利用RTC设计了一个闹钟。但后来测试发现误差奇大,隔天竟然误差40多分钟。仔细检查后发现是RTC的时钟源配置出了问题。记录一下,以免再犯。

初始时钟配置

驱动程序是基于STM32CubeIDE开发的,最初的时钟配置如下:

图1. 最初的时钟配置

为了让ADC尽可能的以最高频率工作,配置时钟时直接在的位置输入了ADC容许的最高时钟频率,14MHz,然后让系统自动配置时钟。结果如图1所示。可以看到,总线时钟被配置为了56MHz(位置)。由于内部时钟源HSI最高只有8MHz,不能满足要求,所以选择的是HSE作为时钟源,各倍频/分频器是按总线时钟自动 配置的。但从左上角(位置)RTC区的时钟仍为LSI,这是一个RC振荡器,精度不高,而且频率易随温度等影响而波动。这就导致了RTC计时的误差。

纠正错误

为了改善RTC的精度,只需通过RTC Clock Mux将RTC时钟源切换到LSE或HSE/128即可。这两个是外部晶振源,精度极高。如果不用LSE,可以重配置RCC,将这个晶振关掉。

配置完成后点击工具栏上的小齿轮图标,更新代码。更新前后SystemClock_Config函数中RTC相关的时钟配置代码分别如图2和图3所示:

图2. 修改前,RTC时钟源确实是LSI

图3. 修改为HSE的128分频

总结

如果发现RTC时钟不准,首先要排除时钟源的问题。经实测,LSI的误差每分钟大约是2.69s,超过4%。OMG!这就是RC振荡器的精度!晶振时钟再差也不会差到这种程度。这种程度的误差,用示波器去分析频率能够诊断出来吗?没试过。

改了外部晶振以后,RTC精度没问题了。跑了2天多了,误差可以忽略。

时钟   原因   RTC
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章