RTC时钟详细步骤
RTC概述
简介
RTC (Real Time Clock):实时时钟
- STM32 的 RTC 外设,实质是一个掉电后还继续运行的定时器。RTC是个独立的BCD定时器/计数器。提供一个日历时钟,两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC还包含用于管理低功耗模式的自动唤醒单元。
- 两个32位寄存器包含二进码十进制格式(BCD)的秒,分钟,小时(12或24小时制),星期几,日期,月份和年份。此外,还可以提供二进制的亚秒值。系统可以自动将月份的天数补偿为28,29(闰年),30,31天。并且还可以进行夏令时补偿。
主要特性
- 包含亚秒、秒、分钟、小时(12/24 小时制)、星期几、日期、月份和年份的日历。
- 软件可编程的夏令时补偿。
- 两个具有中断功能的可编程闹钟。可通过任意日历字段的组合驱动闹钟。
- 自动唤醒单元,可周期性地生成标志以触发自动唤醒中断。
- 参考时钟检测:可使用更加精确的第二时钟源(50 Hz 或 60 Hz)来提高日历的精确度。
- 利用亚秒级移位特性与外部时钟实现精确同步。
- 可屏蔽中断/事件:
— 闹钟 A
— 闹钟 B
— 唤醒中断
— 时间戳
— 入侵检测 - 数字校准电路(周期性计数器调整)
— 精度为 5 ppm
— 精度为 0.95 ppm,在数秒钟的校准窗口中获得 - 用于事件保存的时间戳功能(1 个事件)
- 入侵检测:
— 2 个带可配置过滤器和内部上拉的入侵事件 - 20 个备份寄存器(80 字节)。发生入侵检测事件时,将复位备份寄存器。
- 复用功能输出 (RTC_OUT),可选择以下两个输出之一:
RTC_CALIB:512 Hz 或 1 Hz 时钟输出(LSE 频率为 32.768 kHz)。
可通过将 RTC_CR 寄存器中的 COE[23] 位置 1 来使能此输出。该输出可连接到器件 RTC_AF1 功能。
RTC_ALARM(闹钟 A、闹钟 B 或唤醒)。
可通过配置 RTC_CR 寄存器的 OSEL[1:0] 位选择此输出。该输出可连接到器件
RTC_AF1 功能。 - RTC 复用功能输入:
RTC_TS:时间戳事件检测。该输入可连接到器件 RTC_AF1 和 RTC_AF2 功能。
RTC_TAMP1:TAMPER1 事件检测。该输入可连接到器件 RTC_AF1 和RTC_AF2功能。
RTC_TAMP2:TAMPER2 事件检测。
RTC_REFIN:参考时钟输入(通常为市电,50 Hz 或 60 Hz)。
RTC相关库函数
- RTC时钟源和时钟操作函数:
void RCC_RTCCLKConfig(uint32_t CLKSource);//时钟源选择
void RCC_RTCCLKCmd(FunctionalState NewState)//时钟使能
- RTC初始化函数
ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct);
typedef struct
{
uint32_t RTC_HourFormat; //小时格式:24/12
uint32_t RTC_AsynchPrediv; //异步分频 系数
uint32_t RTC_SynchPrediv; //同步分频系数
}RTC_InitTypeDef
- RTC日历配置相关函数
//设置时间
ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct);
//获取时间
void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct);
//设置日期
ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct);
//获取日期
void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct);
//获取到亚秒的信息
uint32_t RTC_GetSubSecond(void);
- RTC闹钟相关函数
//禁止或使能RTC闹钟。
ErrorStatus RTC_AlarmCmd(uint32_t RTC_Alarm, FunctionalState NewState);
//RTC闹钟时间配置。
void RTC_SetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef* RTC_AlarmStruct);
//获取RTC闹钟的时间配置
void RTC_GetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef* RTC_AlarmStruct);
//功能配置RTC AlarmA/B的亚秒
void RTC_AlarmSubSecondConfig(uint32_t RTC_Alarm, uint32_t RTC_AlarmSubSecondValue, uint32_t RTC_AlarmSubSecondMask);
//得到RTC的亚秒时间。
uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm);
- RTC周期唤醒相关函数
//配置RTC唤醒时钟源
void RTC_WakeUpClockConfig(uint32_t RTC_WakeUpClock);
//配置RTC唤醒计数
void RTC_SetWakeUpCounter(uint32_t RTC_WakeUpCounter);
//得到唤醒定时器的计数值
uint32_t RTC_GetWakeUpCounter(void