搜档网
当前位置:搜档网 › 【ZLG微信文档精选】小算法撬动大地球

【ZLG微信文档精选】小算法撬动大地球

广州周立功单片机科技有限公司

小算法撬动大地球

小算法撬动大地球

摘要:在通讯过程中,时钟的计算尤其重要,有时候小小的误差就能导致通讯异常。本章旨于如何用小算法减小计算产生的误差。

推送目的:使读者更好地计算外设通讯时钟。

是否原创:是

关键字:算法、四舍五入法

正文:

在通讯过程,尤其是像串口等异步通讯过程中,小小的波特率误差就可能导致通讯异常。那么究竟是什么原因导致的呢?可能是时钟源产生的误差,可能是时钟配置有误,也有可能是计算产生的误差。现在我们就减少计算误差这一话题来探讨一个小小的算法——四舍五入除法。

以KE02 uart波特率配置为例:

根据参考手册的说明,uart波特率的配置如下:

u16Sbr = (SysClk>>4)/Baud;

u8Temp = pUART->BDH & ~(UART_BDH_SBR_MASK);

pUART->BDH = u8Temp | UART_BDH_SBR(u16Sbr >> 8);

pUART->BDL = (uint8_t)(u16Sbr & UART_BDL_SBR_MASK);

这个显然是正确的,但是为什么有时候在某一波特率值下会出现一点点的乱码呢?原因可能就是在计算u16Sbr的时候产生误差。例如如果(SysClk>>4)/Baud计算出来的值是10.96,但赋值给u16Sbr(u16Sbr为无符号短整数)后,u16Sbr的值为10,把小数省略了,从而导致产生误差。我们不妨把计算方法改变一下:

将u16Sbr = (SysClk>>4)/Baud;

改为u16Sbr = ((SysClk>>4) + (Baud>>1))/Baud;

((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 。这样的四舍五入算法比直接舍去全部小数更加精确,产生的误差也更加小。

免责声明

广州周立功单片机科技有限公司随附提供的软件或文档资料旨在提供给您(本公司的客户)使用,仅限于且只能在本公司制造或销售的产品上使用。

该软件或文档资料为本公司和/或其供应商所有,并受适用的版权法保护,版权所有。如有违反,将面临相关适用法律的刑事制裁,并承担违背此许可的条款和条件的民事责任。

本公司保留在不通知读者的情况下,有修改文档或软件相关内容的权利,对于使用中所出现的任何效果,本公司不承担任何责任。

该软件或文档资料“按现状”提供,不提供保证,无论是明示的、暗示的还是法定的保证。这些保证包括(但不限于)对出于某一特定目的应用此软件的适销性和适用性默示的保证。在任何情况下,公司不会对任何原因造成的特别的、偶然的或间接的损害负责。

相关主题