嵌入式--RTC实时时钟原理及相关库函数功能

一、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()判断是否写操作完成

嵌入式--RTC实时时钟原理及相关库函数功能_第1张图片

 图1

嵌入式--RTC实时时钟原理及相关库函数功能_第2张图片

 图2

 嵌入式--RTC实时时钟原理及相关库函数功能_第3张图片

嵌入式--RTC实时时钟原理及相关库函数功能_第4张图片

 图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实时时钟一般配置步骤

1.使能电源时钟和备份区域时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
2.取消备份区写保护
PWR_BackupAccessCmd(ENABLE); //使能 RTC 和后备寄存器访问
3.复位备份区域,开启外部低速振荡器。
BKP_DeInit(); //复位备份区域
RCC_LSEConfig(RCC_LSE_ON); // 开启外部低速振荡器
4.选择 RTC 时钟,并使能
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //选择 LSE 作为 RTC 时钟
RCC_RTCCLKCmd(ENABLE); //使能 RTC 时钟
5.等待上一次写操作完成和寄存器同步
RTC_WaitForLastTask();   
RTC_WaitForSynchro(); 
6.配置中断模式
RTC_ITConfig(RTC_IT_SEC, ENABLE);
7.设置 RTC 的分频,以及配置 RTC 时钟
RTC_EnterConfigMode(); /// 允许配置    
RTC_SetPrescaler(32767); //设置RTC预分频的值

8.退出配置
RTC_ExitConfigMode(); //退出配置模式      

每次对寄存器进行写操作之后都要进行一次写操作完成等待!RTC_WaitForLastTask();

你可能感兴趣的:(嵌入式,嵌入式硬件)