链接:https://pan.baidu.com/s/17l_nwhnSAKrhSEXSqqfLzA?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位数据都用来存放秒数,可以计数上百年,直接用作万年历未尝不可。
转变一下思路,可以在代码逻辑中计算并累加前后两次RTC计数的偏差值。如此即使n天后RTC计数溢出了x次,只要代码逻辑在不断执行,不断累加偏差,就可以一直计数万年历。什么时候执行逻辑,什么时候才会计算、累加偏差获取最新时间,所以会有一些计算造成的延迟。
V208的使用中也有如下特性顺水推舟:
①V208有40多个16位后备寄存器,其与RTC寄存器使用同样的VBAT电源。只要VBAT不掉电,后备寄存器中的数值就可以一直保存,不受各种复位影响,可以用作万年历计数的存储单元。如果VBAT也掉电了,后备寄存器数据丢了怎么办?VBAT掉电后RTC也无法工作,那么无论如何都是需要重新由外部输入来校准时间的。
②TMOS系统本身的时钟时以24h为单位循环的,是小于3+天的溢出周期的,且TMOS要求24h内必须留有一个TMOS事件来保持MCU的唤醒能力防止睡眠后没有途径能够唤醒MCU。也就是说可以直接使用TMOS事件安排万年历计数累加周期,将万年历计算的优先级安排到最低也可以将其作为TMOS系统24h内的保留事件来执行,确保其至少每天更新一次时间。
标签:万年历,RTC,32K,晶振,计数,CH32V208,BLE,V208 From: https://www.cnblogs.com/JayWellsBlog/p/18024727