STM32(二十二)——时间戳、BKP备份寄存器、RTC实时时钟

一、时间戳

简介

•Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒
•时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量
•世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间

GMT/UTC

•GMT(Greenwich Mean Time)格林尼治标准时间是一种以地球自转为基础的时间计量系统。它将地球自转一周的时间间隔等分为24小时,以此确定计时标准

•UTC(Universal Time Coordinated)协调世界时是一种以原子钟为基础的时间计量系统。它规定铯133原子基态的两个超精细能级间在零磁场下跃迁辐射9,192,631,770周所持续的时间为1秒。当原子钟计时一天的时间与地球自转一周的时间相差超过0.9秒时,UTC会执行闰秒来保证其计时与地球自转的协调一致

时间戳转换

C语言的time.h模块提供了时间获取和时间戳转换的相关函数,可以方便地进行秒计数器、日期时间和字符串之间的转换

在菜鸟教程网站中可以查看time.h

time_t mktime(struct tm*)这个是将当地时间转换为秒计数器,如果传入格林尼治时间,秒计数器对不上。

核心数据类型
  • 系统时钟:操作系统的底层时间源,是所有时间的起点。
  • time_t(秒计数器) :本质是一个整数,代表从1970 年 1 月 1 日 00:00:00 UTC(纪元时间)到当前时间所经过的秒数,是计算机内部存储时间的标准格式。
  • struct tm(日期时间结构体):将时间拆解为人类可读的字段(年、月、日、时、分、秒等),便于直接操作和格式化。
  • char *(时间字符串):最终输出给用户的可读文本格式
转换方式
  • time()获取当前系统时间
  • ctime()直接将 time_t 转换为默认格式的时间字符串
  • gmtime()将 time_t 转换为 UTC 时间struct tm
  • localtime()将 time_t 转换为 本地时区struct tm
  • mktime()将 struct tm 转换回 time_t(会根据本地时区计算)
  • asctime()将 struct tm 转换为默认格式的时间字符串
  • strftime()按自定义格式将 struct tm 格式化为字符串(最灵活)
  • 若需要计算时间差,可将 struct tmmktime() 转回 time_t 后直接做减法。

二、BKP备份寄存器

简介

•BKP(Backup Registers)备份寄存器
•BKP可用于存储用户应用程序数据。当VDD(2.0~3.6V)电源被切断,他们仍然由VBAT(1.8~3.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位
•TAMPER引脚产生的侵入事件将所有备份寄存器内容清除
•RTC引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲
•存储RTC时钟校准寄存器
•用户数据存储容量:

20字节(中容量和小容量)/ 84字节(大容量和互联型)

基本结构

VBAT → 电池供电

  • 为备份域提供独立备用电源。
  • 当主电源 VDD 掉电时,自动切换到 VBAT 供电,保证 BKP 数据和 RTC 时钟持续运行。
  • 若 VBAT 也断电,BKP 数据会丢失。

TAMPER → 侵入检测

  • 防拆 / 防篡改检测引脚(通常复用 PC13)。
  • 检测到电平跳变(上升沿 / 下降沿可配置)时,会立即清除所有 BKP 数据寄存器内容,防止敏感数据被窃取。
  • 适用于高安全需求设备(如加密存储、门禁)。

RTC → 时钟输出

  • 输出 RTC 相关时钟信号:可配置为 1Hz 秒脉冲、512Hz 校准时钟或闹钟脉冲。
  • 与 BKP 共享 VBAT 供电,实现主电源掉电后仍走时。

控制寄存器:配置侵入检测触发方式、RTC 输出使能等。

状态寄存器:标记侵入事件、RTC 闹钟 / 唤醒事件。

RTC 时钟校准寄存器:微调 RTC 时钟精度,补偿晶振误差。

数据寄存器(DR):用于存储少量关键参数(如校准值、设备序列号),掉电不丢失(VBAT 供电时)。

三、RTC实时时钟

简介

•RTC(Real Time Clock)实时时钟
•RTC是一个独立的定时器,可为系统提供时钟和日历的功能
•RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0~3.6V)断电后可借助VBAT(1.8~3.6V)供电继续走时
•32位的可编程计数器,可对应Unix时间戳的秒计数器
•20位的可编程预分频器,可适配不同频率的输入时钟
•可选择三种RTC时钟源:

HSE时钟除以128(通常为8MHz/128)

LSE振荡器时钟(通常为32.768KHz)

LSI振荡器时钟(40KHz)

