跳转至

RTC 应用指南

前言

概述

本文档主要介绍RTC的校准方案,确保RTC计时准确。

说明:

未有特殊说明,Hi3516DV500与Hi3519DV500、Hi3516CV608与Hi3516CV610内容完全一致。

产品版本

与本文档相对应的产品版本如下。

产品名称

产品版本

Hi3519D

V500

Hi3516D

V500

Hi3516C

V608

Hi3516C

V610

读者对象

本文档(本指南)主要适用技术支持工程师。

符号约定

在本文中可能出现下列标志,它们所代表的含义如下。

符号

说明

表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。

表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。

表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。

用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。

“须知”不涉及人身伤害。

对正文中重点信息的补充说明。

“说明”不是安全警示信息,不涉及人身、设备及环境伤害信息。

修订记录

修订记录累积了每次文档更新的说明。最新版本的文档包含以前所有文档版本的更新内容。

修订日期

版本

修订说明

2026-06-30

00B01

第1次临时版本发布

概述

RTC芯片分类

常见的RTC芯片,大致可分为三类:

  • 非集成RTC:只有RTC计时电路,不集成晶体、不集成温度补偿电路。这类芯片的计时精度主要取决于外接晶体的精度,而且受温度影响较大。通常在室温环境下,计时精度较高;随着温度升高或降低,计时偏差逐渐增大。
  • 集成晶体的RTC:将RTC计时电路与晶体集成,但没有温度补偿电路。这类芯片在室温环境下,计时精度更高。但仍然无法消除温度的影响。
  • 集成RTC:将RTC计时电路、晶体、温度补偿电路(含温度传感器)都集成在一颗芯片中,出厂时进行调教。这类RTC的计时精度可以做到很高,且由于温补电路的作用,受环境温度的影响很小。

RTC工作模式

内置RTC可支持固定分频模式:

  • 与非集成RTC相同,内置RTC的时钟直接采用外部晶体与振荡电路产生的经过分频后的时钟,工作时分频比固定不变。这种工作模式下,RTC计时精度取决于外接晶体的频率精度,而且受环境温度影响。在非集成RTC这类芯片适用的场景,可以选择内置RTC替代外置非集成RTC,节省一些器件成本。
  • HI3519DV500 RTC无内置温度补偿电路,只支持工作在固定分频模式,若RTC时钟的频偏较大,可通过调节RTC的分频系数来微调RTC的时钟频率。对计时精度有严格要求的客户,建议选择集成晶体的RTC,或者带有温度补偿的RTC。

RTC的硬件参考电路

硬件参考电路

RTC的硬件参考电路如图1所示,主要涉及晶体和电容的选择。

图 1 RTC晶体的硬件参考电路

选择晶体

选择晶体需要注意以下几个指标:

  • 标准负载电容(Load capacitance/CL):晶体的标准负载电容,晶体对负载电容有着严格的规定,只有实际负载电容和晶体的SPEC中的负载电容一致时,晶体频率才能达到标称频率。
  • 串联电阻(Series resistance/Rs/ESR):晶体的谐振腔等效串联电阻,当ESR越大,表示晶体越难以驱动。晶体规格中会指出Rs的典型值与最大值。

    芯片晶体振荡电路适用于Rs最大值<70KΩ的晶体。

  • 最大驱动级别(Max Drive Level/DL):表示晶体最大的振荡幅度,当振荡幅度超过一定幅度时,晶体容易发生损坏。

晶体选型约束,如表1所示。

表 1 晶体选型约束表

参数

符号

MIN

TYP

MAX

单位

串联电阻

ESR

-

-

70

KΩ

负载电容

CL

-

12.5

-

pF

Shunt Capacitance

C0

1

-

2

pF

Motional Capacitance

C1

2

-

6

fF

选择电容

实际CL的示意图如图1所示。

图 1 实际CL的示意图

CL_SPEC=CL1//CL2+Cs1//Cs2+Cs3

