深入单片机实时时钟(RTC):设计、精度与安全
单片机定时器系列第 3 部分:深入实时时钟(RTC)
本篇深入单片机实时时钟(RTC)核心。前文涵盖定时器基础和脉宽调制。本文解释 RTC 如何维持精准一秒间隔、管理时间日期、补偿漂移、防篡改。
RTC 的功能
RTC 是产生稳定一秒滴答并持续计数的专用硬件。简单时序图展示滴答发生器、读取秒计数器的软件例程、三秒后触发的闹钟。关键需求是 精度 和 持续运行。

图 1. 基础 RTC 时序图
典型硬件特性
现代单片机 RTC 通常包含:
- 内部 32.768 kHz 振荡器(常配晶体或 TCXO 选项)
- 可提供高精度参考的外部时钟输入
- 选择信源的多路复用器,后接分频器除以 32,768 (2¹⁵) 产生 1 Hz 滴答
- 32 位(或更大)秒计数器,及可选分、时、日、月、年计数器
- 1 Hz 方波输出引脚
- 闹钟、秒滴答或其他事件的中断引脚
- 专用备用电源引脚,通常接纽扣电池,使芯片其余部分断电时时钟仍运行

图 2. 常见 RTC 硬件特性
精度与频率补偿
RTC 核心是 32.768 kHz 晶体。在设计良好的振荡器中,晶体本身是主要误差源。外部 TCXO 可达亚 ppm 稳定度,内部振荡器经补偿也能达到相当性能。
典型误差源含:
- 晶体及周边电路初始公差
- 温漂,遵循可预测二次曲线
- 老化,通常仅几 ppm/年
下图由 Texas Instruments 提供,展示温度与初始误差叠加,及精心校准如何将总误差压入黄带——板级测量后可达成的目标。

图 3. 误差 vs. 温度(Texas Instruments)
1 ppm 年精度下,时钟偏差约 30 秒——远优于大多数业余项目,但在任务关键系统仍值得考量。
补偿时序误差
在不牺牲硬件简洁性前提下修正小漂移的两种常用策略:
可调分频器。 若 RTC 暴露可编程分频器,软件可每隔几秒调整模数。例如,时钟每秒快 0.00010 s,可每第四秒将分频器从 32,768 改为 32,781,每次补回 0.00010 s。

图 4. 分频器调整抵消漂移
优势:细粒度修正、代码量极少。缺点:需可调分频器和额外寄存器。
软件修正。 硬件无可编程分频器时,固件可维护秒计数器运行累计误差。累计误差达一秒时,增减一个滴答。调整每周期仅可见一次,感知突兀。

图 5. 纯软件时序修正
优势:适用任意 RTC。缺点:滴答率出现明显跳变。
安全考量
时间关联计费、使用限额、关键时序的应用中,保护 RTC 防篡改至关重要。许多单片机提供:
- 软件可永久锁定的写保护寄存器
- 修改时间需硬件复位(完全复位清除锁定)
- 外壳级入侵检测以报警物理篡改
例如,本文用到的 MCU 有锁定位,一旦置位,芯片复位前无法清除,防止流氓代码改时钟。
时间日期管理
部分 RTC 集成全天候和日历计数器。硬件缺这些时,固件可用标准算法从 32 位秒计数器推导日期。C 标准库 time.h 期望返回自纪元(通常 1970-01-01)秒数的函数。简单的 get_time() 封装读取 RTC 计数器喂给库,库再处理闰年、夏令时、格式化。
32 位秒计数器的局限
32 位计数器在 2³² 秒后溢出——略超 136 年。但纪元从 1970 起算,计数器将在 2038 年翻滚(Y2038 问题)。依赖 C 库的系统在计数器达 2³¹ – 1 时可能出现未定义行为。
NASA 深度撞击任务 2013 年因以 0.1 秒增量计时的 32 位定时器溢出失联,潜在破坏控制指令。
「尽管确切失联原因未知,分析发现计算机时间标记的潜在问题可能导致深度撞击号姿态控制失效。」
—— NASA 新闻稿,2013
设计师应用远超系统预期寿命的计数器,或在固件实现翻滚处理。
后续步骤
本系列最后一篇将讲解看门狗定时器,这张即使软件死机也能让单片机存活的安全网。
工业技术