实时时钟(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。