一、RTC实时时钟原理
1、RTC实时时钟是一个独立的定时器,可以提供日期时间或者闹钟的功能。其核心是通过32位可编程计数器RTC_CNT计数来进行时间配置。
2、图1中RTCCLK为RTC时钟源,其主要是由外部晶振提供时钟源,一般为32.768kHZ如图2所示。RTC_PRL为预分频系数,可自己设置。TR_CLK是经过预分频之后的时钟,比如RTCCLK=32768HZ,RTC_PRL=(32767+1),则TR_CLK为每秒1HZ。RTC_DIV为余数分频器,是为了时钟更加精确。RTC_ALR是闹钟寄存器,可自己设计时间,当RTC_CNT=RTC_ALR时并且设置了中断,则会进入中断。
3、RTC 模块和时钟配置系统是在后备区域,即在系统复位或从待机模式唤醒后 RTC 的设置和时间维持不变。因此在使用RTC模块是必须先对其进行时钟使能:RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE)
4、如图3所示,在寄存器进行配置时必须要注意一些情况,如:
①修改CRH/CRL寄存器,必须先判断RSF位,确定已经同步。
利用库函数RTC_WaitForSynchro()进行配置
②修改CNT,ALR,PRL的时候,必须先配置CNF位进入配置模式,修改完之后,设置CNF位为0退出配置模式
配置模式:RTC_EnterConfigMode()
退出配置模式:RTC_ExitConfigMode()
③同时在对RTC相关寄存器写操作之前,必须判断上一次写操作已经结束,也就是判断RTOFF位是否置位
利用库函数RTC_WaitForLastTask()判断是否写操作完成
图1
图2
图3
二、RTC相关库函数的作用
1.void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);
RTC中断函数,主要是配置那种中断模式。中断模式只有三种:RTC_IT_OW 溢出中断, RTC_IT_ALR闹钟中断, RTC_IT_SEC 秒钟中断。
2.void RTC_EnterConfigMode(void); void RTC_ExitConfigMode(void);
RTC配置函数,需要修改RTC_CNT、RTC_PRL、RTC_ALR值时,使用配置函数,修改完毕使用退出配置函数。
3.uint32_t RTC_GetCounter(void);
获取RTC_CNT寄存器值函数,当配置完寄存器值得时候,需要这个值利用此函数把值取出。
4.void RTC_SetCounter(uint32_t CounterValue);
设置RTC_CNT寄存器数值函数。
5.void RTC_SetPrescaler(uint32_t PrescalerValue);
设置RTC_PRL寄存器数值函数。
6.void RTC_SetAlarm(uint32_t AlarmValue);
设置RTC_ALR寄存器数值函数。
7.uint32_t RTC_GetDivider(void);
获取预分频余数寄存器的数值。
8. void RTC_WaitForLastTask(void);
判断上一次写操作是否结束函数。
9.void RTC_WaitForSynchro(void);
等待RTC_CNT、RTC_PRL、RTC_ALR同步函数。
10.FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);
获取OW、ALR、 SEC、RTOFF、RSF的状态。
11.void RTC_ClearFlag(uint16_t RTC_FLAG);
清除标志,包括OW、ALR、 SEC、RTOFF、RSF,使其都为0。
12.ITStatus RTC_GetITStatus(uint16_t RTC_IT);
在中断使能有效情况下,读取中断状态,即OW、ALR、 SEC状态。
13.void RTC_ClearITPendingBit(uint16_t RTC_IT);
清除OW、ALR、 SEC 标志,使其都为0。
三、RTC实时时钟一般配置步骤
8.退出配置
RTC_ExitConfigMode(); //退出配置模式
每次对寄存器进行写操作之后都要进行一次写操作完成等待!RTC_WaitForLastTask();