框图
  • RTC 预分频器

    • RTC_PRL(重装载寄存器)和 RTC_DIV(分频计数器)组成。
    • 作用:将 RTCCLK 分频为 1Hz 的 TR_CLK(秒脉冲),驱动 32 位计数器。
    • 公式:TR_CLK = RTCCLK / (RTC_PRL + 1),例如 32.768kHz 时钟下,RTC_PRL = 32767 时输出 1Hz。
    • RTC_DIV 分频计数器以上电时 RTC_PRL 寄存器配置的初始值为起点进行递减计数,每一个 RTCCLK 时钟周期计数值减 1;当计数值降至 0 时,计数器会立即重载 RTC_PRL 的值,进入下一轮递减循环。
  • 32 位可编程计数器(RTC_CNT)

    • TR_CLK 驱动,每 1 秒自增 1,是 RTC 的核心计时寄存器。
    • RTC_ALR(闹钟寄存器)比较,当 RTC_CNT == RTC_ALR 时触发闹钟事件。
    • 支持溢出中断(计数到 0xFFFFFFFF 后归 0,2106 年之后计数器溢出归零)。
  • RTC 控制 / 状态寄存器(RTC_CR)

    • 秒中断(SECF/SECIE)TR_CLK 每 1 秒置位 SECF,使能 SECIE 后触发中断。
    • 溢出中断(OWF/OWIE) :计数器溢出时置位 OWF,使能后触发中断。
    • 闹钟中断(ALRF/ALRIE) :闹钟匹配时置位 ALRF,使能后触发中断。
    • 三类中断通过或门汇总,最终输出到 NVIC。
  • 唤醒与待机逻辑

    • RTC_Alarm 信号可直接触发 退出待机模式
    • WKUP pin(唤醒引脚)输入 WKP_STDBY 信号,也可唤醒系统。
    • 这部分电路在待机时仍由 VBAT 供电,是低功耗唤醒的关键。
基本结构图
硬件电路
备用电池供电电路
  • 简单连接:直接将 3V 纽扣电池(B1)连接到 VBAT 引脚与地,结构最简,但无防倒灌保护。
  • 推荐连接
    • 由 3V 系统电源(3V3)和备用电池(B2)双路供电,通过二极管 D1、D2 实现电源自动切换
      • 系统上电时,3V3 经 D2 为 VBAT 供电,同时给电池浮充;
      • 系统掉电时,电池经 D1 为 VBAT 供电,避免电流倒灌回系统。
    • 电容 C3(0.1µF)为 VBAT 提供电源滤波,抑制纹波。
  • 核心作用:为 RTC 模块和备份寄存器(BKP)提供独立电源,保证主电源断开后计时不中断。
外部低速晶振电路
  • 晶振 X1:32.768kHz 低速晶振,是 RTC 高精度计时的核心时钟源。
  • 负载电容 C1/C2:各 10pF,与晶振匹配,用于起振和稳定频率,需根据晶振 datasheet 调整。
  • 引脚连接
    • OSC32_IN → PC14
    • OSC32_OUT → PC15
  • 这两个引脚与 RTC 模块绑定,必须配置为 LSE(低速外部晶振)模式才能为 RTC 提供时钟。
引脚对应表
注意事项

•执行以下操作将使能对BKP和RTC的访问:

设置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP时钟

设置PWR_CR的DBP,使能对BKP和RTC的访问
•若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1
•必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器
•对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器

相关推荐
学嵌入式的小杨同学2 小时前
STM32 进阶封神之路(八):外部中断 EXTI 实战 —— 按键检测从轮询到中断(库函数 + 寄存器双版本)
linux·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
Python小老六10 小时前
冯诺依曼架构 vs 哈佛架构 对比
stm32·单片机·嵌入式硬件·架构
羽获飞11 小时前
从零开始学嵌入式之STM32——13.使用STM32自带硬件模块实现IIC协议通讯
单片机·嵌入式硬件
单片机设计星球11 小时前
51单片机的【智能婴儿床】仿真设计
单片机·嵌入式硬件·51单片机
weiyvyy12 小时前
机器人嵌入式开发者的成长路径-技能体系构建
人工智能·嵌入式硬件·机器人
dashizhi201512 小时前
禁止复制电脑文件、电脑机密数据禁止拷贝、禁止电脑文件复制到U盘和移动硬盘的方法
运维·网络·stm32·安全·电脑
San_a dreamer fish14 小时前
STM32开发入门基础篇知识要点
stm32·单片机·嵌入式硬件
济61714 小时前
ARM Linux 驱动开发篇--- Linux 并发与竞争实验(互斥体实现 LED 设备互斥访问)--- Ubuntu20.04互斥体实验
linux·stm32·嵌入式linux驱动开发
安庆平.Я14 小时前
STM32——FreeRTOS - 移植
stm32·单片机·嵌入式硬件