基于STM32的RTC实时时钟实验

本文详细介绍了STM32的RTC实时时钟模块,包括其工作原理、时钟系统、内部设备工作原理及寄存器配置等内容。同时,还深入探讨了RTC的时钟校准原理和RTC与备份区域BKP的交互方式。

基于STM32的RTC实时时钟实验

RTC是什么?

STM32的RTC外设,实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断).但是从掉电还能继续运行来看,它是STM32中唯一一个具有这个功能的外设(RTC外设的复杂之处不在于它的定时,而在于它掉电还可以继续运行的特性)。

所谓掉电,是指电源VDD断开的情况下,为了RTC外设掉电可以继续运行,必须给STM32芯片通过VBAT引脚街上锂电池.当主电源VDD有效时,由VDD给RTC外设供电.当VDD掉电后,由VBAT给RTC外设供电.无论由什么电源供电,RTC中的数据始终都保存在属于RTC的备份域中,如果主电源和VBA都掉电,那么备份域中保存的所有数据都将丢失(备份域除了RTC模块的寄存器,还有42个16位的寄存器可以在VDD掉电的情况下保存用户程序的数序,系统复位或电源复位时,这些数据也不会被复位)。

STM32系统时钟源简介

系统时钟包括了:

1. HSE高速外部时钟(常用8MHz无源晶振);

2. PLL时钟源(来源有HSE和HSI/2,一般选HSE作为时钟来源);

3. PLL时钟PLLCLK(通过设置PLL的倍频因子,一般8Mx9=72MHz,72MHz是官方推荐稳定运行时钟,最高128MHz);

4. 系统时钟SYSCLK(一般SYSCLK=PLLCLK=72MHz);

5. AHB总线时钟HCLK(是系统时钟SYSCLK经过AHB分频器分频后得到的时钟,也就是APB总线时钟,一般设置1分频,HCLK=SYSSCLK=72MHz);

6. APB2总线时钟HCLK2(APB2总线时钟PCLK2由 HCLK经过高速APB2预分频余数器得到,分频因子可以是:[1,2,4,8,16],具体由时钟配置寄存器CFGR的位13-11:PPRE2[2:0]决定,一般设置为 1 分频,即 PCLK2 = HCLK =72M);

