RTC实时时钟

来源:互联网 发布:c语言class怎么用 编辑:程序博客网 时间:2024/06/05 06:38

STM32 的实时时钟( RTC)是一个独立的定时器。 STM32 的 RTC 模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。
RTC 模块和时钟配置系统(RCC_BDCR 寄存器)是在后备区域,即在系统复位或从待机模式唤醒后 RTC 的设置和时间维持不变。但是在系统复位后,会自动禁止访问后备寄存器和 RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前, 先要取消备份区域( BKP)写保护。

RTC框图
RTC 由两个主要部分组成, 第一部分(APB1 接口)用来和 APB1 总线相连。CPU可通过 APB1 总线访问APB1接口,APB1接口是用来操作相关的RTC寄存器。

第二部分(RTC核心):由一组可编程计数器组成。分两个主要模块。
①第一个是RTC预分频模块,它可以编程产生最长1秒的RTC时间基TR_CLK。如果设置了秒中断允许位,可以产生秒中断。
②第二个是32位的可编程计数器,可被初始化为当前时间。系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比,当匹配时候如果设置了闹钟中断允许位,可以产生闹钟中断。

BKP备份寄存器
一共有42个16位备份寄存器。常用来保存一些系统配置信息和相关标志位。
①备份寄存器是42个16位的寄存器。可用来存储84个字节数据。
②它们处在备份区域,当VDD电源切断,仍然由VBAT维持供电。
③当系统在待机模式下被唤醒,或者系统复位或者电源复位,它们也不会复位。
④执行以下操作将使能对后备寄存器和RTC访问:
·设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备时钟。
·设置寄存器PWR_CR的DBP位,使能对RTC和后备寄存器的访问。

RTC相关寄存器
①RTC控制寄存器 (RTC_CRH, RTC_CRL)
②RTC预分频装载寄存器 (RTC_PRLH, RTC_PRLL)
③RTC预分频余数寄存器 (RTC_DIVH, RTC_DIVL)
④RTC计数器寄存器 (RTC_CNTH, RTC_CNTL)
⑤RTC闹钟寄存器 (RTC_ALRH ,RTC_ALRL)

RTC控制寄存器
RTC_CRH寄存器

这里写图片描述
①修改CRH/CRL寄存器,必须先判断RSF位,确定已经同步
②修改CNT,ALR,PRL的时候,必须先配置CNF位进入配置模式,修改完之后,设置CNF位为0退出配置模式
③同时在对RTC相关寄存器写操作之前,必须判断上一次写操作已经结束,也就是判断RTOFF位是否置位。

RTC预分频装载寄存器
RTC预分频装载寄存器高位RTC_PRLH
RTC预分频装载寄存器低位RTC_PRLL

RTC预分频余数寄存器
RTC预分频余数寄存器高位RTC_DIVH
RTC预分频余数寄存器低位RTC_DIVL
在TR_CLK的每个周期里, RTC预分频器中计数器的值都会被重新设置为RTC_PRL寄存器的值。用户可通过读取RTC_DIV寄存器,以获得预分频计数器的当前值,而不停止分频计数器的工作,从而获得精确的时间测量。该寄存器的值自减的,用于保存还需要多少时钟周期获得一个秒信号。在一次秒钟更新后,由硬件重新装载。

RTC计数器寄存器
RTC 计数器寄存器由 2 个 16位的寄存器组成 RTC_CNTH 和 RTC_CNTL,总共 32 位,用来记录秒钟值(一般情况下)。

RTC闹钟寄存器
由 2 个 16 为的寄存器组成 RTC_ALRH 和 RTC_ALRL。总共也是 32 位,用来标记闹钟产生的时间(以秒为单位),如果 RTC_CNT 的值与 RTC_ALR 的值相等,并使能了中断的话,会产生一个闹钟中断。

这里写图片描述
这里写图片描述

RTC相关库函数

TC时钟源和时钟操作函数:
void RCC_RTCCLKConfig(uint32_t CLKSource);//时钟源选择
void RCC_RTCCLKCmd(FunctionalState NewState)//时钟使能

RTC配置函数(预分频,计数值:
void RTC_SetPrescaler(uint32_t PrescalerValue);//预分频配置:PRLH/PRLL
void RTC_SetCounter(uint32_t CounterValue);//设置计数器值:CNTH/CNTL
void RTC_SetAlarm(uint32_t AlarmValue);//闹钟设置:ALRH/ALRL

RTC中断设置函数:
void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);//CRH

RTC允许配置和退出配置函数:
void RTC_EnterConfigMode(void);//允许RTC配置 :CRL位 CNF
void RTC_ExitConfigMode(void);//退出配置模式:CRL位 CNF

同步函数:
void RTC_WaitForLastTask(void);//等待上次操作完成:CRL位RTOFF
void RTC_WaitForSynchro(void);//等待时钟同步:CRL位RSF

相关状态位获取清除函数:
FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);
void RTC_ClearFlag(uint16_t RTC_FLAG);
ITStatus RTC_GetITStatus(uint16_t RTC_IT);
void RTC_ClearITPendingBit(uint16_t RTC_IT);

其他相关函数(BKP等)
PWR_BackupAccessCmd();//BKP后备区域访问使能
RCC_APB1PeriphClockCmd();//使能PWR和BKP时钟
RCC_LSEConfig();//开启LSE,RTC选择LSE作为时钟源
PWR_BackupAccessCmd();//BKP后备区域访问使能
uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);//读BKP寄存器
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);//写BKP

RTC配置一般步骤

① 使能PWR和BKP时钟:RCC_APB1PeriphClockCmd();
② 使能后备寄存器访问: PWR_BackupAccessCmd();
③ 配置RTC时钟源,使能RTC时钟:
RCC_RTCCLKConfig();
RCC_RTCCLKCmd();
如果使用LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON);
④ 设置RTC预分频系数:RTC_SetPrescaler();
⑤ 设置时间:RTC_SetCounter();
⑥开启相关中断(如果需要):RTC_ITConfig();
⑦编写中断服务函数:RTC_IRQHandler();
⑧部分操作要等待写操作完成和同步。
RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成
RTC_WaitForSynchro(); //等待RTC寄存器同步

0 0