📺 B站视频讲解(Bilibili):https://www.bilibili.com/video/BV1k1C9BYEAB/
📘 《Yocto项目实战教程》京东购买链接:Yocto项目实战教程
全面理解 RTC:原理、分类、驱动机制与实际调试

一、什么是 RTC?为什么嵌入式系统必须要有?
RTC(Real-Time Clock,实时时钟)是负责 计时、掉电保持时间 的独立硬件模块。它的作用是:
- 在系统掉电后依然保持当前时间
- 提供日志时间戳
- 支持设备唤醒(Alarm)
- 保证摄像头、工业设备、IoT 设备的时间一致性
没有 RTC 的系统在断电后会回到 1970-01-01,导致:
- 日志乱序
- OTA 升级失败
- 文件系统时间错误
- 摄像头同步出错
因此,所有工业设备、平板、摄像头、IoT 终端都必须具备 RTC。
二、RTC 的分类:内部 RTC vs 外部 RTC(哪个更可靠?)
✔ 内部 RTC(SOC/PMIC 自带)
例如:
- NVIDIA Jetson →
tegra_rtc - i.MX8MP →
snvs_rtc - Rockchip →
rk808 rtc
优点: 无需额外器件。
缺点: 精度一般、掉电后可能失效、依赖 PMIC。
✔ 外部 RTC(独立芯片,更专业)
典型芯片:
- PCF8563 / RTC8563 / HYM8563
- DS1307 / DS3231(温补高精度)
- RV-3028(超低功耗)
优点:
- 更高精度
- VBAT 独立供电,掉电保持时间
- 工业级可靠性
因此 外部 RTC 是专业设备的首选。
三、RTC 的硬件原理:为什么使用 32.768 kHz?
RTC 的工作核心是 32.768 kHz 晶振,原因非常重要:
32,768 = 2^15
RTC 内部只需一个 15 位计数器,就能轻松分频为:
32768 Hz → 1 Hz(每秒节拍)
优势:
- 分频简单
- 功耗极低(μA级)
- 适合长期电池供电
这就是为什么所有 RTC 都使用 32.768 kHz,而不是 32 MHz。
四、RTC 常见频率体系(不仅只有 32.768 kHz)
除了标准 32768 Hz,部分 RTC 支持输出多种频率(CLKOUT):
| 频率 | 用途 |
|---|---|
| 32768 Hz | 系统低频基准,RTC 内部主频 |
| 1024 Hz | PMIC、低功耗看门狗 |
| 32 Hz | 周期信号、低速同步 |
| 1 Hz | 秒脉冲、LED 闪烁、RTC 心跳 |
高端 RTC(如 DS3231)内部可能有 MHz 级运放/补偿电路,但最终输出仍是上述低频。
五、RTC 在 Linux 系统中的架构
Linux 系统将每个 RTC 设备映射为:
/dev/rtc0
/dev/rtc1
/dev/rtc2
...
以及:
/sys/class/rtc/rtcX
例如你在 Jetson 上的结构:
rtc0→ nvvrs PMIC RTC(默认系统 RTC)rtc1→ tegra 内部 RTCrtc2→ HYM8563 外部 RTC(你的板子)
可通过:
dmesg | grep rtc
查看 RTC 加载顺序。
六、外部 RTC 的设备树配置(以 HYM8563 为例)
rtc@51 {
compatible = "haoyu,hym8563", "nxp,pcf8563";
reg = <0x51>;
status = "okay";
};
驱动自动匹配:
drivers/rtc/rtc-pcf8563.c
加载日志:
rtc-hym8563 1-0051: registered as rtc2
七、RTC 实战:如何在 Jetson 上使用 HYM8563 获得准确时间?
这是你项目中最关键的部分。下面是完整流程。
✔ 步骤 1:确认 RTC 是否识别
dmesg | grep rtc
输出包含:
rtc-hym8563 1-0051: registered as rtc2
表示外部 RTC 完全正常。
✔ 步骤 2:读取 RTC 时间
hwclock -f /dev/rtc2 -r
✔ 步骤 3:写入一次准确的系统时间(非常重要)
- 校准系统时间:
date -s "2025-11-24 12:34:00"
- 写入 RTC:
hwclock -f /dev/rtc2 -w
✔ 步骤 4:系统启动时自动同步时间
创建脚本:
/usr/local/sbin/rtc-sync.sh
内容:
#!/bin/sh
hwclock -f /dev/rtc2 -s
添加 systemd:
/etc/systemd/system/rtc-sync.service
内容:
[Unit]
Description=Sync system clock from external RTC
After=multi-user.target
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/rtc-sync.sh
[Install]
WantedBy=multi-user.target
启用:
systemctl enable rtc-sync.service
这样设备每次开机都会自动从 HYM8563 校准系统时间。
八、如何判断你的 RTC 是否精准?(工程师必备)
1) 晶振精度(ppm)是关键
例如:20ppm → 每天误差约 1.7 秒。
2) 电容匹配
晶振两侧常用 6–12 pF。
- 电容偏大 → 走慢
- 电容偏小 → 走快
3) VBAT 稳定性
VBAT 掉电会导致时间丢失。
4) 温度影响
高温 → 晶振频率升
低温 → 频率降
若想极致准确 → 推荐 DS3231 或 RV-3028。
九、RTC 的高级功能:CLKOUT、闹钟、系统唤醒
✔ 1. HYM8563 的 CLKOUT(你已经看到了)
你执行的调试路径:
/sys/kernel/debug/clk/hym8563-clkout
说明 CLKOUT 已注册到 Linux 时钟框架,可输出:
- 32768 Hz
- 1024 Hz
- 32 Hz
- 1 Hz
用途:
- 提供稳定时钟给其他芯片
- LED 闪烁参考
- 低功耗唤醒模块
✔ 2. 闹钟功能(Alarm)
PCF8563/HYM8563 支持 Alarm 中断,可用于:
- 周期提醒
- 特定时间事件
✔ 3. 系统唤醒
部分 RTC(如 DS3231)可直接从深度休眠唤醒 CPU。
十、不同类型 RTC 对比(终极总结表)
| RTC 类型 | 代表芯片 | 振荡方式 | 主频率 | 精度 | 接口 | 功耗 | 特点 | 推荐度 |
|---|---|---|---|---|---|---|---|---|
| 标准 RTC(低成本) | PCF8563、HYM8563 | 外置晶振 | 32.768kHz | 20–50ppm | I2C | μA级 | 稳定通用 | ⭐⭐⭐⭐ |
| 高精度温补 RTC | DS3231 | 内置温补晶振 | 32.768kHz | ±2ppm | I2C | 约100μA | 工业最强精度 | ⭐⭐⭐⭐⭐ |
| 超低功耗 RTC | RV-3028 | 内置晶振 | 32.768kHz | 1ppm | I2C | 45nA | IoT 穿戴最佳 | ⭐⭐⭐⭐⭐ |
| 内部 RTC(SOC/PMIC) | Tegra RTC、SNVS | RC 振荡器 | 不稳定 | 100+ppm | 内部 | Very低 | 精度一般,仅备用 | ⭐⭐ |
| 带 SRAM 的 RTC | DS1302/DS1307 | 外置晶振 | 32.768kHz | 20–50ppm | 串行/I2C | μA | 经典但老旧 | ⭐⭐ |
十一、常见 FAQ(工程师实际遇到的问题)
1. 为什么我的 RTC 总是时间不准?
- 晶振电容配置错
- 晶振品质差
- VBAT 不稳
- 温度环境大
2. 为什么外部 RTC 是 rtc2?
因为有多个 RTC,编号不影响功能。
3. 能让 RTC 当系统启动时间源吗?
可以,用 systemd 自动同步即可。
4. 为什么 clkout 频率是 32768?
因为这是 RTC 标准频率,用于同步与校准。
十二、总结:如何让你的设备保持长久准确时间?
最终你只需要做三件事:
✔(1)写入一次准确时间(初始化)
hwclock -f /dev/rtc2 -w
✔(2)开机自动从 RTC 同步
hwclock -f /dev/rtc2 -s
✔(3)确保晶振 + 电容 + VBAT 正确
做到这些,你的设备将:
- 掉电多年也能保持准确时间
- 系统启动立即获取正确时间
- 日志、OTA、摄像头全部正常工作
深入解析RTC原理与实战调试
89

被折叠的 条评论
为什么被折叠?



