【沁恒微CH32V307评估板试用体验】RTC时钟同步(1) - RISC-V MCU技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

崔建峰 关注 私信
[文章]

【沁恒微CH32V307评估板试用体验】RTC时钟同步(1)

  • 本来应该早就发试用帖出来,但奈何这阵子工作一直比较忙,好在论坛小优给了一次又一次机会,在此表示感谢
  • 这是一个长贴,我试着完成一个有意义的功能。其中涉及到多个外设的应用,因此,后续一步步完善,分成几部分来上传。

网上针对CH32V307评估板RTC时钟应用已有大侠进行了不错的解析,其实RTC时钟的编程相对简单,因为有完善的库函数和样例进行支撑,但RTC时钟用在什么地方,如何去应用有不少朋友并不太了解。大家常做的一点就是做一个万年历。然而,万年历用CH32V307进行实现有点儿大材小用。像这样一个外设资源丰富的芯片,尤其具有青稞 V4F 内核、硬件浮点运算支持、64K SRAM、256K 闪存、2个独立ADC、8通道U(S)ART、3通道SPI、2通道I2C、1路USBHS(+PHY)、2路CAN、1个SDIO接口、1个FSMC接口。如果不用于工业测试控制行业实在有点浪费。

在工业测试领域,一个简单的存储测试系统常用的框架如下图所示:

image.png

存储测试与常见的通用在线测试框架不同,举个简单的例子,平时所见到的PXI-E工业测试系统多数属于在线测试。而我们常说的“黑匣子”(飞行数据记录仪)属于存储测试装置。
image.png
(a) PXI-E工业测试系统
image.png
(b)飞行数据记录仪
图2 通用在线测试与存储测试举例

两者各有优缺,通用在线测试框架便于灵活组装、级联扩展成大型测试系统。而存储测试则用于一个环境恶劣、安装受限、事后分析的测试领域。通用在线测试一般用于产品线下的测试检验;而存储测试则主要用于产品在线运行测试与事后分析。

存储测试系统一个主要的组成是时钟,通常是实时时钟(RTC),用于判断所记录数据的准确时间。对于实时时钟而言,一个重要功能就是“对表”。只有嵌入式存储测试系统的实时时钟准确,所记录的数据意义才更为明确。下面将利用CH32V307实现一个简单的对表功能。

1、RTC功能解析

CH32V307的实时时钟(RTC)是一个 独立定时器模块 ,其可编程计数器最大可达到32 位,配合软件即可以 实现实时时钟功能 ,并且可以修改计数器的值来重新配置系统的当前时间和日期。 RTC 模块在后备供电区域,系统复位和待机模式唤醒对其不造成影响

因此,对于CH32V307的实时时钟应用而言,其关键是配置好预分频,预分频重装值,主计数器。

image.png

图3 CH32V307实时时钟功能模块框图

目前使用的是CH32V307评估板进行的测试,它的主晶振用的是扬兴科技8MHz晶振,实时时钟用的是32.768KHz晶振(从CH32V307EVT资源包中的CH32V30xSCH可以查到,沁恒官网下载)。

CH32V307实时时钟相关寄存器配置信息包含《CH32FV2x_V3x 应用手册》的3.3.5节及第6章。其涉及到的寄存器及配置过程如下:

(1)通过配置 RCC_CFGR0 寄存器的PPRE1[2:0]配置 APB1总线的时钟。这些总线时钟决定了挂载在其下面的外设接口访问时钟基准。通过RCC_APB1PCENR、RCC_APB2PCENR 寄存器中各个位可以单独开启或关闭不同外设模块通讯时钟接口。使用某个外设时,首先需要开启其时钟使能位,才能访问其寄存器。

(2)通过设置 RCC_BDCTLR(3.5.9后备域控制寄存器) 寄存器的 RTCSEL[1:0]位,RTCCLK 时钟源可以由 HSE/128、LSE 或 LSI 时钟提供。修改此位前要 保证电源控制寄存器(PWR_CR)中的 DBP 位置 1 ,只有后备区域复位,才能复位此位。

① LSE是系统低速外部晶振,作为 RTC 时钟:由于 LSE 处于后备域由 VBAT供电,只要 VBAT维持供电,尽管 VDD供电被切断,RTC 仍继续工作。

② LSI 是系统内部约 40kHz 的 RC 振荡器产生的低速时钟信号,当它作为 RTC 时钟:如果 VDD供电被切断,RTC 自动唤醒不能保证。

③ HSE是系统高速外部晶振,HSE/128 作为 RTC 时钟:如果 VDD 供电被切断或内部电压调压器被关闭(1.8V 域的供电被切断),则 RTC 状态不确定。

从上面叙述中,显然使用LSE做为RTC时钟是最优选择。因此,在沁恒提供的样例程序中,有以下语句(具体可以对着上面内容去看内部库函数):
image.png
图4 RTC初始化过程1

(3)针对RTC的寄存器进行设置,首先利用RTC_WaitForLastTask函数等待RTC的上一次操作完成,然后应用RTC_WaitForSynchro等待同步标志。
image.png
图5 RTC初始化过程2

(4)利用RTC_ITConfig使能RTC中断,例子中使能的是秒中断。

(5)利用RTC_EnterConfigMode设置RTC进入配置模式。

(6)利用RTC_SetPrescaler设置预分频为32767,此时分频后的时钟为1000.030519Hz,从这个位置可以看出系统秒中断的精度为31ppm,这意味着1天内(24小时)偏差为2.637秒。

(7)利用RTC_Set库函数设置具体年月日等时钟值。通过RTC_Set函数可以看出,整个设置是基于UTC时间进行记录的(即后面用RTC_Get取的时候也按UTC时间去数秒)。所以如果上位机传输的是UTC时间,则可以自己根据RTC_Set函数实现编写直接赋值的函数。

(8)至此,完成了RTC的设置与具体时间给定。

更多回帖

×
发帖