STM32 RTC实时时钟学习总结

STM32 RTC实时时钟学习总结

写于2024/9/25下午

1. 简介

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

RTC时钟最大的特点就是,可以用作实时时钟。因为普通定时器在MCU掉电后无法运行,而RTC可以通过后备电源供电使其保持运行。RTC 模块和时钟配置系统(RCC_BDCR 寄存器)是在后备区域,即在系统复位或从待机模式唤醒后 RTC 的设置和时间维持不变,只要后备区域供电正常,那么 RTC 将可以一直运行。但是在系统复位后,会自动禁止访问后备寄存器和 RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前,先要取消备份区域(BKP)写保护

2. 流程框图介绍

image-20240925171757350

框图中浅灰色的部分,他们是属于备份域的,在 VDD掉电时可在 VBAT 的驱动下继续工作,这部分包括 RTC 的分频器,计数器以及闹钟控制器。

APB1接口:用来和 APB1 总线相连。通过 APB1 总线可以访问 RTC 相关的寄存器,对其进行读写操作。

可以看到,APB1接口的时钟来源于PCLK1,而RTC时钟来源与RTCCLK,二者时钟来源不同,频率也不同

img

RTC时钟来源为LSE(外部低速晶振),LSI(内部低速晶振),以及HSE/128(外部高速晶振的128分频)。

RTC核心 :由一组可编程计数器组成,主要分成两个模块。第一个模块是 RTC 的预分频模块,它可编程产生 1 秒的 RTC 时间基准 TR_CLK。RTC 的预分频模块包括了一个 20 位的可编程分频器RTC_PRL。如果在 RTC_CR 寄存器中设置相对应的允许位,则在每个TR_CLK 周期中 RTC 产生一个中断(秒中断)。

RTC_PRL:预分频装载寄存器
RTC_DIV:预分频器余数寄存器

第二个模块是一个 32 位的可编程计数器RTC_CNT,可被初始化为当前的系统时间,一个 32 位的时钟计数器,按秒钟计算,可以记录 4294967296 秒,约合 136 年左右,作为一般应用足够了。

RTC_CNT:计数器寄存器
RTC_ALR:闹钟寄存器

RTC 还有一个闹钟寄存器 RTC_ALR,用于产生闹钟。系统时间按 TR_CLK 周期累加并与存储在 RTC_ALR 寄存器中的可编程时间相比较,如果 RTC_CR 控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。


下面来简述一下RTC的工作流程

首先,在初始化时候,我们将取消备份区域(BKP)写保护,然后通过APB1总线向DIV和PRL装载同样的数。RTCCLK频率为32.768kHz(LSE),来驱动DIV工作,DIV为自减寄存器。当DIV减少到0时,会产生一个TR_CLK信号,该信号会触发三件事情:

①将PRL的数重装在到DIV中;

②触发CNT计数器+1;

③触发SECF,进而产生秒中断。

我们会设置一个合理的预分频数,使得TR_CLK触发时间刚好是1s。ALR中存储的是我们设置的闹钟秒数,当CNT和ALR中的数据相同时,就会触发闹钟中断或者闹钟唤醒。(关于CNT和ALR中存放的数据,为时间戳。)

那么1s的时间如何计算?
fTR_CLK = fRTCCLK/(PRL[19:0]+1)
我们的RTC_CLK为32.768kHz,所以只要PRL中写入32767即可,即为2的15次方。
我们只需要在PRL的低16位寄存器中写入0x7FFF即可,就能获得每秒一次的TR_CLK信号。

DIV寄存器存在的意义?
从上述能知道TR_CLK输出必须为1s。那么我们想要的到0.15s,应该怎么实现呢?
道理很简单,因为DIV是自减的,并且从32768一直减少到0,所需要的时间为1s。所以减少一个数,所用的时间为1/32768s,那么减少多少个数,就计时了0.15s呢?
1/32768s * n = 0.15
n = 0.15 * 32768
又因为DIV寄存器是可读的,所以我们就能实现0.15s的计时。

从框图中,还可以看到,只有秒中断和闹钟中断能触发中断,溢出是没有中断的

3. 相关寄存器介绍

RTC控制寄存器(RTC_CRH/CRL)

RTC 控制寄存器共有两个控制寄存器 RTC_CRH 和 RTC_CRL,两个都是 16 位的。

RTC 控制寄存器高位 RTC_CRH,描述如图 27.1.2.1 所示:

image-20240925175347808

RTC 控制寄存器低位 RTC_CRL,描述如图 27.1.2.2 所示:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值