代码翻车现场:为什么你的RTC走时永远错误?(附调试实录)
RTC时间数值解析
1、 用户直接读我司RTC芯片时间寄存器数值表面看起来像是十六进制数值,比如读到秒数值为0x59,很多用户会把0x59当成十六进制数换算为十进制数值为89,然后再把这个数值显示到屏幕上,以为时间会走到89秒,其实这个换算是错误的。
2、 此时的0x59并不是真实的十六进制数,而是以2位BCD(4位二进制数来表示1位十进制数中的0~9)组合起来的数值,其中高4位BCD组成真实值的十位,低4位BCD组成真实值的个位。正确换算方法应该为数值右移4位乘以10加上低4位值,BCD码与十进制互相转换代码可以使用如下宏定义。
#define BcdToDec(x) (((x >> 4) * 10) + (x & 0x0F))
#define DecToBcd(x) (((x / 10) << 4) | (x % 10))

2025年1月18日 15:09