硬件实时时钟(RTC)
硬件实时时钟(RTC)详解
硬件实时时钟(Real-Time Clock,RTC)是计算机主板上的一个独立计时芯片,用于在系统关机后持续记录时间。它不依赖操作系统,由纽扣电池(如CR2032)供电,保证时间数据持久化。
1. RTC 核心特性
特性 | 说明 |
---|---|
独立性 | 不依赖CPU或操作系统,断电后仍运行(靠电池供电) |
精度 | 通常误差 ±2ppm(约每月±5秒),高精度RTC(如DS3231)可达 ±0.5ppm |
接口 | 通过I²C或SPI与系统通信 |
时钟源 | 32.768kHz晶振(分频后生成1Hz信号) |
电池寿命 | 典型CR2032电池可使用3-10年 |
2. Linux 中的 RTC 操作
(1) 查看系统时间与硬件时间
# 系统时间(软件时钟)
date# 硬件时间(RTC)
sudo hwclock --show
(2) 同步时间
# 将系统时间写入RTC
sudo hwclock --systohc# 从RTC读取时间到系统
sudo hwclock --hctosys
(3) 检查RTC设备
# 列出RTC设备
ls /dev/rtc*# 查看RTC详细信息
sudo dmesg | grep rtc
3. RTC 与系统时钟的关系
-
系统时钟:
由Linux内核维护,依赖CPU计时和NTP同步,关机后失效。
(可通过date
命令修改) -
硬件时钟(RTC):
物理芯片记录的时间,持久化存储。
(通过hwclock
命令管理)
同步流程:
- 开机时:RTC时间 → 系统时间(若未配置NTP)
- 关机时:系统时间 → RTC时间(需手动或自动同步)
4. 配置自动时间同步
(1) 启用NTP与RTC同步
编辑 /etc/systemd/timesyncd.conf
:
[Time]
NTP=pool.ntp.org
FallbackNTP=0.pool.ntp.org 1.pool.ntp.org
重启服务:
sudo timedatectl set-ntp true
sudo systemctl restart systemd-timesyncd
(2) 设置时区
sudo timedatectl set-timezone Asia/Shanghai
(3) 检查时间同步状态
timedatectl status
输出示例:
Local time: Wed 2023-10-04 15:30:00 CSTUniversal time: Wed 2023-10-04 07:30:00 UTCRTC time: Wed 2023-10-04 07:30:00Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yesNTP service: activeRTC in local TZ: no
5. 常见问题
(1) RTC时间与系统时间不一致
原因:
- 未启用NTP同步
- 时区配置错误
- RTC电池电量不足
解决:
# 强制同步
sudo hwclock --systohc
(2) RTC时间显示为UTC
若希望RTC存储本地时间(不推荐):
sudo timedatectl set-local-rtc 1
(3) RTC设备未识别
检查内核日志:
dmesg | grep rtc
若未检测到,可能是主板驱动问题或电池失效。
6. 嵌入式开发中的RTC
在嵌入式Linux中,需确保:
- 内核启用RTC驱动:
make menuconfig # 勾选 Device Drivers → Real Time Clock
- 设备树(DTS)配置RTC节点:
&i2c1 {rtc@68 {compatible = "maxim,ds3231";reg = <0x68>;}; };
7. 总结
操作 | 命令 | 说明 |
---|---|---|
查看RTC时间 | sudo hwclock --show | 显示硬件时钟 |
系统时间→RTC | sudo hwclock --systohc | 同步到硬件 |
RTC时间→系统 | sudo hwclock --hctosys | 同步到系统 |
启用NTP自动同步 | sudo timedatectl set-ntp true | 依赖网络时间协议 |