CH32V208在BLE代码中实现万年历
链接: https://pan.baidu.com/s/1N2sTgsbTwWQnLHRzR2iZFw?pwd=wch6
提取码: wch6
在使用CH32V208实现万年历功能时,有以下几点特性需要注意
①V208在跑BLE时,RTC分频默认配置为2分频约16K,无法配置为32768分频也就是1Hz。若配置为1Hz,TMOS系统的时钟会很慢,跑不起来。
②V208没有设计类似CH582的年/月/日寄存器,只有总计32位的RTC计数器。配合①中的特性,32位数在计满3天多一点点时就会溢出重新计数。
③跑BLE功能,要做低功耗的场景多。V208的HAL_SLEEP休眠是使用的“停止模式”的低功耗休眠,休眠期间HSI、HSE都停止工作,没有办法继续计数,只能依靠后备寄存器中的32K时钟源的RTC来保证万年历的持续计数。注意MCU的VBAT要一直保持供电,一旦彻底断电,RTC计数也不跑了,就需要重新校时。
④V208内部没有32K的负载电容,一定要在32K晶振附近预留电容焊盘。
在在实现万年历前,最好先校准32K的频偏;或者先跑跑EVT中的RTC例程(将分频调节为BLE一致的2分频),获取当前硬件偏差以便后续调试代码造成的偏差。在有高精度的外部仪器校准的情况下,先选用高精度的外部仪器进行校准;没有外部设备时,V208的32M晶振物料一般建议选用精度更高的,可以用32M晶振去校准32K晶振的偏差。
V208的官方评估板的物料选择:
32K晶振:20ppm/12.5pf,建议外部焊接8~15pf的32K晶振负载电容。PCB板走线有不确定的数个pf的寄生电容,需要更准一些的话可以多换几组电容实测看看。
32M晶振:10ppm/12pf,V208内部有32M的负载电容可供微调。
压缩包中有RTC文件夹下的工程,可以打印出32K晶振相对于32M晶振的频偏ppm,可以作为外部负载电容调节效果的参考。
开篇链接中万年历代码的逻辑,主要是为了解决特性②即32位的RTC计数在BLE应用下计满3+天便会溢出重新计数的问题。如果32位数据都用来存放秒数,可以计数上百年,那么直接用作万年历未尝不可。
好在V208有40多个16位后备寄存器,后备寄存器与RTC寄存器使用同样的VBAT电源。只要VBAT不掉电,后备寄存器中的数值就可以一直保存,不受各种复位影响,可以用作万年历计数的存储单元。那么加上代码逻辑,累加前后两次RTC计数的偏差值,将RTC中的计数累加到后备寄存器中,即可实现万年历。
代码使用注意点:
①如果VBAT也掉电了,后备寄存器数据丢了怎么办?VBAT掉电后RTC也无法工作,那么无论如何都是需要重新由外部输入来校准时间的。
②两次调用获取当前时间的接口,时间间隔不要大于3天。如果两次调用的时间间隔,RTC溢出了n次,那么大约n*3天的时间会丢失。建议至少每天要执行一次万年历计算的事件。
③关于延迟,本篇不做详细测算,有如下几个环节需要注意:Ⅰ.例程中是使用BLE校准时间,收发包期间会产生一定的延迟。Ⅱ.何时执行逻辑,何时才会计算、累加偏差获取最新时间,会有一些计算/串口打印造成的延迟。