时钟
对于一个设备来讲,通常会有两个时钟一个被称为硬件时钟另一个被称为系统时钟。
硬件时钟
指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟,也称为 RTC或 BIOS 时钟。这是电池供电的时钟,即使在系统关闭时也能保持时间。
系统时钟
由操作系统维护,所有Linux相关指令与函数都是读取系统时钟的设定,包括systick也是属于系统时钟。当系统启动的一瞬间,硬件时钟被读取并用于设置系统时钟。从这个时刻起,系统时钟用于跟踪时间,软件时钟在硬件上是由计数器配合工作的。
而系统时钟频率指cpu产生中断供软件系统执行调度的时间间隔。一般一次中断我们叫一个tick。比如我们将系统时钟频率设置为100(sysClkRate函数可设置),即意味着1秒钟会产生100次中断供系统软件调度。
RTC简介
RTC :Real Time Clock,实时时钟
实时时钟是系统使用的一种时钟功能,即使在主设备(例如 MCU)断电时也可以通过电池或者超级电容器为RTC提供电能测量时间。当微控制器处于深度睡眠或低功耗模式时,RTC 的内部时钟和电路将继续运行以保持准确的计时和警报功能。在这种模式下,电流消耗将低至 0.2uA——0.5uA
功能
无论是对于内置RTC的MCU或者外置RTC芯片来说,通常都会具有以下几种功能:
- 定时器
- 通过软件配置,提供日历功能
- wakeup唤醒功能 / Alarm 闹钟功能
原理
RTC实质是一个掉电后还继续运行的定时器。
结构
说明
时钟源
以STM32来讲,通常由三个时钟源可供选择
- 外部低速时钟LSE,频率32.768KHz
- 内部低速时钟LSI
- 外部高速时钟HSE,一般是需要通过PLL分频得到RTC所需时钟
对于LSI、HSE来讲在主电源断电的情况下,两个时钟源都会受到影响,所以通常使用LSE外部晶振。而晶振的时钟频率为32768Hz,这是因为2^15=32768,一个十六位寄存器即可表征,同时分频出1hz时钟
中断源
- 闹钟中断,当设置的闹钟等于计数值的时候则产生一个闹钟中断。同时它也可以作为唤醒休眠的设备功能
- 秒中断,每1s产生一个中断
- 溢出中断,计数器溢出变成0
电源
对于RTC有两种供电方式,主电源存在则使用主电源。当主电源断开,如果电池有电则电池继续供电保证RTC的正常工作。对于有些设备使用纽扣电池做备用电源,所以这一定是低功耗的
linux下RTC相关命令
当Linux启动时,系统时钟会去读取硬件时钟的设定,之后系统时钟即独立运作。用date命令对系统时间进行设置后,并不会去修改硬件时钟,所以系统重启后,系统时间还算会去读取硬件时间,这就是为何date设置失效到原因。因此,需要在设置系统时间后,需要将系统时间同步到硬件时钟。
timedatectl
使用文档:click here
timedatectl可用于查询和更改系统时钟及其设置,以及启用或禁用时间同步服务
1 | 使用方式:timedatectl [选项...] {命令} |
date
使用 date 命令设置系统时间不会自动同步 RTC,只针对系统时间
1 | date #查看系统时间 |
hwclock
使用文档:click here
1 | hwclock --show # 查看硬件时间 |
alarm
在睡眠模式下,RTC 可用于稍后唤醒系统。并非所有 RTC 都支持这种唤醒模式,请检查 wakealarm 文件的可用性。
要启用从现在起 20 秒后唤醒,可以使用以下语句:
1 | echo +20 > /sys/class/rtc/rtc2/wakealarm |
Q&A
Q:软件设计读取时间?
A:上电之后,同时读取系统时间和硬件时间,并计算差值。在之后的任意时刻想要读取时间即可读取软件时间+差值即可得到实际时间,这样减少了频繁读取RTC的次数
Q:soc系统中,rtc作为一个重要内置的电路单元,对于低功耗设计有重要的意义。rtc电路是单独设计电源域。内部RTC难点?
A:CPU面积小,但需要有读写隔离区;面积小,静电不容易消除;占用芯片较大面积
RTC不受RESET控制,可监测Reset