1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > RTC实时时钟原理+BKP寄存器

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

时间:2019-09-29 23:53:54

相关推荐

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

RTC (Real Time Clock):实时时钟

RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期。

RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变。但是在系统复位后,会自动禁止访问后备寄存器和RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前, 先要取消备份区域(BKP)写保护。

RTC特征

RTC工作原理框图

RTC由两部分组成:

APB1接口:用来和APB1总线相连。通过APB1接口可以访问RTC的相关寄存器(预分频值,计数器值,闹钟值)。

RTC核心:由一组可编程计数器组成。分两个主要模块。

第一个是RTC预分频模块,它可以编程产生最长1秒的RTC时间基TR_CLK。如果设置了秒中断允许位,可以产生秒中断。

第二个是32位的可编程计数器,可被初始化为当前时间。系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比,当匹配时候如果设置了闹钟中断允许位,可以产生闹钟中断。

====================================================================

BKP备份寄存器

1.备份寄存器是42个16位的寄存器。可用来存储84个字节数据,常用来保存一些系统配置信息和相关标志位。

2.它们处在备份区域,当VDD电源切断,仍然由VBAT维持供电。

3.当系统在待机模式下被唤醒,或者系统复位或者电源复位,它们也不会复位。

4.执行以下操作将使能对后备寄存器和RTC访问:

(1)设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备时钟。

(2)设置寄存器PWR_CR的DBP位,使能对RTC和后备寄存器的访问。

====================================================================

RTC相关库函数

RTC时钟源和时钟操作函数:

RCC_LSEConfig();//开启LSE晶振

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时钟

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寄存器同步

①修改CRH/CRL寄存器,必须先判断RSF位,确定已经同步。

②修改CNT,ALR,PRL的时候,必须先配置CNF位进入配置模式,修改完之后,设置CNF位为0退出配置模式

③同时在对RTC相关寄存器写操作之前,必须判断上一次写操作已经结束,也就是判断RTOFF位是否置位。

等待上一次写操作完成判断同步进入配置模式修改RTC相关寄存器(每次写操作都必须等待上一次写操作完成)退出配置模式等待上一次写操作完成

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。