嵌入式技术论坛
直播中

王丽

7年用户 1302经验值
私信 关注
[经验]

怎样去解决RTC芯片设置年份保存错误的问题呢


在imx 6q的4.1.15版本linux系统上适配hym8563这款rtc芯片,配置上驱动后产生了如上面的问题,设置时间没有问题,设置年份会比减六年存储。但是如果设置的是15年及以下就不会有这个问题。

这是时间的读取程序,使用了bcd2bin函数,将存入的bcd格式数据转成bin格式。
关于bcd格式和bin的区别:
Bcd格式有的也叫8421格式,或者叫8421bcd,学过数电肯定有印象。
Bin格式就是直接转成二进制数。
例如一个十进制15,转成二进制是1111
转成bcd格式是,0001 0101
再看一下时间写入的函数:

这里是用了bin2bcd函数,将bin数据转成bcd格式。
比如要存入一个15,程序读进来是1111,用bin2bcd转成0001 0101存入buf数组。
为什么要用,bcd码来存储?用1111这种方式不是很直观,16直接进位变成10000
这个和芯片的计算有关
Rtc芯片内部有七个与时间、日期有关的寄存器(寄存器中的数据格式为BCD码),以及一个写保护寄存器,我们要做的就是将初始设置的时间、日期数据写入这几个寄存器,然后再不断地读取这几个寄存器来获取实时时间和日期。
秒钟寄存器的BIT7定义为时钟暂停标志(CH)。当初始上电时该位置为1,时钟振荡器停止,时钟的计时保持最后一次的状态,DS1302处于低功耗状态;只有将秒寄存器的CH位清0,时钟才能开始运行,时间从最后一次状态中继续计时。低四位(BIT0,BIT1,BIT2,BIT3)记录秒钟的个位,高四位除BIT7外记录秒钟的十位。
分钟寄存器低四位记录个位,高四位除BIT7外记录分钟的十位。
时钟寄存器的BIT7设置DS1302是运行于12小时模式还是24小时模式。BIT7高电平时为12小时模式,低电平时为24小时模式。当选择12小时模式时,BIT5位是AM/PM标志(BIT5高电平时为PM,BIT5低电平时为AM);当选择24小时模式时,BIT5位是第二个十位(2023小时)。低四位记录时钟的个位,BIT4记录第一个十位(12小时模式:1011;24小时模式:10~19)。
日寄存器低四位记录个位,高四位(实际上仅有BIT4和BIT5)记录十位。
月寄存器低四位记录个位,高四位(实际上仅有BIT4)记录十位。
周寄存器仅有低四位中的BIT0,BIT1和BIT2记录个位。
年寄存器低四位记录个位,高四位记录十位。
然后找到年份的写入:

可以看到源码中对于年份写入没有用bin2bcd函数。
所以源码中直接用了年份后两位的15的bin码进行了写入。也就是1111。所以现在年寄存器中的值是00001111
读取的时候将这个码值通过bcd转bin,转成了0 f,就是0 15。
所以读出的时间和设置的时间一样,这个思路同样适用于15以下的数字。
当我们设置的值是16时,bin值是10000,直接写入寄存器,寄存器的值是00010000
当读取的时候,把bin转成bcd,就成了10。所以16年变成了10年。这个同样也适用于16年以后。


原作者:倔强的土坷垃


更多回帖

发帖
×
20
完善资料,
赚取积分