7. APB1总线时钟HCLK1(APB1 总线时钟 PCLK1 由 HCLK 经过低速 APB 预分频余数器得到,HCLK1 属于低速的总线时钟,最高为 36M,这里只需粗线条的设置好 APB1 的时钟即可。

RTC的时钟系统

RTC的时钟来源有三个:

① 外部有源晶体震荡时钟源(32.768KHz);

② 内置RC无源震荡源(约为40KHz);

③ 外部无源高速震荡时钟(约62.5KHz)。

RTC的晶振

任何实时时钟的核心都是晶振,晶振频率为32768Hz(LSE时钟)。它为分频计数器提供精确的与低功耗的实基信号。它可以用于产生秒、分、时、日等信息。为了确保时钟长期的准确性,晶振必须正常工作,不能够收到干扰。RTC的晶振又分为:外部晶振和内置晶振。

RTC内部设备工作原理

RTC核心部分

RTC核心设备包括“预分频余数模块”与“计数器模块”。说白了,RTC核心设备的独立工作功能就是“自己按照设定的预分频余数因子,一个周期计数一次,计数值存在32位的计数器中”。

APB1接口部分

RTC核心设备虽然可以根据设定的参数自己独立运行,但是RTC的中断和标志位是由APB1接口部分来操作的。

APB1接口设备包括“CR控制寄存器”,这个寄存器是32位的,也就是说CR寄存器分为两个16位寄存器CRL与CRH寄存器,,这两个寄存器的功能为“控制RTC的中断”与“置位RTC的状态标志位”。

RTC寄存器简介

CR控制寄存器

CR寄存器是由CRL与CRH两个16位寄存器组成的,由APB1总线控制,因此当RTC独立运行时,也就是开发板的电源断电时,CR寄存器是无法发挥其作用的。

“允许中断标志位”可以进行写操作。

 

 

这些位的相应信息如下:

功能

置位/复位操作

RTOFF

看看上一次对RTC的操作是否完成

硬件置位/硬件复位

CNF

是否进行写操作

软件置位/软件复位

RSF

APB1时钟是否与RTC时钟同步

硬件置位/软件复位

OWF/ALRF/SECF

相应动作对应的标志位

硬件置位/软件复位

注:

① 我们一般使用APB1总线对RTC操作之前,先将RSF复位以清除原来的残余信息,然后等待置位,一旦置位就说明APB1与RTC时钟已同步我们可以进行写操作;

② 读操作之前一定要等待RSF时钟同步标志位置1,才可以进行读出正确的数据。

PRL重装载寄存器

 

重加载寄存器中的值在预分频余数计数器的值递减至0后,重新装载进入预分频余数寄存器。

DIV预分频余数寄存器

 

RTC预分频余数寄存器的作用就是获取更加精准的时间,工作原理如下:

 

我们看到:预加载余数寄存器每1s被自动重装载一次,即每1s减至0。

假如:我们此时读取的DIV预加载余数寄存器的值为0x3FFF,说明此时自上次重装载已经过去了0.5s,我们得到了比1s精确度更高的时间,这就是DIV预加载余数寄存器的作用。除此之外,DIV预加载余数寄存器还可以获得0.01s,0.001s这样更加精确的时间。

CNT计数器寄存器

 

 

ARL闹钟寄存器

 

如何对RTC进行写操作?

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

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

寄存器配置步骤如下:

① 等待上次对RTC的操作结束 等待RTOFF位置1;

② 取消写保护/进行配置模式 将CNF标志位置1;

③ 对一个或多个RTC寄存器进行写操作;

④ 写保护/取消配置模式 将CNF标志位复位(仅当CNF标志位被清除时,写操作才能进行,这个过程至少需要3个RTC时钟周期);

⑤ 查询RTOFF,直至RTOFF位变为’1’以确认写操作已经完成。

如何进行RTC数据的读操作?

APB1总线时钟复位的几种情况:

电源/系统被复位

系统刚从待机模式中被唤醒

系统刚从停机模式中被唤醒

APB1复位就说明“APB1总线时钟与RTC时钟不再同步”。

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

RTC的复位操作

除了RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器外,所有的系统寄存器都由系统复

位或电源复位进行异步复位。

RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器仅能通过备份域复位信号复位。

在系统复位后,会自动禁止访问后备寄存器和RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前, 先要取消备份区域(BKP)写保护。

当VDD电源被切断,后备区域与RTC核心部分仍然由VBAT维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位。

关于RTC的疑难问题解析

为什么要等待APB1与RTC内部时钟同步后,我们对RTC中寄存器写操作才有效?

 

因为RTC时钟源和APB1接口的时钟源不同,一个来自32.768K晶振,一个来自8M晶振,他们的时钟一般会有一个差异的,所以才需要等待同步。

为什么RTC的时钟最准确(RTC时钟为何是准确的32768Hz)?

 

① RTC时间是以振荡频率来计算的。故它不是一个时间器而是一个计数器。而一般的计数器都是16位的。又因为时间的准确性很重要,故震荡次数越低,时间的准确性越低。所以必定是个高次数,即2^15=32768;

② 32768Hz=2^15即分频2^15次后为1Hz,周期=1s;

③ 经过工程师的经验总结32768Hz,时钟最准确;

④ 规范和统一。

为什么RTC和APB1有一些关联,他俩不是完全独立的吗?

不是的,我们的代码调试代码下载只能下载到STM32核心芯片中我们要通过STM32芯片来控制RTC设备就必须让RTC与APB1之间有接口。

为什么叫“秒标志位”?

因为RTC采用的是32.768KHz的晶振,PLR重装载寄存器(20位)的取值可以为32767,也就是说RTC可以没经过1s来置位一次“秒标志位”。我们通常的日历是以秒为最小的时间单位,因此RTC也可以提供我们日历的功能,但是这些事件是“xxxx秒”的形式出现的,需要我们根据“时秒分”的关系去进行换算。

注:其实PLR重装载寄存器的值可以是[0,2^20-1]之间所有的数值,因此我们也可以设定更小的计数单位进行计数。

为什么读数据/命令时需要等待RSF(时钟同步标志位)置1,而写命令/数据时则不用?

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

我们要读取数据就读取寄存器当前值,因此我们必须等待RTC时钟的上升沿在将数据读取到APB1总线中去,而写操作不同,我们不需要读取任何RTC寄存器的信息,因此写操作没必要等待时钟同步。

APB1总线时钟与RTC时钟同步是什么意思?

由于时钟源不同,因此APB1总线时钟不可能与RTC时钟完全重合,我们读取的原理如下:

 

我们只需要在下一个RTC时钟上升沿到来之前将RTC寄存器中的数据读取到APB1总线上即可以实现“数据同步读取”。

RTC如何实现日历功能?

要实现日历功能首先需要具备两个条件:间隔相同的计数单位(计数器+1所需时间)+初始计数时间(计数器的初始值)。

例如:我要从计数器=10000时开始计数并且我们计数器+1的时间为1s,如果我们一年之后计数器的值=36000,我们可以得知RTC实时时钟连续计数了26000*1s=26000s。

LSE时钟被旁路是什么意思?

 

所谓旁路模式,是指无需上面提到的使用外部晶体时所需的芯片内部时钟驱动组件,直接从外界导入时钟信号,犹如芯片内部的驱动组件被旁路了。

”晶振/时钟被旁路“ 是指将芯片内部的用于外部晶体起振和功率驱动等的部分电路和XTAL_OUT引脚断开,这时使用的外部时钟是有源时钟或者其他STM32提供的CCO输出等时钟信号,直接单线从XTAL_IN输入,这样即使外部有晶体也震荡不起来了。

RTC固件库库函数解析

void RTC_EnterConfigMode(void)

进入RTC配置模式

void RTC_ExitConfigMode(void)

退出RTC配置模式

uint32_t  RTC_GetCounter(void)

获得RTC中32位可编程计数器的值

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥肥胖胖是太阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值