一、时间戳
简介
•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 tm用mktime()转回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。
- 秒中断(SECF/SECIE) :
-
唤醒与待机逻辑
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 提供电源滤波,抑制纹波。
- 由 3V 系统电源(3V3)和备用电池(B2)双路供电,通过二极管 D1、D2 实现电源自动切换 :
- 核心作用:为 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寄存器