作者后面开始配置rtc之后发现误差比较明显,简单测了一下大概每分钟快0.47秒。
在寄存器中个位和十位分开计算
以秒计时为例:
bit3~0为个位数字,计数范围0~9;
bit6~4为十位数字,计数范围0~5;
这样如果直接读取寄存器数据的话,得到的数值就不是十进制的时间值,而是十六进制表示的十进制数值,例如当前时间为32秒,寄存器中高位为3,低位为2:
0b 011 0010 == 0x32 == 50 != 32
获取寄存器值之后需要经过处理才是正确的时间值
//0xab ==》ab,输入的十六进制数前后两位均不可大于9
//返回值为十进制
uint8_t BCD2HEX(uint8_t bcd)
{
if (((bcd & 0x0f) > 0x09) || ((bcd & 0xf0) > 0x90))
{
return 0xff;
}
return ((bcd >> 4) & 0xf) * 10 + ((bcd >> 0) & 0xf) * 1;
}
//十进制ab==》0xab,十进制数不能大于99
//返回值为十六进制
uint8_t HEX2BCD(uint8_t hex)
{
if (hex > 99)
{
return 0xff;
}
return ((hex / 10) << 4) | ((hex % 10) << 0);
}