STM32——RTC实时时钟原理+BKP寄存器原理

一、RTC实时时钟特征与原理

1、RTC(Real Time Clock):实时时钟

2、RTC是个独立的BCD定时器/计数器。RTC提供一个日历时钟,两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC还包含于管理低功耗模式的自动唤醒单元。

3、两个32位寄存器包含二进制码十进制格式(BCD)的秒、分钟、小时、星期几、日期、月份和年份。此外还可以提供二进制的亚秒值。

4、系统可以自动将月份的天数补偿为28、29(闰年),30、31天,并且可以进行夏令时补偿。

RTC工作原理框图

STM32——RTC实时时钟原理+BKP寄存器原理_第1张图片

 STM32——RTC实时时钟原理+BKP寄存器原理_第2张图片

 STM32——RTC实时时钟原理+BKP寄存器原理_第3张图片

 

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位备份寄存器。常用来保存一些系统配置信息和相关标志位。

STM32——RTC实时时钟原理+BKP寄存器原理_第4张图片

 

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)

STM32——RTC实时时钟原理+BKP寄存器原理_第5张图片 

先进行一个七位的异步预分频,再进行十五位的同步预分频。(两次分频产生更精准的时钟)

2、RTC时间寄存器(RTC_TR)

STM32——RTC实时时钟原理+BKP寄存器原理_第6张图片 

BCD码:又称二进码十进数。用4位二进制数来表示1位十进制数中的0~9这10个数码。

3、RTC日期寄存器(RTC_DR)

STM32——RTC实时时钟原理+BKP寄存器原理_第7张图片 

存储年月日,以及星期几

4、RTC亚秒寄存器(RTC_SSR)

STM32——RTC实时时钟原理+BKP寄存器原理_第8张图片 

亚秒寄存器保存比秒更精确。

时间寄存器、日期寄存器和亚秒寄存器,这三个寄存器保存的是时间

5、RTC唤醒定时器寄存器(RTC_WUTR)

STM32——RTC实时时钟原理+BKP寄存器原理_第9张图片 

6、RTC闹钟A/B寄存器(RTC_ALRMAR/RTC_ALRMBR)

STM32——RTC实时时钟原理+BKP寄存器原理_第10张图片 

闹钟寄存器需要同日历进行比较。掩码:时间比较的精确位。比如日期比较时不用精确到时间

三、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);

你可能感兴趣的:(STM32,stm32,单片机)