linux RTC时钟时间出现了明显的偏移

news/2024/7/19 4:55:31 标签: linux, 实时音视频, 驱动开发, 嵌入式硬件

RTC时钟时间出现了明显的偏移

  • 1、开发环境
  • 2、问题阐述
    • 3、验证问题
        • 3.1、首先去排查了硬件电路和芯片电压不稳定的问题。
        • 3.2、晶振的问题。
        • 3.3、芯片本身
        • 3.4、芯片寄存器
    • 4、代码修改

1、开发环境

平台:imx6ul
kernel版本:linux4.1.5
RTC芯片:PCF85063
硬件电路图如下所示
在这里插入图片描述

2、问题阐述

硬件时钟RTC往往是用作系统在掉电后,用纽扣电池维持硬件时钟继续运转时间。待系统起来后,再将硬件时间同步到系统时间上。
所以,硬件时间是否准确就很重要了。最近发现一款RTC芯片PCF85063,稍微运行个3-4个小时,就会跟系统时间出现明显的时间偏移(大概是2-3秒),按这个计算一天就12秒左右了。这是完全不可以接受的。
影响时间不准有几大因素:
1、输入时钟(晶振)
2、芯片本身
3、芯片电压不稳定
4、硬件电路问题
接下来我们去验证

3、验证问题

3.1、首先去排查了硬件电路和芯片电压不稳定的问题。
3.2、晶振的问题。

不同的晶振输出的频率都会有所差异,比如同样是32.768KZ的不同型号的晶振,在同一个板子上,分别会出现快了5秒和慢了3秒的情况。
经过实验,分别换电路图中晶振的负载电容,比如5pf,7pf,12.5pf,15pf,22pf。确实是会出现不用程度的时间偏移,
但优化程度远远没有达到目标偏移值。

3.3、芯片本身

将芯片放在其他不同型号,封装一样,稳定的板子上测试,这里我推荐是pcf8563,这里基本上可以推测出是晶振还是芯片的问题了。

3.4、芯片寄存器

查看一下这个型号的手册,发现这个RTC芯片比较特殊,居然有个偏移寄存器PPM。
可以通过这个寄存器去校正晶振频率带来的频移。从而使芯片大约1秒滴答一次。
在这里插入图片描述
寄存器说明如下所示,默认为0x00
在这里插入图片描述
在这里插入图片描述
我个人把这个称为低功耗模式,另一个是性能模式。为什么这么说。一个是2个小时偏移一次,另一个是4分钟偏移一次。通过不断实验对比,得到较为稳定的值即可。

4、代码修改

通过实验得到偏移寄存器的偏移值,再通过pcf85063.c驱动代码的形式写进去即可,如下所示。

static int pcf85063_rtc_mode(struct device *dev, unsigned int arg, unsigned long cmd)
{
	struct i2c_client *client = to_i2c_client(dev);
	unsigned char buf[2];
	unsigned char val;
	int err;

	buf[0] = arg;
	buf[1] = cmd;
	err = i2c_master_send(client, buf, sizeof(buf));
	if(err != sizeof(buf)) {
		dev_err(&client->dev, \
				"%s: err=%d addr=%02x, data=%02x\n",
				__func__, err, buf[0], buf[1]);
			return -EIO;
	}
		

	return 0;
}
static int pcf85063_probe(struct i2c_client *client,
				const struct i2c_device_id *id)
{
//......省略
	ret = device_create_file(&client->dev, &dev_attr_clk_out_ctl);
	if(ret != 0)
		dev_err(&client->dev, "%s: device create file err\n", __func__);

	pcf85063_rtc_ioctl(&client->dev, CLKOUT_OFF, 0);
	+ pcf85063_rtc_mode(&client->dev, 0x02, 0xe0);
	return PTR_ERR_OR_ZERO(pcf85063->rtc);
}

http://www.niftyadmin.cn/n/5544557.html

相关文章

【基于R语言群体遗传学】-12-超显性与次显性

欢迎先看前面的博客,再继续进行后面的内容: 群体遗传学_tRNA做科研的博客-CSDN博客 当杂合子的适应度超出纯合子的范围时,二倍体能够展现出更多令人着迷的选择实例。这种形式的一种是杂合子优势,或称为“超显性”,其…

BAT-致敬精简

什么是bat bat是windows的批处理程序,可以批量完成一些操作,方便快速。 往往我们可以出通过 winR键来打开指令窗口,这里输入的就是bat指令 这里就是bat界面 节约时间就是珍爱生命--你能想象以下2分钟的操作,bat只需要1秒钟 我…

聚鼎装饰画:装饰画喊个与现在是什么情况

回眸历史长河,装饰画以其独特的魅力一直为人类生活环境添彩增趣。从古埃及的壁画到文艺复兴时期的油画,再到现代简约的线条画,装饰画如同时代的缩影,映射出不同历史阶段的文化特征与审美趣味。 在现代社会,装饰画的现状…

游戏开发面试题4

局部变量全局变量 全局变量是定义在函数外部的变量,它可以在函数的内外部的任何地方被访问和使用。全局变量通常定义在程序的开头,在整个程序运行期间都是可用的。局部变量是定义在函数内部的变量,它只能在函数的内部被访问和使用。局部变量…

图论学习 c++Ford-Fulkerson 方法

Ford-Fulkerson算法是用于求解最大流问题的一种经典算法。其核心思想是通过不断寻找增广路径来增加流量,直到找不到增广路径为止。每次找到一条增广路径,就增加相应的流量,更新残余网络。简单来说就是Ford-Fulkerson算法的工作过程&#xff0…

【SSL 2120】通信线路

题目大意 郊区有 n n n 座通信基站, p p p 条双向电缆,第 i i i 条电缆连接基站 A i A_i Ai​ 和 B i B_i Bi​。特别地, 1 1 1 号基站是通信公司的总站, n n n 号基站位于一座农场当中。现在,农场主希望对通信线…

日常记账微信小程序模板源码

日常记账微信小程序模板源码 模板介绍 一款实用的日常记账微信小程序模板下载。包含:引导页、登录、记账中心、消息、通讯录、个人中心等模块。 图片演示 日常记账微信小程序模板源码

阶段三:项目开发---民航功能模块实现:任务18:指挥航空公司架次与延误率占比

任务描述 内 容:在前面的“使用Spark清洗统计业务数据并保存到数据库”任务中,已经通过Spark Streaming 清洗程序,将Kafka中Topic为“task_Aftn”的报文数据,经过数据清洗后,保存到了MySQL数据库中;本节任…