STM32 实时时钟(RTC)详解

发布于:2025-05-15 ⋅ 阅读:(20) ⋅ 点赞:(0)

一、RTC 简介

RTC(Real Time Clock)即实时时钟,本质上是一个 32 位的秒级计数器:

  • 最大计数值为 4294967295 秒,约合 136 年:

     

    复制编辑

    4294967295 / 60 / 60 / 24 / 365 ≈ 136 年

  • RTC 初始化时,主要配置两项:

    1. 时钟源(决定 1 秒的基准周期)

    2. 计数器初值(转换为日期 + 时间)

RTC 表现形式对比

MCU型号 表现形式
STM32F103 仅提供一个以秒为单位的数值,由软件完成时间转换
STM32F407 硬件直接提供时间和日期寄存器


二、RTC 模块特性

  • 可编程的 预分频系数,最大支持 2^20。

  • 32 位计数器,用于长时间测量。

  • 支持三种 RTC 时钟源:

    • HSE / 128

    • LSE(32.768KHz)→ 1Hz

    • LSI

  • 两种独立复位机制:

    • APB1 接口系统复位

    • RTC 核心(后备域)复位

  • 三种中断:

    • 闹钟中断(Alarm)

    • 秒中断(每秒触发)

    • 溢出中断(计数器回到0)


三、RTC 架构简析

RTC 模块主要由两部分构成:

  1. APB1 接口部分

    • 与 MCU 通信,通过一组 16 位寄存器控制 RTC 配置。

    • 由 PCLK1 驱动。

  2. RTC 核心部分

    • 预分频器模块:产生 1 秒基准时钟 TR_CLK

    • 计数器模块:32 位,累加系统时间,支持闹钟中断比较


四、RTC 初始化流程(STM32F1 示例)

  1. 使能 PWR、BKP 时钟:

     

    RCC_APB1ENR |= RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN;

  2. 允许访问后备寄存器:

     

    PWR->CR |= PWR_CR_DBP;

  3. 复位备份域:

     

    RCC->BDCR |= RCC_BDCR_BDRST; RCC->BDCR &= ~RCC_BDCR_BDRST;

  4. 打开并等待 LSE 时钟稳定:

     

    RCC->BDCR |= RCC_BDCR_LSEON; while (!(RCC->BDCR & RCC_BDCR_LSERDY));

  5. 选择 LSE 为 RTC 时钟源:

     

    RCC->BDCR |= RCC_BDCR_RTCSEL_LSE;

  6. 启用 RTC 时钟:

     

    RCC->BDCR |= RCC_BDCR_RTCEN;

  7. 等待上一次写操作完成(RTOFF = 1)

  8. 等待寄存器同步(RSF = 1)

  9. 进入配置模式(CNF = 1)

  10. 配置分频器和时间值:

     

    RTC->PRLH = ...; RTC->PRLL = ...; RTC->CNTH = ...; RTC->CNTL = ...;

  11. 退出配置模式(CNF = 0)

  12. 等待写操作完成(RTOFF = 1)


五、RTC 读写注意事项

写操作流程

  1. 等待 RTOFF = 1(前一次写完成)

  2. 设置 CNF = 1(进入配置模式)

  3. 写入目标寄存器(如 PRL、CNT、ALR)

  4. 清除 CNF = 0(退出配置模式)

  5. 等待 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 支持)等功能。


网站公告

今日签到

点亮在社区的每一天
去签到