RTC实时时钟(学习笔记)

  • Post author:
  • Post category:其他


RTC实时时钟特征与原理

RTC(Real Time Clock):实时时钟。

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

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

RTC工作原理框图

RTC由两部分组成:


ABP1接口:

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


RTC核心:

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

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

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

RTC内核完全独立于APB1接口,软件通过APB1接口对RTC相关寄存器访问。但是相关寄存器只在RTC APB1时钟进行重新同步的RTC时钟的上升沿被更新。所以软件必须先等待寄存器同步标志位(RTC_CRL的RSF位)被硬件置1才读。

BKP备份寄存器

1.备份寄存器是42个16位的寄存器。可用来存储84个字节数据、

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

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

4.执行以下操作将使能对后备寄存器和RTC访问:1.设置寄存器RCC_APB1ENR的PWREN和                                                                                          BKPEN位,使能电源和后备时钟。

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

RTC相关寄存器

1.RTC控制寄存器:RTC_CRH,RTC_CRL

2.RTC预分频装载寄存器:RTC_PRLH,RTC_PRLL

3.RTC预分频余数寄存器:RTC_DIVH,RTC_DIVL

4.RTC计数器寄存器:RTC_CNTH,RTC_CNTL

5.RTC闹钟寄存器:RTC_ALRH,RTC_ALRL

RTC_CRH

RTC_CRL



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


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


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

RTC_PRLH

RTC_PRLL

RTC_DIVH

RTC_DIVL


RTC_CNTH

RTC_CNTL

RTC_ALRH


RTC_ALRL

配置RTC寄存器

必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式,才能写入RTC_PRL,RTC_CNT,RTC_ALR寄存器。

另外,对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1是,才可以写入RTC寄存器。

配置过程:

1.查询RTOFF位,直到RTOFF的值变为1

2.置CNF值为1,进入配置模式

3.对一个或多个RTC寄存器进行写操作

4.清除CNF标志位,退出配置模式

5.查询RTOFF,直到RTOFF位变为1以确定写操作已完成

仅当CNF标志位被清除时,写操作才能进行,这个过程至少需要3个RTCCLK周期

写RTC寄存器

RTC核完全独立于RTC APB1接口。

软件通过APB1接口访问RTC的预分频值,计数器值和闹钟值。但是,相关的可读寄存器只在与RTC APB1时钟进行重新同步的RTC时钟的上升沿被更新。RTC标志也是如此。

这意味着,如果ABP1接口曾经被关闭,而读操作又是在刚刚重新开启APB1之后,则在第一次的内部寄存器更新之前,从APB1上读出的RTC寄存器数值可能被破坏了(通常读到0).下述几种情况下能够发生这种情形:

1.发生系统复位或者电源复位

2.系统刚从待机模式唤醒

3.系统刚从停机模式唤醒

所有上述情况中,APB1接口被禁止时(复位,无时钟或断电)RTC核仍保持运行状态。

因此,若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RFS位(寄存器同步标志)被硬件置1.

RTC相关库函数

RTC时钟源和时钟操作函数:void RCC_RTCCLKConfig();//时钟源选择

void RCC_RTCCLKCmd();//时钟使能

RTC配置函数(预分频,计数值):void RTC_SetPrescaler();//预分频配置:PRLH/PRLL

void RTC_SetCounter();//设置计数器值:CNTH/CNTL

void RTC_SetAlarm();//闹钟设置:ALRH/ALRL

RTC中断设置函数:void RTC_ITConfig();//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

RTC配置一般步骤

1.使能PWR和BKP时钟:RCC_APB1ReriphClockCmd();

2.使能后备寄存器访问:PWR_BackupAccessCmd();

3.配置RTC时钟源,使能RTC时钟:RCC_RTCCLKConfig();

RCC_RTCCLKCmd();

如果时钟LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON)

4.设置RTC预分频系数:RTC_SetPrescaler();

5.设置时间:RTC_SetCounter();

6.开启相关中断(如果需要):RTC_ITConfig();

7.编写中断服务函数:RTC_IRQHandler();

8.部分操作要等待写操作完成和同步。

RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成

RTC_WaitForSynchro();//等待RC寄存器同步



版权声明:本文为weixin_52456553原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。