实时时钟在嵌入式系统中往往是必不可少的功能模块,比如水表、电表、手表、玩具等,而时钟的功能就是计时,其准确度,走时误差是重要的衡量指标。尽管硬件设计阶段会尽可能的保证RTC的时钟源的精确度,但是在生产环节,使用环节,往往还存在很多的不确定因素,比如温度的变化,这将导致RTC的误差增大,有时一月可能会差上几分钟甚至几十分钟,导致产品的时钟功能失去意义。

值得庆幸的是中科芯32位MCU CKS32F103x8的实时时钟(RTC)包含了一个非常特殊的功能,通过配置寄存器BKP_RTCCR的CAL[6:0]可以减慢RTC,该校准值表示在每 220个时钟脉冲内将有多少个时钟脉冲被跳过。这可以用来对RTC进行很精确的校准,以1000000/220ppm的比例减慢时钟, RTC时钟可以被减慢0~121ppm。

通过综合石英晶体振荡器的温度特性,在保证每月时钟误差的范围内,设置CAL的值进行不同温度阶段的时差调整比起调节匹配电容具有更大的灵活性和准确度。如下为某石英晶体振荡器的温度与精度曲线:


在CKS32F103x8中通过寄存器BKP_RTCCR的CAL进行RTC快慢调整可以从220个时钟脉冲中跳过0~127个时钟周期,其原理如下:


可以看出RTC的时钟源不再是LSE的32.768kHz石英晶体振荡器的频率,而是经过CAL[6:0]删减过的时钟,由于该功能只能减慢RTC,所以对于本来RTC就慢的是起不到作用的,所以应用此功能时需要在硬件上故意将RTC调快一些或者改变RTC的时钟分频值(比如将32768分频改为32766分频)。

官方也提供了非常方便的库函数操作,当确定了CAL[6:0]的值后可以通过如下调用进行更改:

void BKP_SetRTCCalibrationValue(u8 CalibrationValue);

通过该种方式,对于RTC走时误差在0~314秒/月的范围内均可精确调整。