0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux的RTC回到了1970年,是时光倒流了么?

ZLG致远电子 2024-12-17 11:37 次阅读

导读

RTC是一种用于记录时间的电子设备,广泛应用于各种嵌入式系统中。本文通过实际案例分析RTC在实际应用中的问题并给出实际建议,如时间“归零”、RTC时间误差过大等。

RTC (Real Time Clock):实时时钟,是一个独立的定时器,无论器件处于运行模式、低功耗模式还是复位状态,只要电源电压保持在工作范围内,RTC就会一直工作,实现计时功能。RTC电路虽然简单,但实际应用中还是会出现一些问题,例如时间“归零”、RTC时间误差过大等等,既涉及到硬件方面,也涉及到软件方面。下面结合实际遇到的问题进行一些方案讨论和建议。

另外,在32位Linux系统上,不可避免的会遇到2038年问题,也放在这里一并阐述。

4bd26ad8-bc28-11ef-8084-92fbcf53809c.jpg  从仓库发货的全新产品,为何RTC时间是1970年?

全新产品,开机后系统时间是1970年,有两种可能性:

产品RTC电池没有正确安装,或者锂电池与电池仓之间的隔离塑料垫片没有去掉,RTC没电不工作。

  1. 安装了RTC电池,但RTC电池已经被耗尽,这情况一般出现在较长时间库存产品上。

提示:RTC独立供电的产品,使用前必须正确安装RTC电池,并在第一次开机的时候设置正确的RTC时间。库存产品,不安装RTC电池,或者在安装电池时做好供电隔离。

4bd26ad8-bc28-11ef-8084-92fbcf53809c.jpg  产品运行一段时间后,RTC变成1970年了,引起程序运行异常

正常运行的系统,经过一段时间后内核出现如下提示:

rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable.

说明RTC电池电压已经偏低。这样会导致RTC时间不可靠,从而影响到Linux系统时间的准确性。

PCF8563芯片具有电池电压检测功能,当电压低于0.9V时将无法保证时钟信息的准确性(参考图1),进而导致系统运行异常。

4c0f0510-bc28-11ef-8084-92fbcf53809c.jpg

图1 PCF8563RTC芯片低压检测功能

为了避免出现RTC电池电压偏低的情况,可以做如下方面的考虑:

  • 可考虑用可充电的RTC电池,并设计充电电路;
  • 关闭RTC芯片的CLKOUT功能,降低RTC功耗,延长RTC电池续航时间;
  • 增加超级电容,正常上电时由系统电源供电,系统掉电后由超级电容供电,超级电容耗尽再用锂电池供电。

图2是RTC多电源供电参考原理图。

4c28b280-bc28-11ef-8084-92fbcf53809c.jpg

4c312a6e-bc28-11ef-8084-92fbcf53809c.png

图2 RTC多电源供电参考原理图

设计时需注意以下几点:

RTC_VDD 仅供电给时钟芯片的VDD引脚;

RTC_VDD供电线路上使用的二极管选型低压降、低漏电流

I2C 上拉电阻使用系统电源;

预留CLKOUT 信号测试点,用于调试时钟精度,调试结束后关闭该功能可减少功耗。


4bd26ad8-bc28-11ef-8084-92fbcf53809c.jpg  让人头疼的“2038年”问题

先介绍一下UNIX世界的时间,Unix纪元时间是从协调世界时(UTC)1970年1月1日0点开始算起,到现在的总秒数。这个时间也被称为POSIX时间。Linux沿用UNIX时间,在32位处理器的Linux系统里,定时器是32位的,最大计数是0xFFFFFFFF,而在Linux系统中,rtc_time定义的是秒、分、小时等都是有符号整数。

struct rtc_time { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst;};

32位定时器有符号整数最大计数为0x7FFFFFF,换算成十进制是2147483647。

2147483647秒,换算成年的话,是68.09625973490614年,大概是68年零18天。所以,UNIX时间,从1970年1月1日零时起,经过68年零18天后(确切是2038年1月19日中午1107),计数器溢出,RTC将无法正常工作。在32位系统上解决这个问题,需要升级到Linux内核到高版本,同时升级glibc,工作量很大,对一些发布较久的处理器,原厂不一定能提供新版本内核,这是很让人头疼的。如果选用选用64位处理器,跑64位Linux系统就没这个问题了。

升级到64位Linux系统后,RTC计数器最大值为0x7FFFFFFFFFFFFFFF,换算成十进制是9223372036854775807。9223372036854775807秒,换算成年,大约是292亿年,完全不用去考虑RTC时间溢出的问题了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11372

    浏览量

    211154
  • 实时时钟
    +关注

    关注

    4

    文章

    283

    浏览量

    66159
  • RTC
    RTC
    +关注

    关注

    2

    文章

    585

    浏览量

    67369
