一、RTC实时时钟特征与原理
1、RTC(Real Time Clock):实时时钟
2、RTC是个独立的BCD定时器/计数器。RTC提供一个日历时钟,两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC还包含于管理低功耗模式的自动唤醒单元。
3、两个32位寄存器包含二进制码十进制格式(BCD)的秒、分钟、小时、星期几、日期、月份和年份。此外还可以提供二进制的亚秒值。
4、系统可以自动将月份的天数补偿为28、29(闰年),30、31天,并且可以进行夏令时补偿。
RTC工作原理框图
1)通常情况下时钟源LSE(32.768KHz)经过精确校准进入异步通道分频(默认127+1),生成ck_apre(默认256Hz),进行粗略校准后进行同步分频,之后产生CK_spre(默认1Hz),从而产生“日历”。闹钟A与闹钟B将与“日历”比较,相等则会产生时钟。
(RTCCLOCK/(127+1)产生ck_apre时钟,ck_apre时钟再经过同步分频产生ck_spre时钟。影子寄存器亚秒是默认值分之一)
2)RTCCLOCK“走”下半部分预分频器,然后进入一个选择器(有来自ck_spre的也有来自下半部分预分频器的),到达自动装载寄存器(16位的RTC_WUTR)。自动装载寄存器计数到零后会唤醒开启标志位从而产生中断。
5、RTC BKP备份寄存器
提醒:一共有20个32位备份寄存器。常用来保存一些系统配置信息和相关标志位。
6、RTC相关常用寄存器
1)RTC时间寄存器(RTC_TR) 2)RTC日期寄存器(RTC_DR) 3)RTC亚秒寄存器(RTC_SSR)
4)RTC控制寄存器(RTC_CR) 5)RTC初始化和状态寄存器(RTC_ISR)
6)RTC预分频寄存器(RTC_PRER) 7)RTC唤醒寄存器定时器(RTC_WUTR)
8)RTC闹钟A寄存器(RTC_ALRMAR) 9)RTC闹钟A亚秒寄存器(RTC_ALRMARSSR)
10)RTC闹钟B寄存器(RTC_ALRMBR) 11)RTC闹钟B亚秒寄存器(RTC_ALRMBRSSR)
12)RTC写保护寄存器(RTC_WPR) 13)RTC备份寄存器(RTC_BKPxR)
14)RTC时间戳时间寄存器(RTC_TSTR) 15)RTC时间戳日期寄存器(RTC_TSDR)
16)RTC时间戳亚秒寄存器(RTC_TSSSR)
二、RTC相关寄存器
1、RTC预分频寄存器(RTC_PRER)
先进行一个七位的异步预分频,再进行十五位的同步预分频。(两次分频产生更精准的时钟)
2、RTC时间寄存器(RTC_TR)
BCD码:又称二进码十进数。用4位二进制数来表示1位十进制数中的0~9这10个数码。
3、RTC日期寄存器(RTC_DR)
存储年月日,以及星期几
4、RTC亚秒寄存器(RTC_SSR)
亚秒寄存器保存比秒更精确。
时间寄存器、日期寄存器和亚秒寄存器,这三个寄存器保存的是时间
5、RTC唤醒定时器寄存器(RTC_WUTR)
6、RTC闹钟A/B寄存器(RTC_ALRMAR/RTC_ALRMBR)
闹钟寄存器需要同日历进行比较。掩码:时间比较的精确位。比如日期比较时不用精确到时间
三、RTC相关常用库函数
ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct);
ErrorStstus RTC_EnterInitMode(void);
void RTC_ExitInitMode(void);
ErrorStatus RTC_SetTime(uint32_ RTC_Format,RTC_TimeTypeDef* RTC_TimeStruct);
void RTC_GetTime(uint32_t RTC_Format,RTC_TimeTypeDef* RTC_TimeStruct);
uint32_t RTC_GetSubSecond(void);
ErrorStatus RTC_SetDate(uint32_t RTC_Format,RTC_DateTypeDef* RTC_DateStruct);
void RTC_GetDate(uint32_t RTC_Format,RTC_Date TypeDef* RTC_DateStruct);
void RTC_SetAlarm();
void RTC_GetAlarm();
ErrorStatus RTC_AlarmCmd(uint32_t RTC_Alarm,FunctionalStatus NewState);
void RTC_AlarmSubSecondConfig(uint32_t RTC_Alarm,uint32_t RTC_AlarmSubSecondValue,uint32_t RTC_AlarmSubSecondMask);
uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm);
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_InitTypeDe
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闹钟相关函数:
ErrorStatus RTC_AlarmCmd(uint32_t RTC_Alarm,FunctionalState NewState);
void RTC_SetAlarm(uint32_t RTC_Format,uint32_t RTC_Alarm,RTC_AlarmTypeDef*RTC_AlarmStruct);
void RTC_GetAlarm(uint32_t RTCFormat,uint32_t RTC_Alarm,RTC_AlarmTypeDef*RTCAlarmStruct);
void RTCAlarmSubSecondConfig(uint32_t RTC_Alarm,uint32_t RTC_AlarmSubSecondValue,uint32_t RTC_AlarmSubSecondMask);
uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm);
RTC周期唤醒相关函数:
void RTC_WakeUpClockConfig(uint32_t RTC_WakeUpClock);
void RTC_SetWakeUpCounter(uint32_t RTC_WakeUpCounter);
uint32_t RTC_GetWakeUpCounter(void);
RTC_WakeUpCmd(DISABLE);//关闭WAKEUP
RTC中断配置以及状态相关函数:
void RTC_ITConfig(uint32_t RTC_IT,FunctionalState NewState);
FlagStatus RTC_GetFlagStatus(uint32_t RTC_FLAG);
void RTC_ClearFlag(uint32_t RTC_FLAG);
ITStatus RTC_GetITStatus(uint32_t RTC_IT);
void RTC_ClearITPendingBit(uint32_t RTC_IT);
RTC相关约束函数:
void RTC_WriteProtectionCmd(FunctionalState NewState);//取消写保护
ErrorStatus RTC_EnterInitMode(void);//进入配置模式,RTC_ISR_INITF位设置为1
void RTC_ExitInitMode(void);//退出初始化模式
其它相关函数:
uint32_t RTC_ReadBackupRegister(uint32_t RTC_BKP_DR);
void RTC_WriteBackupRegister(uint32_t RTC_BKP_DR,uint32_t Data);
void RTC_ITConfig(uint32_t RTC_IT,FunctionalState NewState);