Pierce振荡器中,一般将CL1与CL2取相同的值。

其中:

  • CL_SPEC为晶体规格书中规定的标准负载电容;
  • CL1、CL2为晶体匹配电容;
  • Cs1、Cs2、Cs3为寄生电容,一般取值为3~5pF。

以12.5pF的晶体为例,CL1与CL2一般取值为(12.5pF-3pF)*2=19pF。

因为寄生电容随PCB板设计以及晶体和主控选型不同而变化,故亦可确定PCB板设计以后,通过测试频偏来选取不同容值的CL1来获得最接近32.768kHz的输出频率,偏测试方法请参考“晶体相关指标测试方法”章节的相关内容。

Linux内核标准RTC驱动使用说明

编译

支持内核标准RTC驱动,使用前请打开内核RTC驱动选项。

注意:

打开 RTC 选项后没有接 RTC 电源或者 RTC 没有正常供电都会造成内核挂死。

使用

将内核烧写到单板后,启动单板,执行下面命令:

ls /dev/rtc0

能够查看到RTC设备,表示内核标准RTC驱动正确加载。

内核标准RTC驱动支持ioctl系统调用。

表 1 内核标准RTC驱动 ioctl指令功能描述

指令

功能描述

RTC_ALM_READ

读取闹钟时间

RTC_ALM_SET

设置闹钟时间

RTC_SET_TIME

设置时间与日期

RTC_PIE_ON

开RTC全局中断

RTC_PIE_OFF

关RTC全局中断

RTC_AIE_ON

使能RTC闹钟中断

RTC_AIE_OFF

禁止RTC闹钟中断

RTC_UIE_ON

使能RTC更新中断

RTC_UIE_OFF

禁止RTC更新中断

RTC_IRQP_SET

设置中断的频率

设置获取时间

  • 通过如下命令可设置RTC时间:

    ioctl(fd, RTC_SET_TIME, &rtc_tm);
    
  • 通过如下命令可获取RTC时间:

    ioctl(fd, RTC_RD_TIME, &rtc_tm);
    

晶体相关指标测试方法

频偏测试

  • 用频率计通过同轴电缆连接专门的时钟测试脚(TEST_CLK)在U-Boot下,配置寄存器,将管脚复用为CLK_TEST功能,并选择32.768kHz时钟信号输出,测试RTC频率。
  • 强烈建议:不要在晶振引脚上用示波器直接测量(一个典型无源探头的电容值在 10pF 之内,输入阻抗大约为 10MΩ。 两个值都会大大影响晶体振荡器的运行方式)。
  • 当测得的频率过高时,负载电容的值必须增加,当测得的频率太低时,就要减少负载电容的值。客户可根据自己的产品需求来确定晶体振荡频偏范围。

须知:

在单板设计时需要将TEST_CLK管脚引出测试点,方便后续晶体指标测试。

安全因子测试

增加一个与晶振串联的电阻RQ,如图1所示。增加RQ的值,直到晶体恰好不起振,得到RQ电阻最大值RQmax。(RQmax的值应该由 SMD 电阻进行验证,不建议用可调电位器)。

图 1 安全因子测试示意图

借助于以上测试,可测得晶体振荡电路振荡裕度 (OA) 和安全因子。

振荡裕度 OA =RQmax + ESR

安全因子 (SF):

表 1 安全因子约束限定条件

安全因子(SF)

限定条件

SF<2

不安全

2≤SF<3

适用

3≤SF<5

安全

SF≥5

非常安全

注意:要求安全因子至少大于3。

例:晶体ESR为60kΩ,如果串联的额外电阻RQmax为120kΩ,则刚刚达到安全级别。

DL测试

芯片晶体振荡电路内部限制了RTC_XIN与RTC_XOUT管脚振荡的振荡幅度,可以通过以下公式估计电路工作时的实际Drive Level,并确定此值小于晶体规格中规定的最大Drive Level。

