我在v3s上运行QT程序,输出结果中使用了QTime类进行当前时间的获取,但是获取的结果跟当前时间好像完全不相关,程序在Ubuntu上运行时输出是正确的,请问这个问题可以怎么解决?是开发板的设置问题?
离线
命令行输入 date 看下时间是多少?
好像是这个硬件系统时间问题,我显示尝试着移植ntpdate进行网络时间同步,或者还是有其他解决方法?我的程序需要实时获取当前时间
离线
离线
现在校准时候后通过hwclock -w写入硬件时钟,但是我发现跑了一个下午,这时间就差了好几分钟,这有什么解决办法?
离线
这个RTC是跑在32K的
不是32.768k
只有掉电才跑在32.768
上电会计算一掉电跑了多久
然后减去这个时间 重新设置
好了 设置成内部32K时间正常
这个就是让在掉电的时候 自动切换到LOSC
想到解决办法了 设置时间全部设置成0 之前的时间算成秒写到后备域里 每次秒中断里
计算设置后的秒 减去这些时间多出的值 在加上之前的秒 在反推出时间就是用utc
全志坑卓应该就是这么做的
32768的晶振 每分钟快1.4秒多
神一样设计
离线
讲得好像很复杂。。。。重点是这个设置内部时间32K?还有请问一下这个内部时间32K是在哪改?
离线
讲得好像很复杂。。。。重点是这个设置内部时间32K?还有请问一下这个内部时间32K是在哪改?
其实我也没有看明白.
https://github.com/qq516333132/camdroid/blob/master/lichee/linux-3.4/drivers/rtc/rtc-sunxi.c
你看下 camdroid的驱动:
#define OSC_32K 32000
#define OSC_ORG 32768
/*
* This RTC count flow on sun8iw8 platform.
* 32.768KHz--- --- [32768 count] ---
* \/ \___[seconds reg]
* /\ /
* 23KHz --- --- [32000 count] ---
*
* We can calculate how much seconds missing, call sunxi_rtc_fixup.
*/
void sunxi_rtc_fixup(unsigned long *org_time, unsigned long *time)
{
unsigned long delta;
unsigned long t1, t2;
bool out;
if (!time)
return;
if (!org_time) {
t1 = (unsigned long long)sunxi_rtc_read(SUNXI_GPDATA_REG(6)) << 32;
t1 |= (unsigned long)sunxi_rtc_read(SUNXI_GPDATA_REG(7));
} else
t1 = *org_time;
t2 = *time;
out = sunxi_rtc_read(SUNXI_LOSC_CTRL_REG) & RTC_SOURCE_EXTERNAL;
delta = (t2 > t1) ? (t2 - t1) : (t1 - t2);
delta = (delta * (OSC_ORG - OSC_32K)) / OSC_ORG;
if (out)
*time -= delta;
else
*time += delta;
}
void sunxi_rtc_save(unsigned long time, bool force)
{
unsigned long long tsec = (unsigned long long)time;
unsigned int save = (0x80000000 & sunxi_rtc_read(SUNXI_GPDATA_REG(6)));
if (force || !save) {
sunxi_rtc_write((unsigned int)tsec, SUNXI_GPDATA_REG(7));
sunxi_rtc_write(((unsigned int)(tsec >> 32) | 0x80000000), SUNXI_GPDATA_REG(6));
}
}
/*
* If it first time read and have not save it
* we should save it to backup register
*/
sunxi_rtc_save(time, false);
rtc_tm_to_time(rtc_tm, &time);
sunxi_rtc_fixup(NULL, &time);
rtc_time_to_tm(time, rtc_tm);
dev_dbg(dev, "Read hardware RTC time %04d-%02d-%02d %02d:%02d:%02d\n",
rtc_tm->tm_year + 1900, rtc_tm->tm_mon + 1, rtc_tm->tm_mday,
rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec);
这个骚操作.
而主线的 RTC 没有做这样的修正操作.
离线
V3s自带RTC芯片,或者用外置的i2c RTC芯片,比如pcf8563等
晕哥,由于v3s没有电池对rtc进行供电,断电后硬件时间会重置,我使用外部纽扣电池给rtc进行断电供电来保持硬件时间的一致,这样的方法可行?还有就是v3s自带rtc芯片是下图这个?
离线
https://whycan.cn/files/members/370/QQ20180202112836.jpg
https://whycan.cn/files/members/370/QQ20180202112307.png
终于解决V3s自带的RTC不准问题,
电阻电容调大又调小,始终解决不了时间不准问题,
淘宝买一片PCF8563, 外挂上去解决这个问题。dts修改:
&i2c0 {
status = "okay";ns2009: ns2009@48 {
compatible = "nsiway,ns2009";
reg = <0x48>;
};
rtc@51 {
compatible = "nxp,pcf8563";
reg = <0x51>;
};
};PCF8563驱动加入内核:
CONFIG_RTC_DRV_PCF8563=y
如果我使用外接PCF8563的方法,大概怎么去接。。。
离线
接上电源和地,i2c 两个脚接上就可以了
离线
学习了,RTC设计的秀
离线