17 实时时钟(RTC)
17.1 功能描述
实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应的软件配置下, 可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。
特性:
- 可配置计数器大小
- 周期性中断包括半秒、秒、分钟、小时和天
- 可编程报警中断
- 硬件数字微调补偿外部时钟源频偏
17.2 使用说明
17.2.2 获取当前时间
使用 RTC_GetTime
获取当前时间,该函数的参数可以读取对应的时、分、秒,
函数的返回值即为RTC使能后所经历的天数 day
。
uint16_t RTC_GetTime(
uint8_t *hour, //时
uint8_t *minute, //分
uint8_t *second //秒
);
17.2.3 修改时间
使用 RTC_ModifyTime
修改当前时间,其中的 day
表示RTC使能后所经过的天数。
void RTC_ModifyTime(
uint16_t day, //天数
uint8_t hour,
uint8_t minute,
uint8_t second
);
修改时间后,需要使用 RTC_IsModificationDone
获取当前修正是否已经同步到RTC时钟域,
返回值为 1
表示已经同步完毕,0
则表示正在更新。
int RTC_IsModificationDone(void);
17.2.4 获取RTC Counter值
使用 RTC_Current
可以获取RTC Counter值的低32bit。
uint32_t RTC_Current(void);
使用 RTC_CurrentFull
可以获取RTC Counter值的全部43bit。
uint64_t RTC_CurrentFull(void);
17.2.5 配置闹钟
使用 RTC_ConfigAlarm
void RTC_ConfigAlarm(
uint8_t hour,
uint8_t minute,
uint8_t second
);
17.2.6 配置中断请求
使用 RTC_EnableIRQ
配置并使能RTC中断请求。
void RTC_EnableIRQ(
uint32_t mask //比特 2 为 1 时使能alarm中断
//比特 3 为 1 时使能day中断
//比特 4 为 1 时使能hour中断
//比特 5 为 1 时使能minute中断
//比特 6 为 1 时使能second中断
//比特 7 为 1 时使能half-second中断
);
RTC支持的中断类型一共6种:
typedef enum
{
= 0x04, //alarm中断
RTC_IRQ_ALARM = 0x08, //day中断
RTC_IRQ_DAY = 0x10, //hour中断
RTC_IRQ_HOUR = 0x20, //minute中断
RTC_IRQ_MINUTE = 0x40, //second中断
RTC_IRQ_SECOND = 0x80, //half-second中断
RTC_IRQ_HALF_SECOND } rtc_irq_t;
上述所提到的六种中断中,alarm中断通过调用 RTC_ConfigAlarm
设定alarm时间,
其余中断的出发时间均是固定的,依次为:1天、1小时、1分钟、1秒钟和半秒钟。
例如使能 RTC 设的alarm中断,并设定alarm时间的01:45:20
(RTC_IRQ_ALARM); RTC_EnableIRQ(0x1,0x2d,0x14); RTC_ConfigAlarm(1); RTC_Enable
例如使能 RTC 的day中断
(RTC_IRQ_DAY); RTC_EnableIRQ(1); RTC_Enable
17.2.8 清除中断
使用 RTC_ClearIntState
清除当前RTC的中断状态。
void RTC_ClearIntState(
uint32_t state //比特 2 为 1 时清除alarm中断
//比特 3 为 1 时清除day中断
//比特 4 为 1 时清除hour中断
//比特 5 为 1 时清除minute中断
//比特 6 为 1 时清除second中断
//比特 7 为 1 时清除half-second中断
);
17.2.9 处理中断状态
用 RTC_GetIntState
获取RTC上的中断触发,返回非 0 值表示 RTC 上产生了中断请求。
RTC产生中断后, 需要消除中断状态方可再次触发。利用 RTC_ClearIntState
可清除RTC的中断触发状态。