DL_actual=0.35*Rs_max*(π*f*VppXOUT*CL)2/2

其中:

  • Rs_max为晶体规格书中的串联电阻的最大值。
  • f为晶体的谐振频率。
  • VppXOUT为示波器测量的RTC_XOUT管脚的peak to peak电压。
  • CL为晶体规格书的标准负载电容。

说明:

由于测试电压时示波器探头的寄生电阻和电容效应,会导致测试结果存在偏差,因此以上公式只是较简单的估算DL的方法,如果有需求, 可以找晶体厂商进行更精确测试。

起振时间测试

一般情况下,对于RTC振荡电路而言,介于几百毫秒到几秒钟之间的起振时间均为正常值,晶体振荡器的起振时间取决于不同的因素:

  • 频率越低起振时间就越长(相对24MHz系统时钟)。
  • 负载电容越大,起振时间就越长。
  • 晶体ESR越高起振时间就越长(晶体选型时关注)。
  • 振荡裕度 (OA)越大,启动快(也就是说安全因子越大,启动越快)。
  • 晶体寄生电容越大,起振时间越长。

鉴于以上因素的影响,测试起振时间前,优先测试安全因子和频偏。

用示波器量测RTC_Xout波形,捕获波形第一个上升沿,量测从第一个上升沿到输出稳定频率的时间,如图1所示。

图 1 起振时间示意图

Q&A

振荡器不振

【现象】

32.768K时钟无输出,RTC计时电路中的秒寄存器值恒定不变。

【分析】

使用示波器探头观察RTC_XIN管脚振荡波形,引起不同的振荡波形的情况有以下几种:

  • 如果无振荡波形,可能是晶体损坏。
  • 如果有32K左右频率正弦波,且peak to peak幅度小于600mV,则可能是因为CL1与CL2过大,导致振荡电路驱动不足,从而幅度偏小,振荡波形无法通过后续的施密特触发器。
  • 如果有200K左右频率的正弦波,且peak to peak幅度小于600mV,则可能是因为CL1与CL2偏小,导致振荡电路振荡到200K频点,且由于200K频点振幅较小,所以无法通过后续的施密特触发器。

【解决】

  • 如果确定晶体损坏,请更换晶体。
  • 如果为32K左右频率正弦波,幅度不够,请检查CL1与CL2是否偏大,并更换正确的电容。
  • 如果为200K左右频率正弦波,幅度不够,请检查CL1与CL2是否偏小,并更换正确的电容。

振荡器的输出频率是200K

【现象】

32.768K时钟输出频率接近200K,RTC计时电路中的秒寄存器值每秒钟增加6。

【分析】

因为32.768K晶体存在6.1倍频的谐振点,如果晶体有异常,则可能振荡到6倍频附近。

【解决】

建议首先检查CL1与CL2是否偏小;如果CL1与CL2为正确值,但振荡频率仍然为200K,则可以在电路中添加如图1所示的Rd,Rd取值为1/(2π x 32768 x CL2),Rd与CL2可以形成一个RC滤波器,降低6.1倍频处的环路增益。

图 1 200K振荡解决方案电路

说明:

一般情况不建议增加Rd,如果采用增加Rd的方法,需要确定RTC_XOUT管脚信号幅度不会过小。

振荡频率虽然是32.768K附近,但是频率却不准

【现象】

32.768K时钟输出频率偏离32.768K。

【分析】

振荡电路振荡频率主要由晶体和负载电容共同保证,晶体本身确定了频率的大致范围(即图1所示中的0偏差对应的频率),而实际负载电容的大小则确定了频率的偏移量(即图1所示中的实际频率偏离0的值)。

图 1 频率偏差和负载容量CL的关系

【解决】

如果频率偏离了32.768K,首先需要确认晶体引脚弯折不会对内部晶体部分施加应力,并确定焊接过程中的温度符合datasheet规范;其次,检查CL1与CL2取值是否正确,并更换正确的电容。