代码翻车现场:为什么你的RTC走时永远错误?(附调试实录)

RTC时间数值解析

 

1、       用户直接读我RTC芯片时间寄存器数值表面看起来像是十六进制数值,比如读到秒数值0x59,很多用户会0x59当成十六进制数换算为十进制数值89,然后再把这个数值显示到屏幕上,以为时间会走89秒,其实这个换算是错误的。

2、       此时0x59并不是真实的十六进制数,而是2BCD4位二进制数来表1位十进制数中0~9)组合起来的数值,其中4BCD组成真实值的十位,4BCD组成真实值的个位。正确换算方法应该为数值右4位乘10加上4位值BCD码与十进制互相转换代码可以使用如下宏定义。

#define BcdToDec(x) (((x >> 4) * 10) + (x & 0x0F))

#define DecToBcd(x) (((x / 10) << 4) | (x % 10))

IMG_256

2025年1月18日 15:09