RTC实时时钟原理+BKP
一.RTC实时时钟原理+BKP
探索者STM32F4开发板
《STM32F4开发指南-库函数版本》-第20章 RTC实时时钟实验
- STM32F4xx官方资料:
《STM32F4中文参考手册 》-第23章 实时时钟(RTC)
二.RTC实时时钟特征与原理
- RTC (Real Time Clock):实时时钟
- RTC是个独立的BCD定时器/计数器。RTC 提供一个日历时钟,两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC还包含用于管理低功耗模式的自动唤醒单元。
- 两个32位寄存器包含二进码十进制格式(BCD)的秒,分钟,小时(12或24小时制),星期几,日期,月份和年份。此外,还可以提供二进制的亚秒值。
- 系统可以自动将月份的天数补偿为28,29(闰年),30,31天。并且还可以进行夏令时补偿。
- 其他32位寄存器还包含可编程的闹钟亚秒,秒,分钟,小时,星期几和日期。
- 此外,还可以使用数字校准功能对晶振精度的偏差进行补偿。
- 上电复位后,所有的RTC寄存器都会受到保护,以防止可能的非正常写访问。
- RTC模块和时钟配置是在后备区域,即在系统复位或者待机模式唤醒后RTC的设置和时间维持不变,只要后备区域供电正常,RTC将一直工作下去。但是在系统复位之后会自动禁止访问后备区域和RTC,以防止意外操作,所以在设置时间之前,要先取消后备区域写保护。
1.RTC特征
2.RTC工作原理框图
三.RTC原理
1.RTC时钟源
2.RTC BKP备份寄存器
提醒:一共有20个32位备份寄存器。常用来保存一些系统配置信息和相关标志位。
四.RTC常用寄存器
1.RTC相关常用寄存器
- RTC时间寄存器(RTC_TR)
- RTC日期寄存器(RTC_DR)
- RTC亚秒寄存器(RTC_SSR)
- RTC控制寄存器(RTC_CR)
- RTC初始化和状态寄存器(RTC_ISR)
- RTC预分频寄存器(RTC_PRER)
- RTC唤醒定时器寄存器(RTC_WUTR)
- RTC闹钟A寄存器(RTC_ALRMAR)
- RTC闹钟A亚秒寄存器(RTC_ALRMASSR)
- RTC闹钟B寄存器( RTC_ALRMBR)
- RTC闹钟B亚秒寄存器(RTC_ALRMBSSR)
- RTC写保护寄存器(RTC_WPR)
- RTC备份寄存器(RTC_BKPxR)
- RTC时间戳时间寄存器(RTC_TSTR)
- RTC时间戳日期寄存器(RTC_TSDR)
- RTC时间戳亚秒寄存器(RTC_TSSSR)
2.RTC预分频寄存器(RTC_PRER)
3.RTC时间寄存器(RTC_TR)
4.RTC日期寄存器(RTC_DR)
5.RTC亚秒寄存器(RTC_SSR)
6.RTC控制寄存器(RTC_CR)
每个位的含义,看中文参考手册CR寄存器描述
7.RTC初始化和状态寄存器(RTC_ISR)
每个位的含义,看中文参考手册CR寄存器描述
8.RTC唤醒定时器寄存器(RTC_WUTR)
9.RTC闹钟A/B寄存器(RTC_ALRMAR/ RTC_ALRMBR)
闹钟A和B描述一致
10.RTC闹钟A/B亚秒寄存器(RTC_ALRMASSR/ RTC_ALRMBSSR)
闹钟A和B描述一致
11.RTC写保护寄存器(RTC_WPR)
五.RTC相关库函数
库函数所在文件: stm32f4xx_rtc.c / stm32f4xx_rtc.h
1.相关常用库函数
ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct);
ErrorStatus RTC_EnterInitMode(void);
void RTC_ExitInitMode(void);
ErrorStatus RTC_SetTime(uint32_t 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_DateTypeDef* RTC_DateStruct);
void RTC_SetAlarm();
void RTC_GetAlarm();
ErrorStatus RTC_AlarmCmd(uint32_t RTC_Alarm, FunctionalState NewState);
void RTC_AlarmSubSecondConfig(uint32_t RTC_Alarm, uint32_t RTC_AlarmSubSecondValue, uint32_t RTC_AlarmSubSecondMask);
uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm);
2.RTC时钟源和时钟操作函数
void RCC_RTCCLKConfig(uint32_t CLKSource);//时钟源选择
void RCC_RTCCLKCmd(FunctionalState NewState)//时钟使能
3.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
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
4.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);
5.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);
6.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
7.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);
8.RTC相关约束函数
void RTC_WriteProtectionCmd(FunctionalState NewState);//取消写保护
ErrorStatus RTC_EnterInitMode(void);//进入配置模式,RTC_ISR_INITF位设置为1
void RTC_ExitInitMode(void)//退出初始化模式。
9.其他相关函数
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);
六.配置一般步骤
1.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();
2.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();
3.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();