RTC(Real Time Clock):实时时钟。
RTC是个独立的BCD定时器/计数器。RTC 提供一个日历时钟,两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC还包含用于管理低功耗模式的自动唤醒单元。两个32位寄存器包含二进码十进制格式(BCD)的秒,分钟,小时(12或24小时制),星期几,日期,月份和年份。此外,还可以提供二进制的亚秒值。系统可以自动将月份的天数补偿为28,29(闰年),30,31天。上电复位后,所有的RTC寄存器都会受到保护,以防止可能的非正常写访问。RTC模块和时钟配置是在后备区域,即在系统复位或者待机模式唤醒后RTC的设置和时间维持不变,只要后备区域供电正常,RTC将一直工作下去。但是在系统复位之后会自动禁止访问后备区域和RTC,以防止意外操作,所以在设置时间之前,要先取消后备区域写保护。
二、RTC工作原理框图
其中:最左侧为时钟输入,可由LSE、HSE以及LSI输入,经过RTC_PRER(默认值为128)进行分频,获得时钟为256Hz,再进过第二个RTC_PRER(默认值为256)进行分频,获得时钟1Hz。1Hz用来给秒计时,256Hz充当亚秒计时。闹钟A和闹钟B通过判断器和RTC_TR以及RTC_DR来比较,实现闹钟。下方有自动唤醒的时钟以及寄存器。
RTC预分频寄存器(RTC_PRER)
RTC时间寄存器(RTC_TR)
RTC日期寄存器(RTC_DR)
RTC亚秒寄存器(RTC_SSR)
RTC唤醒定时器寄存器(RTC_WUTR)
RTC闹钟A/B寄存器(RTC_ALRMAR/RTC_ALRMBR)
RTC闹钟A/B亚秒寄存器(RTC_ALRMASSR/ RTC_ALRMBSSR)
RTC写保护寄存器(RTC_WPR)
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 RTC_Format, uint32_t RTC_Alarm,
RTC_AlarmTypeDef* RTC_AlarmStruct);
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 RTC_WakeUpClockConfig(uint32_t RTC_WakeUpClock);
void RTC_SetWakeUpCounter(uint32_t RTC_WakeUpCounter);
uint32_t RTC_GetWakeUpCounter(void);
RTC_WakeUpCmd(DISABLE);//关闭WAKE UP
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);
RCC_APB1PeriphClockCmd();
PWR_BackupAccessCmd();`
RCC_RTCCLKConfig();
RCC_RTCCLKCmd();
如果使用LSE,要打开LSE:
RCC_LSEConfig(RCC_LSE_ON);
RTC_Init ();`
RTC_SetTime ();
RTC_SetDate();
RTC_AlarmCmd(RTC_Alarm_A,DISABLE);
RTC_SetAlarm();
RTC_AlarmCmd(RTC_Alarm_A,EABLE);
RTC_ITConfig();
EXTI_Init();
NVIC_Init();
RTC_Alarm_IRQHandler();
RTC_WakeUpCmd(DISABLE);
RTC_WakeUpClockConfig();
RTC_SetWakeUpCounter();
RTC_WakeUpCmd( ENABLE);
RTC_ITConfig();
EXTI_Init();
NVIC_Init();
RTC_WKUP_IRQHandler();