一、RTC介绍
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预分频寄存器(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相关库函数讲解
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);
四、RTC日历配置一般步骤
- ①使能PWR时钟:
RCC_APB1PeriphClockCmd();
- ② 使能后备寄存器访问: `
PWR_BackupAccessCmd();`
- ③ 配置RTC时钟源,使能RTC时钟:
RCC_RTCCLKConfig();
RCC_RTCCLKCmd();
如果使用LSE,要打开LSE:
RCC_LSEConfig(RCC_LSE_ON);
- ④ 初始化RTC(同步/异步分频系数和时钟格式):
RTC_Init ();`
- ⑤ 设置时间:
RTC_SetTime ();
- ⑥设置日期:
RTC_SetDate();
五、RTC闹钟配置一般步骤:
- RTC已经初始化好相关参数
- 关闭闹钟:
RTC_AlarmCmd(RTC_Alarm_A,DISABLE);
- 配置闹钟参数:
RTC_SetAlarm();
- 开启闹钟:
RTC_AlarmCmd(RTC_Alarm_A,EABLE);
- 开启配置闹钟中断:
RTC_ITConfig();
EXTI_Init();
NVIC_Init();
- 编写中断服务函数:
RTC_Alarm_IRQHandler();
六、RTC周期性自动唤醒配置一般步骤:
- RTC已经初始化好相关参数
- 关闭WakeUp:
RTC_WakeUpCmd(DISABLE);
- 配置WakeUp时钟分频系数/来源:
RTC_WakeUpClockConfig();
- 设置WakeUp自动装载寄存器:
RTC_SetWakeUpCounter();
- 使能WakeUp :
RTC_WakeUpCmd( ENABLE);
- 开启配置闹钟中断:
RTC_ITConfig();
EXTI_Init();
NVIC_Init();
- 编写中断服务函数:
RTC_WKUP_IRQHandler();