Fork me on GitHub
0%

RTC

时钟

对于一个设备来讲,通常会有两个时钟一个被称为硬件时钟另一个被称为系统时钟。

  • 硬件时钟

    指主机板上的时钟设备,也就是通常可在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芯片来说,通常都会具有以下几种功能:

  1. 定时器
  2. 通过软件配置,提供日历功能
  3. wakeup唤醒功能 / Alarm 闹钟功能

原理

RTC实质是一个掉电后还继续运行的定时器。

结构

image

说明

时钟源

以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
2
3
4
5
# 使用方式:timedatectl  [选项...]  {命令}

$ timedatectl # 查看时钟设置
$ timedatectl list-timezones # 显示可用时区列表
$ timedatectl set-timezone Europe/London # 设置时区

date

使用 date 命令设置系统时间不会自动同步 RTC,只针对系统时间

1
2
$ date 									#查看系统时间
$ date "2022-01-20 17:50:30" #设置系统时间

hwclock

使用文档:click here

1
2
3
4
$ hwclock --show								# 查看硬件时间
$ hwclock --set --date '2021-01-13 14:37:23' # 设置硬件时间
$ hwclock -w # 将系统时间同步到硬件时间
$ hwclock -s # 将硬件时间同步到系统时间

alarm

在睡眠模式下,RTC 可用于稍后唤醒系统。并非所有 RTC 都支持这种唤醒模式,请检查 wakealarm 文件的可用性。

要启用从现在起 20 秒后唤醒,可以使用以下语句:

1
echo +20 > /sys/class/rtc/rtc2/wakealarm

Q&A

  1. Q:软件设计读取时间?

    A:上电之后,同时读取系统时间和硬件时间,并计算差值。在之后的任意时刻想要读取时间即可读取软件时间+差值即可得到实际时间,这样减少了频繁读取RTC的次数

  2. Q:soc系统中,rtc作为一个重要内置的电路单元,对于低功耗设计有重要的意义。rtc电路是单独设计电源域。内部RTC难点?

    A:CPU面积小,但需要有读写隔离区;面积小,静电不容易消除;占用芯片较大面积

  3. RTC不受RESET控制,可监测Reset

参考资料