一、RTC 简介
RTC(Real Time Clock)即实时时钟,本质上是一个 32 位的秒级计数器:
-
最大计数值为
4294967295
秒,约合 136 年:复制编辑
4294967295 / 60 / 60 / 24 / 365 ≈ 136 年
-
RTC 初始化时,主要配置两项:
-
时钟源(决定 1 秒的基准周期)
-
计数器初值(转换为日期 + 时间)
-
RTC 表现形式对比
MCU型号 | 表现形式 |
---|---|
STM32F103 | 仅提供一个以秒为单位的数值,由软件完成时间转换 |
STM32F407 | 硬件直接提供时间和日期寄存器 |
二、RTC 模块特性
-
可编程的 预分频系数,最大支持 2^20。
-
32 位计数器,用于长时间测量。
-
支持三种 RTC 时钟源:
-
HSE / 128
-
LSE(32.768KHz)→ 1Hz
-
LSI
-
-
两种独立复位机制:
-
APB1 接口系统复位
-
RTC 核心(后备域)复位
-
-
三种中断:
-
闹钟中断(Alarm)
-
秒中断(每秒触发)
-
溢出中断(计数器回到0)
-
三、RTC 架构简析
RTC 模块主要由两部分构成:
-
APB1 接口部分
-
与 MCU 通信,通过一组 16 位寄存器控制 RTC 配置。
-
由 PCLK1 驱动。
-
-
RTC 核心部分
-
预分频器模块:产生 1 秒基准时钟
TR_CLK
-
计数器模块:32 位,累加系统时间,支持闹钟中断比较
-
四、RTC 初始化流程(STM32F1 示例)
-
使能 PWR、BKP 时钟:
RCC_APB1ENR |= RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN;
-
允许访问后备寄存器:
PWR->CR |= PWR_CR_DBP;
-
复位备份域:
RCC->BDCR |= RCC_BDCR_BDRST; RCC->BDCR &= ~RCC_BDCR_BDRST;
-
打开并等待 LSE 时钟稳定:
RCC->BDCR |= RCC_BDCR_LSEON; while (!(RCC->BDCR & RCC_BDCR_LSERDY));
-
选择 LSE 为 RTC 时钟源:
RCC->BDCR |= RCC_BDCR_RTCSEL_LSE;
-
启用 RTC 时钟:
RCC->BDCR |= RCC_BDCR_RTCEN;
-
等待上一次写操作完成(RTOFF = 1)
-
等待寄存器同步(RSF = 1)
-
进入配置模式(CNF = 1)
-
配置分频器和时间值:
RTC->PRLH = ...; RTC->PRLL = ...; RTC->CNTH = ...; RTC->CNTL = ...;
-
退出配置模式(CNF = 0)
-
等待写操作完成(RTOFF = 1)
五、RTC 读写注意事项
写操作流程
-
等待
RTOFF = 1
(前一次写完成) -
设置
CNF = 1
(进入配置模式) -
写入目标寄存器(如 PRL、CNT、ALR)
-
清除
CNF = 0
(退出配置模式) -
等待
RTOFF = 1
(确认写操作完成)
每次写入至少需要等待 3 个
RTCCLK
周期。
读操作注意事项
RTC 核心独立于 APB1 接口,RTC 内部值在 RTC 时钟上升沿同步 到 APB1 接口:
-
若系统曾关闭 APB1 时钟,第一次读取值可能无效(常为0)
-
必须等待
RSF = 1
(寄存器同步完成)后再读数据
情况示例:复位后 / 停机唤醒后 / APB1重新打开
六、RTC 寄存器说明
寄存器名 | 描述 | 复位方式 |
---|---|---|
RTC_CNT | 当前计数值(时间) | 后备复位 |
RTC_PRL | 分频器设定 | 后备复位 |
RTC_ALR | 闹钟时间值 | 后备复位 |
其他寄存器 | 配置与控制 | 系统复位 |
七、总结
RTC 模块作为独立的低功耗定时单元,在低功耗应用中非常重要。STM32 的 RTC 模块可实现秒级定时、闹钟中断、时间持久化(VBAT 支持)等功能。