热度 33
2013-11-5 14:46
8001 次阅读|
9 个评论
通常情况下MCU都提供了多种不同的时钟源以及多种不同的时钟分频系数,以让用户应用系统能工作在多种时钟速率下,同样也是为了让MCU的各种外设能有一个适合的时钟工作,如定时器如果时钟设置的过高会造成定时时间短,其它通信外设如UART,SPI,I2C则会因高时钟速度加快通信速度。在这种多种时钟选择的情况下就可能对串口波特率设置造成过大的误差而引起串口通信错误。 今天就遇到这样的一个问题,就是让C8051F9x系列单片机工作在24.5MHz的主频下,串口波特率为115200时串口始终通信有误码,而baudrate=9600时则又正常。这就是串口波特率误差过大引起的。正常情况下串口波特率误差不应该超过+/-2%-3%,如超过这个值就会出现串口通信不正常问题。 C8051串口波特率公式计算如下: UartBaudRate = T1_Overflow_Rate T1_Overflow_Rate = Timer1_clk / (256-TH1) 1.现主频为24.5MHz,12分频后作为Timer1时钟源,理想波特率为115200,则算得TH1=0xF8,经过将TH1代入上式中求得际UartBaudRate=127604,则误差率为(127604-115200)/115200=10.8%,远远超过了2%-3%的极限值。 2.主频为24.5MHz,12分频作Timer1时钟源,理想波特率为9600,则算得TH1=0x96,将TH1反代入上式求得实际UartBaudRate=9630,则误差率为(9630-9600)/9600=0.3%,远远小于2%-3%的范围。 这就是为什么将波特率设为115200后串口始终不能正常进行通信的原因了!! 所以说当我们想根据不同的时钟来设不同的波特率后在程序中一定要进行反代入一下将MCU自己将实际波特率求出来进行比较如果误差率超过2%-3%,则利用C和编译器中的报错机制将错误情况进行提示,免得出了问题后,自己查看所有程序,发现没什么问题呀!其它就是一个小问题隐藏起来了。