RTC #################### .. toctree:: :maxdepth: 3 :caption: 目录: 简介 ---- Nuclei RTC(实时时钟)提供自动唤醒功能来管理所有低功耗模式。 实时时钟是一个独立的定时器。RTC提供一组连续运行的计数器,配合适当的软件,可以提供时钟-日历功能。计数器值可以写入以设置系统的当前时间/日期。 RTC还包括一个具有中断能力的周期性可编程唤醒标志。 主要特性 ---------- RTC的主要特性如下: * 可编程预分频器:分频因子最高可达2^20 * 64位可编程计数器,用于长期测量 * 两个独立的时钟: - ICB时钟用于ICB接口 - RTC时钟用于RTC核心 * 两种独立的复位类型: - ICB接口由icb_rstn复位 - RTC核心(预分频器、告警、计数器和分频器)由rtc_rstn复位 * 三个专用的可屏蔽中断线: - 告警中断,用于生成软件可编程的告警中断 - 秒中断,用于生成具有可编程周期长度的周期性中断信号 - 溢出中断,用于检测内部可编程计数器滚回到零的情况 * 数字校准电路(周期性计数器校正),在几秒钟的校准窗口内获得 功能描述 ---------- RTC由两个主要单元组成(参见RTC框图)。第一个单元(ICB接口)用于与ICB总线接口。该单元还包含一组32位寄存器,可从ICB总线以读或写模式访问。 另一个单元(RTC核心)由可编程计数器链组成,包含两个主要块。第一个块是RTC预分频器块,它生成RTC时基TR_CLK(TR_CLK由RTC_CLK分频器生成),可编程为最长1秒的周期。它包括一个20位可编程分频器(RTC预分频器)。每个TR_CLK周期,如果在RTC_CRH寄存器中启用,RTC会生成一个中断(秒中断)。第二个块是一个64位可编程计数器,可以初始化为当前系统时间。系统时间以TR_CLK速率递增,并与可编程日期(存储在RTC_ALR寄存器中)比较,以生成告警中断(如果在RTC_CRH控制寄存器中启用)。 .. figur/assets/images/ip/nuclei_rtc_doc/images/RTC_block_diagram.jpg :alt: RTC框图 :align: center 图 6.1: RTC框图 注意: * SECOND_IRQ/OVERFLOW_IRQ/ALARM_IRQ接口是icb_clk域 * SECOND_EVENT/OVERFLOW_EVENT/ALARM_EVENT接口是rtc_clk域 配置RTC寄存器 ~~~~~~~~~~~~~~ 要写入RTC_PRL、RTC_CNT、RTC_ALR、RTC_CALR寄存器,外设必须进入配置模式。这通过设置RTC_CRL寄存器中的CNF位来完成。 配置程序: 1. 设置CNF位进入配置模式 2. 写入一个或多个RTC寄存器 3. 清除CNF位退出配置模式 RTC标志置位 ~~~~~~~~~~~~ RTC秒标志(SECF)在RTC计数器更新之前的每个RTC核心时钟周期置位。 RTC告警和RTC告警标志(ALRF)在计数器达到存储在告警寄存器中增加1的RTC告警值(RTC_ALR + 1)之前的最后一个RTC核心时钟周期置位。 .. figur/assets/images/ip/nuclei_rtc_doc/images/rtc_alarm.JPG :alt: RTC秒和告警波形示例 :align: center 图 6.2: RTC_PR(RTC_PRL)=0x3, RTC_ALARM=0x4时的RTC秒和告警波形示例 RTC溢出标志(OWF)在计数器达到0xFFFF_FFFF_FFFF_FFFF之前的最后一个RTC核心时钟周期置位。 .. figur/assets/images/ip/nuclei_rtc_doc/images/rtc_owf.JPG :alt: RTC溢出波形示例 :align: center 图 6.3: RTC_PR(RTC_PRL)=0x3时的RTC溢出波形示例 RTC平滑数字校准 ~~~~~~~~~~~~~~~~ RTC频率可以数字校准,频率校正使用一系列小调整(添加或减去单个RTC_CLK脉冲)来执行。这些调整分布相当均匀,使得即使在短时间内观察,RTC也能得到良好的校准。 平滑数字校准在大约2^24个RTC_CLK脉冲的周期内执行,当输入频率为32768 Hz时为512秒。该周期由24位计数器win_cnt[23:0]维护,由RTC_CLK时钟。 平滑校准寄存器(RTC_CALR)指定在512秒周期内要屏蔽或添加的RTC_CLK时钟周期数: * 设置位RTC_CALR[31]为1会在512秒周期内屏蔽或添加确切的脉冲数 * 设置RTC_CALR[30:15],这是RTC_CLK时钟周期数的整数部分(屏蔽或添加) * 设置RTC_CALR[12:0],这是RTC_CLK时钟周期数的小数部分(屏蔽或添加) 中断 ------ RTC中断请求如下表所示: .. list-table:: 表 7.1: RTC中断请求 :header-rows: 1 :widths: auto * - 中断事件 - 使能控制位 * - RTC_SECOND - RTC_CRH[0] * - RTC_ALARM - RTC_CRH[1] * - RTC_OVERFLOW - RTC_CRH[2] 中断映射如下图所示: .. figur/assets/images/ip/nuclei_rtc_doc/images/RTC_interrupt.jpg :alt: RTC中断映射图 :align: center 图 7.1: RTC中断映射图 寄存器 -------- 寄存器描述 ~~~~~~~~~~~~ RTC寄存器 ^^^^^^^^^^^^^^^^^^^ RTC中的寄存器和相应的偏移如下表所示: .. list-table:: 表 8.1: RTC寄存器的偏移地址 :header-rows: 1 :widths: auto * - 偏移 - 寄存器名称 - 功能描述 * - 0x0 - RTC_CRH - RTC控制寄存器高位 * - 0x4 - RTC_CRL - RTC控制寄存器低位 * - 0x8 - RTC_PRL - RTC预分频器寄存器 * - 0xC - RTC_DIV - RTC预分频器计数器寄存器 * - 0x10 - RTC_CNTH - RTC计数器寄存器高位 * - 0x14 - RTC_CNTL - RTC计数器寄存器低位 * - 0x18 - RTC_ALRH - RTC告警寄存器高位 * - 0x1C - RTC_ALRL - RTC告警寄存器低位 * - 0x20 - RTC_CALR - RTC校准寄存器低位 * - 0x24 - RTC_VERSION - IP版本 RTC_CRH ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x0 .. list-table:: 表 8.2: RTC_CRH格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - SECIE - 0 - RW - 0x0 - - 秒中断使能 - 1'b0:禁用秒中断 - 1'b1:使能秒中断 * - ALRIE - 1 - RW - 0x0 - - 告警中断使能 - 1'b0:禁用告警中断 - 1'b1:使能告警中断 * - OWIE - 2 - RW - 0x0 - - 溢出中断使能 - 1'b0:禁用溢出中断 - 1'b1:使能溢出中断 * - CALIBRATION - 3 - RW - 0x0 - - 校准使能 - 1'b0:RTC 平滑数字校准禁用 - 1'b1:RTC 平滑数字校准使能 * - Reserved - 31:4 - / - 0x0 - / RTC_CRL ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x4 .. list-table:: 表 8.3: RTC_CRL格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - SECF - 0 - W0C - 0x0 - - 秒标志 - 该位由硬件设置,当 32 位可编程预分频器溢出时递增 RTC 计数器 - 若 RTC_CRH.SECIE=1 则生成中断;只能由软件清除;写 "1" 无效果 - 1'b0:秒标志条件未满足 - 1'b1:秒标志条件满足 * - ALRF - 1 - W0C - 0x0 - - 告警标志 - 64 位可编程计数器达到 RTC_ALRL/RTC_ALRH 设置的阈值时置位 - 若 RTC_CRH.ALRIE=1 则生成中断;只能由软件清除;写 "1" 无效果 - 1'b0:未检测到告警 - 1'b1:检测到告警 * - OWF - 2 - W0C - 0x0 - - 溢出标志 - 64 位可编程计数器溢出时置位;若 RTC_CRH.OWIE=1 则生成中断 - 只能由软件清除;写 "1" 无效果 - 1'b0:未检测到溢出 - 1'b1:发生 64 位可编程计数器溢出 * - Reserved - 3 - / - 0x0 - / * - CNF - 4 - RW - 0x0 - - 配置标志 - 置位进入配置模式以允许写 RTC_CNT/RTC_ALR/RTC_PRL;清零后执行写 - 1'b0:退出配置模式(开始更新 RTC 寄存器) - 1'b1:进入配置模式 * - RTOFF - 5 - RO - 0x1 - ICB 数据同步到 rtc 时钟域完成 * - Reserved - 31:6 - / - 0x0 - / RTC_PRL ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x8 .. list-table:: 表 8.4: RTC_PRL格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - PRL - 19:0 - RW - 0x8000 - - 时钟预加载值(预分频器重载值高位) - fTR_CLK = fRTC_CLK/(PRL[19:0] + 1) * - Reserved - 31:20 - / - 0x0 - / 注意:此寄存器具有写保护机制,需要先设置04寄存器 RTC_DIV ^^^^^^^^^^^^^^^^^^^ 地址偏移:0xC .. list-table:: 表 8.5: RTC_DIV格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DIV - 31:0 - RO - 0x0 - RTC 预分频器计数值回读 RTC_CNTH ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x10 .. list-table:: 表 8.6: RTC_CNTH格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - CNTH - 31:0 - RW - 0x0 - - RTC 计数器高位 - 读取返回计数器高位当前值;写入需进入配置模式 注意:此寄存器具有写保护机制,需要先设置04寄存器 RTC_CNTL ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x14 .. list-table:: 表 8.7: RTC_CNTL格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - CNTL - 31:0 - RW - 0x0 - - RTC 计数器低位 - 读取返回计数器低位当前值;写入需进入配置模式 注意:此寄存器具有写保护机制,需要先设置04寄存器 RTC_ALRH ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x18 .. list-table:: 表 8.8: RTC_ALRH格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - ALRH - 31:0 - RW - 0x0 - - RTC 告警高位 - 写入需进入配置模式 注意:此寄存器具有写保护机制,需要先设置04寄存器 RTC_ALRL ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x1C .. list-table:: 表 8.9: RTC_ALRL格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - ALRL - 31:0 - RW - 0x0 - - RTC 告警低位 - 写入需进入配置模式 注意:此寄存器具有写保护机制,需要先设置04寄存器 RTC_CALR ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x20 .. list-table:: 表 8.10: RTC_CALR格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - CLK_CYCLE_STEP - 12:0 - RW - 0x0 - - 基于时序窗口整数部分(2^24 周期)为每个指定数量的 RTCCLK 周期屏蔽或插入一个 rtc_clk 周期 * - Reserved - 14:13 - / - 0x0 - / * - CLK_CYCLE_DELTA - 30:15 - RW - 0x0 - - 基于时序窗口小数部分(2^24 周期)为每个指定数量的 RTCCLK 周期屏蔽或插入一个 rtc_clk 周期 * - SIGN_BIT - 31 - RW - 0x0 - - 插入或屏蔽 rtc_clk 周期 - 1'b0:在时序窗口中插入一个 rtc_clk 周期 - 1'b1:在时序窗口中屏蔽一个 rtc_clk 周期 注意:此寄存器具有写保护机制,需要先设置04寄存器 RTC_VERSION ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x24 .. list-table:: 表 8.11: RTC_VERSION格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - VERSION_NUM - 31:0 - RO - 0x0001_0202 - RTC 的 IP 版本