一、问题
项目中数据报文收到的RTC时间总是会慢一些,经过实际几天的测试得出结论:24小时要慢5S左右。根据手册我了解到可以有误差但不会差这么多,所以进行了如下分析并解决问题。
二、分析
1.影响RTC准确性的因素罗列
· 硬件基础误差(也就是待校准部分) -- 校准解决
· 软件复位误差(复位一次大概会慢不到1S) -- 校准解决
· 晶振受温度影响带来的误差 -- 动态温度补偿
下面针对各项误差进行逐一解决
2.RTC配置-STM32CubeMX
我使用的RTC时钟源采用外部低速的32.768kHz晶振,通过异步分频器的128分频和同步分频器的256分频,最终得到ck_spre = 32768/128/256=1Hz。
3.RTC框图
由上图可知,RTC有一个精密校准功能,同时RTC可以输出RTC_CALIB,也就是我们在配置界面所添加的Calibration功能,配置完后,可以在输出引脚用示波器测量频率1 Hz 时钟输出。那么接下来我们着重说一下配置精密校准方式,也是困惑我好几天的一个点。
3.RTC精密数字校准
精密校准就是直接在RTC的时钟源,对一个周期内(一般为32s)的RTC时钟个数,进行增加和/或减少单独的 RTCCLK 脉冲,从而实现频率校正。
阅读参考手册中的一些内容,第一遍我并没有看明白啥意思,然后我开始研究相关函数,经过查找,确定了两个有关系的函数:平滑校准函数和同步移位控制函数。
第一个函数:平滑校准函数
研究这个函数时我没读明白英文的意思,其实就是不明白后边两个参数到底要干嘛,于是我参考上图参考手册的说明,明白了大概说的是一个意思:可调块,也可调慢。这正是我想要的功能,那接下来就是研究如何调。继续阅读我理解到:
第三个参数(CALP):SmoothCalibPlusPulses ,选SET就是调快512个RTCCLK,选RESET就是不调快。
第四个参数(CALM):SmoothCalibMinusPulsesValue,这个参数就是需要调慢的具体数值,取值范围是0-0x1FF。
/**
* @brief Set the Smooth calibration parameters.
* @param hrtc RTC handle
* @param SmoothCalibPeriod Select the Smooth Calibration Period.
* This parameter can be can be one of the following values :
* @arg RTC_SMOOTHCALIB_PERIOD_32SEC: The smooth calibration period is 32s.
* @arg RTC_SMOOTHCALIB_PERIOD_16SEC: The smooth calibration period is 16s.
* @arg RTC_SMOOTHCALIB_PERIOD_8SEC: The smooth calibration period is 8s.
* @param SmoothCalibPlusPulses Select to Set or reset the CALP bi