【Zynq UltraScale+ MPSoC解密学习8】Zynq UltraScale+的RTC

目录

一、介绍

二、功能描述

2.1 RTC操作

2.2 原理图

​ 2.3 接口和信号

2.4 秒计数器

三、时钟校准

四、RTC寄存器

 五、配置步骤

5.1 初始化RTC步骤

5.2 设置时间


一、介绍

实时时钟(RTC)单元为整个系统和应用软件提供了一个精确的时间基准。为了提升时钟精度,RTC还包括校准电路,用来抵消温度和电压波动。
RTC由VCC_PSAUX或VCC_PSBATT供电。当VCC_PSAUX(辅助电源)可用时,RTC使用它来保持计数器工作。当VCC_PSAUX不可用时,RTC会自动切换到VCC_PSBATT电源。
RTC模块有以下特点:
•使用辅助或电池电源进行持续的操作
•警报设置和定期中断
•复杂的校准电路,具备高精度计时功能
•32位秒计数器代表136年的时间
•三个计数器: 32位秒计数器、16位tick计数器测量基于32 KHz晶振的秒、用于校准的4位分式计数器。


二、功能描述

2.1 RTC操作

RTC每秒钟会向GICs 、GIC代理、PL生成两个系统中断信号,有报警事件发生时也会产生。所有的系统处理器都可以使用周期性的秒计数中断,报警控制则必须在处理器的系统级上进行管理。

2.2 原理图

以下两图显示了RTC控制器的系统级原理图。RTC功能分为三个主要模块。
•RTC控制寄存器:在低功耗领域(LPD)内实现,包含与RTC控制器相关的所有寄存器。
•RTC计数器模块:包含所有计数器、校准逻辑和用于保留电池电源域(BPD)编程时间和校准信息的锁存器。它还包括以下功能:
(1)晶振相关接口,也运行在BPD
(2)以秒为单位进行时间维护
(3)包含校准电路,通过使用具有任意静态误差的晶振来计算一秒的最大百万分之一误差
(4)通过软件维护用于回读和校准的预编译时间
(5)维持振荡器和电源开关电路使用的控制值
•晶振:提供使用GPIO实现的RTC时钟。电源由RTC计数器模块提供。
 


 2.3 接口和信号

RTC和LPD逻辑的接口包括以下功能:
(1)通过APB接口来访问控制器和RTC计数器中的寄存器。该接口由LPD_LSBUS_CLK进行计时。
(2)报警逻辑,包括报警寄存器。
(3)中断状态,中断掩码,中断使能,中断禁用寄存器来管理秒中断和报警中断。
(4)RTC控制寄存器使能晶振,控制RTC的电源。
SET_TIME_WRITE、CALIB_WRITE和CURRENT_TIME寄存器都是在电池供电的RTC中实现的,但是通过LPD中的APB接口进行访问。
控制器逻辑还包括ALARM报警寄存器和报警生成逻辑。只要RTC中的秒计数器的值和加载到报警寄存器中的值匹配,并且启用了警报中断,就会生成RTC_Alarm系统中断。
RTC控制寄存器通过LPD中的APB接口进行编程,并保留在电池供电域中,因为它是RTC操作所必需的。

2.4 秒计数器

秒计数器是一个32位的同步计数器,用来保存来自特定参考点的秒数。最开始,通过操作系统的时钟设备驱动程序计算当前时间,该驱动程序基于从参考点经过的秒数。这个当前时间值通过时间设置寄存器编程到RTC计数器中,时间设置寄存器用于初始化秒计数器。在此之后,秒计数器每秒钟计时一次,增加并保持更新当前时间。然后RTC控制器通过接口读取当前时间。
对于每个振荡时钟周期,tick计数器中的值和存储在校准寄存器中的值进行比较,一旦这些值匹配,tick计数器将重置为零并生成一个中断。
来自RTC计数器的中断信号在一个osc_rtc_clk时钟周期后被断言,并且只能在时钟上升沿时触发捕获。时钟设备驱动程序可以使用来自RTC计数器的后续中断来计算时间和日期。


三、时钟校准

用于重置tick计数器的清除信号可以通过与分数校准值一起工作的逻辑进行扩展/延迟,从而提供分数tick调整。更具体地说,分数计数器是通过对tick计数器断言其扩展清除信号来对其清除功能保持判断状态。
振荡器中的任何误差都可以在几分之一秒内通过调整校准值来补偿,其余误差的影响可以通过分数计数器来补偿。每16秒,积累的误差可以用0~16ticks来表示,该值记录在校准寄存器的分式校准段中。然后每过16秒,分数计数器会从0增长到这个值,在此期间,分数计数器时刻对tick计数器的clear信号保持着断言。当分数比较器发现分数计数器的值增长到等于最大分数校准值时,会立刻释放tick计数器的清除信号,然后分数计数器重新又重新计数。


四、RTC寄存器


 五、配置步骤

5.1 初始化RTC步骤

(1)校准寄存器CALIB_WRITE写入0x0019_8231h
(2)将振荡器设置为晶体,使能控制寄存器CONTRL中的电池开关
(3)清除中断状态寄存器RTC_INT_STATUS中的中断状态
(4)在中断禁用寄存器RTC_INT_DIS中禁用所有中断。

5.2 设置时间

通过配置SET_TIME_WRITE寄存器来实现所需的日期和时间值(以秒为单位)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章