收藏 人收藏

    评论

    相关推荐

    如何利用RTC外设实现万历功能

    本小节讲解的是如何利用RTC外设实现万历功能,本实验工程与RTC底层驱动相关的文件为bsp_rtc.c/h,在底层驱动之上我们添加了bsp_calendar.c/h和bsp_date
    的头像 发表于 02-18 16:56 528次阅读

    飞凌嵌入式ElfBoard ELF 1板卡-开发板适配之I2C-RTC

    \\ 02-Linux 源代码\\02-1 驱动源码\\13_rx8010\\rtc-rx8010.c拷贝到内核源码的drivers/rtc/路径下: 二、修改Kconfig: elf@ubuntu
    发表于 02-14 10:10

    RTC时钟芯片+电池的应用案例(一)

    实时时钟,简称RTC,是广泛应用于电子产品的重要元器件。爱普生RTC实时时钟具有高精度、高稳定性和多功能的特点,目前广泛应用于多个行业。下面通过几个视频来详细了解一下爱普生RTC实时时钟在工业以及
    的头像 发表于 01-08 11:25 549次阅读
    <b class='flag-5'>RTC</b>时钟芯片+电池的应用案例(一)

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-shell编程入门之提取字符并设置rtc时间

    ,主要分为以下几个步骤: 一、使用echo命令输出一段提示信息,表示开始测试RTC功能。 二、使用date命令设置系统时间为20231月1日0时0分0秒。 三、使用hwclock命令将系统时间写入
    发表于 12-12 17:26

    飞凌嵌入式ElfBoard ELF 1板卡-shell编程入门之提取字符并设置rtc时间

    控制和条件处理; 五、支持与其他Unix及Linux命令行工具配合使用; awk的语法结构比较简单,它的基本语法格式如下: awk \'pattern {action}\' filename 设置rtc时间
    发表于 12-11 16:49

    RTC与WebRTC的主要区别

    在数字通信领域,实时通信(RTC)和WebRTC是两个经常被提及的术语。它们都旨在提供即时的、高质量的通信体验,但它们在实现方式、应用场景和技术支持上有所不同。 1. 定义与起源 1.1 实时通信
    的头像 发表于 12-11 15:41 714次阅读

    RTC技术在实时通信中的应用 RTC与VoIP的区别

    在数字化时代,实时通信(RTC)技术已经成为我们日常生活和工作中不可或缺的一部分。从视频会议到在线教育,从远程医疗到社交网络,RTC技术都在发挥着重要作用。 一、RTC技术在实时通信
    的头像 发表于 12-11 15:38 1044次阅读

    提升效率:RTC时钟实用设置

    今天来给大家讲解的是RTC时钟实用性,提升绝对的效率。
    的头像 发表于 11-04 16:35 1002次阅读
    提升效率:<b class='flag-5'>RTC</b>时钟实用设置

    什么是RTC模块?

    什么是“RTC”?“RTC”是实时时钟的缩写,它是一种测量时间的电子设备。什么是“RTC模块”?“RTC模块”是一个集成了RTCIC、振荡器电路和主时钟的单封装模块。无需自行设计振荡器
    的头像 发表于 07-24 14:14 669次阅读
    什么是<b class='flag-5'>RTC</b>模块?

    esp32c3的rtc gpio不足怎么解决?

    关于esp32c3,我看io0-io3不建议使用,那么rtc gpio 就只有io4和io5了,但我需要用2个rtc io和一个有adc功能的io,有什么办法?多谢。
    发表于 06-18 06:38

    不修改menuconfig的话,有哪个API可以修改rtc时钟源

    rtc_clk_slow_freq_set(RTC_SLOW_FREQ_32K_XTAL);)来设置时钟源的时候,一直不能唤醒。 不修改menuconfig的话,有哪个API可以修改rtc 时钟源
    发表于 06-14 08:08

    使用STM8L做内部RTC做时钟,时钟计时计到了超过24时怎么解决?

    我在使用STM8L做内部RTC做时钟的时候,发现了一个问题。时钟计时计到了超过24时。昨天下午我设置了一个初始时间,今天早上8:19的时候读取STM8内部RTC时间显示的是 2018.8.2932:19:05时间计时
    发表于 04-19 06:59

    STM32F103 RTC日期读取不对怎么解决?

    STM32F103 RTC日期读取不对问题,有没有什么办法解决?这个问题究竟是STM32的库本身有问题还是其他什么原因呢?如果是库的问题,难道ST公司这么多年了,一直都不管
    发表于 04-16 07:08

    STM32L431 RTC时间混乱问题如何解决?

    我现在在用STM32L431做门锁,5号电池供电(有纽扣电池),五百台门锁生产时写入读出正常(2022),从工厂运回公司,抽检发现某台门锁的RTC时间混乱了,变成了2073,断电重启后还是
    发表于 03-22 07:41

    RTC电池寿命的评估考虑因素

    本案例是一个带RTC功能的工业产品,RTC部分的供电电路如下下图,产品发往市场半年以后,就提示更换RTC电池,远远低于设计寿命5
    发表于 03-15 10:29 774次阅读
    <b class='flag-5'>RTC</b>电池寿命的评估考虑因素