当前位置: 首页 > ops >正文

STM32 实时时钟(RTC)详解

一、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 支持)等功能。

http://www.xdnf.cn/news/5976.html

相关文章:

  • 【​​HTTPS基础概念与原理​】TLS握手过程详解​​
  • 常见相机焦段的分类及其应用
  • java加强 -stream流
  • 如何开发一款 Chrome 浏览器插件
  • 纯css实现蜂窝效果
  • [:, :, 1]和[:, :, 0] 的区别; `prompt_vector` 和 `embedding_matrix`的作用
  • LeetCode热题100--234.回文链表--简单
  • 【操作系统期末速成】①操作系统概述
  • JS逆向实战四:某查查请求头逆向解密
  • Java Garbage Collection: 深入解析自动内存管理机制
  • SpringBoot 3.0 开发简单接口
  • 芯片测试之Input Leakage Current(输入漏电流)Test全解析:从原理到实战
  • 火山引擎实时音视频 高代码跑通日志
  • AMS3xxi激光测距仪安装调试维护详解
  • LeetCode 热题 100 105. 从前序与中序遍历序列构造二叉树
  • OpenHarmony轻量系统--BearPi-Nano开发板网络程序测试
  • 图像识别与 OCR 应用实践
  • Spring Security与SaToken的对比
  • 分步启动容器操作指南
  • 一文辨析Java基本数据类型与包装类
  • 日志链路ID配置,traceId多线程不打印什么鬼?
  • 解锁 CPFR 潜力:电商智能补货优化算法的全链路设计与实战指南
  • 特征偏移、标签偏移、数量偏移、概念漂移分别是什么?
  • 不锈钢气动保温V型球阀:专为高粘度、颗粒介质设计的智能控温解决方案-耀圣
  • 【bag of n-grams】 N-gram词袋模型 简介
  • 物联网设备如何与互联网“牵手”
  • CSP认证准备第三天-差分及第36次CCF认证(BFS)
  • 第十七章:Llama Factory 深度剖析:易用性背后的微调框架设计
  • JavaScript实践(三)JavaScript序列化与反序列化深度解析
  • 线性投影层---将输入特征从一个空间映射到另一个空间