在通讯过程中,时钟的计算尤其重要,有时候小小的误差就能导致通讯异常。本章旨于如何用小算法减小计算产生的误差。 在通讯过程,尤其是像串口等异步通讯过程中,小小的波特率误差就可能导致通讯异常。那么究竟是什么原因导致的呢?可能是时钟源产生的误差,可能是时钟配置有误,也有可能是计算产生的误差。现在我们就减少计算误差这一话题来探讨一个小小的算法——四舍五入除法。 以KE02 uart波特率配置为例: 根据参考手册的说明,uart波特率的配置如下: 这个显然是正确的,但是为什么有时候在某一波特率值下会出现一点点的乱码呢?原因可能就是在计算u16Sbr的时候产生误差。例如如果(SysClk>>4)/Baud计算出来的值是10.96,但赋值给u16Sbr(u16Sbr为无符号短整数)后,u16Sbr的值为10,把小数省略了,从而导致产生误差。我们不妨把计算方法改变一下: ((SysClk>>4) + (Baud>>1))/Baud等于 (SysClk>>4)/Baud+0.5,即a/b+0.5(a为被除数,b为除数)。这里采用了四舍五入除法,当结果的小数位小于4时,加上5也不会进位,从而舍去;当结果的小数位大于等于5时,加上5就会进位。如果(SysClk>>4)/Baud计算出来的值是10.96,那么用四舍五入法后,即(SysClk>>4)/Baud+0.5的值就变成11.46,u16Sbr的值为11,比10更加接近10.96 。这样的四舍五入算法比直接舍去全部小数更加精确,产生的误差也更加小。 |
|
来自: 昵称29273511 > 《待分类》