跳转至

实时时钟(RTC)


1、简介

RTC(Real Time Clock,实时时钟)是一个独立的32位定时计数器,可在低功耗模式下持续计数,用于提供长时间计时能力。RTC计数时钟可选择内部RC32K或外部OSC32K晶振,通过分频配置可实现秒级计数。

CI14LP的RTC特性:

  • 32位计数器,最大计数0xFFFFFFFF
  • 计数时钟可选:内部RC32K / 外部32K晶振
  • 可编程分频值(如时钟32.768K,分频值配32768,则1个count表示1秒)
  • 支持计数到中断匹配值产生中断(秒级闹钟)
  • 支持卷绕(roll)模式配置:卷绕后从0或起始值重新计数、卷绕最大值为0xFFFFFFFF或中断匹配值

2、API

函数名 描述
rtc_init RTC初始化(结构体配置时钟/分频/起始值/中断匹配值等)
rtc_start 启动RTC计数
rtc_stop 停止RTC计数
rtc_set_roll_mode 卷绕模式设置
rtc_set_start_count 设置计数起始值(单位:秒)
rtc_set_irq_count 设置中断匹配值(单位:秒)
rtc_get_count 读取当前计数值(单位:秒)
rtc_clear_irq 清除RTC中断
rtc_irq_mask_config RTC中断屏蔽配置
rtc_get_irq_raw_status 获取原始中断状态
rtc_get_irq_mask_status 获取屏蔽后中断状态

3、关键类型

类型 说明
rtc_clk_sel_t 计数时钟:RTC_CLK_INNER_32K(内部32K)、RTC_CLK_EXT_32K(外部32K)
rtc_roll_start_t 卷绕起始:RTC_ROLL_START_ZERO(从0开始)、RTC_ROLL_START_COUNT(从计数起始值开始)
rtc_roll_max_t 卷绕最大值:RTC_ROLL_MAX_FFFFFFFF(计满0xFFFFFFFF卷绕)、RTC_ROLL_MAX_IRQ_COUNT(到中断匹配值卷绕)
rtc_init_t 配置结构体:clk_select、rtc_div(分频值)、start_count(起始值,秒)、irq_count(中断匹配值,秒)、roll_start_mode、roll_max_mode、irq_mask

RTC_1_SECONDS(1)为计时1s的配置值。


4、示例

1) 以下代码配置RTC每1秒产生一次中断(秒中断):

#include "ci14lp_rtc.h"
#include "ci14lp_scu.h"

void rtc_demo(void)
{
    rtc_init_t init;

    //RTC时钟选择外部32K晶振
    scu_rtc_clk_select(SCU_RTC_CLK_EXT_OSC32K);

    init.clk_select     = RTC_CLK_EXT_32K;
    init.rtc_div        = 32768;    //32.768K分频32768,1个count为1秒
    init.start_count    = 0;        //从0开始计数
    init.irq_count      = 1;        //计数到1秒产生中断
    init.roll_start_mode = RTC_ROLL_START_COUNT;  //卷绕后从起始值开始
    init.roll_max_mode   = RTC_ROLL_MAX_IRQ_COUNT;//到中断匹配值卷绕
    init.irq_mask       = DISABLE;  //中断不屏蔽

    rtc_init(init);
    rtc_start();
}

2) RTC中断处理函数示例:

#include "ci14lp_rtc.h"

void RTC_IRQHandler(void)
{
    uint32_t count = 0;

    rtc_get_count(&count);
    mprintf("rtc count: %d s\n", count);
    rtc_clear_irq();
}

3) 以下代码配置RTC实现定时唤醒闹钟(如5分钟后唤醒):

#include "ci14lp_rtc.h"

void rtc_alarm_demo(void)
{
    rtc_init_t init;

    init.clk_select      = RTC_CLK_EXT_32K;
    init.rtc_div         = 32768;
    init.start_count     = 0;
    init.irq_count       = 5 * 60;   //5分钟(300秒)
    init.roll_start_mode = RTC_ROLL_START_COUNT;
    init.roll_max_mode   = RTC_ROLL_MAX_IRQ_COUNT;
    init.irq_mask        = DISABLE;

    rtc_init(init);
    rtc_start();

    //可配合低功耗sleep模式,RTC中断作为唤醒源
}

5、其它

  • 对时间精度有要求的场合(如时钟日历),建议选择外部32K晶振;内部RC32K存在±2%左右偏差,仅适用于对精度不敏感的计时。
  • RTC中断可作为低功耗sleep模式的唤醒源,配合系统低功耗方案使用,参见系统API-低功耗方案说明。
  • RTC计数值为秒计数(分频值正确配置的前提下),需要日期时间换算由应用层完成。

6、API 参考

本模块接口声明于 driver\ci14lp_chip_driver\inc\ci14lp_rtc.h,实现位于 driver\ci14lp_chip_driver\src\ci14lp_rtc.c。