首页 > 其他分享 >CH32V208在BLE代码中实现万年历

CH32V208在BLE代码中实现万年历

时间:2024-02-24 11:11:24浏览次数:37  
标签:万年历 RTC 32K 晶振 计数 CH32V208 BLE V208

目录

链接: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

相关文章

  • C# 的浮点类型 float double 和十进制类型 decimal
    //浮点型数据floatdouble(双精度)//floatf=1.1;//ps:写小数的时候只要后面没有加上f/F默认是double类型//正确的定义doubled=1.1;floatf=1.1F;floatf1=1f;//f=d;//ps......
  • 面试官:你知道Comparable 和 Comparator 的区别吗?我:巴拉巴拉
    写在开头面试官:“我们在Java的集合和数据结构中都离不开比较器,请你聊一聊Comparable和Comparator这两种的区别吧”内心活动:“上来就这么直接吗,那些ArrayList,HashMap都不问呀,好,既然如此,那让我来征服你吧,面试官大人!”我:“好滴!巴拉巴拉~”ComparableComparable是java.lang包......
  • 3D Slicer编译错误:Variable Slicer_WC_LAST_CHANGED_DATE is expected to be defined.
    3DSlicer编译错误:VariableSlicer_WC_LAST_CHANGED_DATEisexpectedtobedefined. 解决:1、找到SlicerMacroExtractRepositoryInfo.cmake路径:F:\1_Slicer\CMake\SlicerMacroExtractRepositoryInfo.cmake2、添加 set(${wc_info_prefix}_WC_LAST_CHANGED_DATE"0000-00......
  • Linear-Time Graph Neural Networks for Scalable Recommendations
    目录概符号说明MotivationLTGNN代码ZhangJ.,XueR.,FanW.,XuX.,LiQ.,PeiJ.andLiuX.Linear-timegraphneuralnetworksforscalablerecommendations.WWW,2024.概在大图上的一种高效的训练方式.符号说明\(\mathcal{V}\),nodeset;\(\mathcal{E}\),edg......
  • vue3+elementplus+table动态列
    思路1.colsArr,用来渲染列表。dataList,用来渲染行数据2.循环colsArr,生成el-table-column3.数据格式如下colsArr:[{colName:'排名',key:'cols0'},{colName:'区域',key:'cols1'},{colName:&#......
  • Python打开https链接报错:unable to get local issuer certificate
    Python打开https链接报错:unabletogetlocalissuercertificate或安装Python3.10以上版本,需要openssl1.1.1以上版本,会导致openssl下面缺少证书,记录下安装方法问题描述:当使用urllib.urlopen打开一个https链接时抛出如下异常:urllib.error.URLError:<urlopenerror[SSL:......
  • const与mutable关键字
    1异步操作,使用lambda表达式,参数采用传值方式;window直接修改传输参数的值,并打印使用正常;linux报错:errorpassingconst**asthisargumentof**discardsqualifier[-fpermissive]const关键字用于类的成员函数,成为常成员函数,即:不允许在常成员函数的内部(实现里)修改......
  • 【Unity】ScriptableObject使用之后,重新打开Unity会报错
    导致问题出现的原因:ScriptableObject的类与其他类放一起了具体请见:unity2020.3官方文档ScriptableObject部分解决方法:为ScriptableObject单独创建一个c#脚本,并将c#名称与ScriptableObject类名保持一致。猜测出现这样的原因,如果哪里不对烦请大佬指正一下:Unity中基本上都是会通......
  • flowable清除表数据
    `DELETEFROMACT_RU_JOB;DELETEFROMACT_RU_VARIABLE;DELETEFROMACT_RU_DEADLETTER_JOB;DELETEFROMACT_GE_BYTEARRAY;DELETEFROMACT_RU_IDENTITYLINK;DELETEfromACT_RU_TASK;DELETEFROMACT_RU_EXECUTION;DELETEFROMACT_RE_DEPLOYMENT;DELETEFROMACT_......
  • Visual Studio 2022 .Net 8 启用AOT publish enabled 发布失败
    .Net8NativeAOT的优势: 我使用VisualStudio2022创建了一个面向.NET8的控制台应用程序。我在创建项目时选中了启用本机AOT发布选项。它给出了以下错误: 错误文本:发布遇到错误。发布遇到错误。我们无法确定错误的原因。检查输出日志以获取更多详细信息。诊断......