UART全稱Universal Asynchronous Receiver/Transmitter,通用異步收發(fā)器,是一種非常常見的異步收發(fā)協(xié)議,在嵌入式領(lǐng)域應(yīng)用十分廣泛。收發(fā)雙方按照約定好通訊波特率進(jìn)行配置,如果波特率不匹配會導(dǎo)致失敗。
2、分頻與波特率
使用單片機的朋友,經(jīng)常使用4800、9600、38400、115200等波特率。設(shè)計電路時經(jīng)常采用11.0592Mhz這樣“不規(guī)則”晶振,看起來不規(guī)則,實際上很規(guī)則,原因是可以精確分頻成常用波特率。
11.0592MHz=11059200=115200*96
11.0592MHz=11059200=57600*192
11.0592MHz=11059200=19200*576
有細(xì)心的朋友經(jīng)常采用11.0592Mhz晶體設(shè)計電路,調(diào)試完串口通訊之后更換為12MHz后單片機依然能夠正常通訊,并沒有出現(xiàn)通訊異常。可見波特率有少許誤差也是能夠容忍的。
3、串口如何采樣
串口接收方,在收到起始位后,延時1.5個位周期進(jìn)行第1位采樣,然后依次隔一個位周期采樣一位,直至把所有數(shù)據(jù)位采樣完成。如果接收方采樣位置正好在數(shù)據(jù)位的中間位置,那么采樣非常完美,不會出現(xiàn)問題。以下是8bit串口通訊數(shù)據(jù)格式示意圖。
注意,這里的采樣并不是只采樣一次,有些芯片會采樣多次,這里僅做示意。
4、誤差原因
如果接收方位周期略微大于發(fā)送方位周期,就會出現(xiàn)下圖所示的情況。采樣位置逐漸偏移數(shù)據(jù)位中心,bit7采樣位置偏移最嚴(yán)重。這就是波特率誤差。采樣點移位過多就會導(dǎo)致位錯誤,導(dǎo)致通訊失敗。當(dāng)然如果接收方位周期略微小于發(fā)送方位周期,也是同樣道理。一般測特率誤差2%-3%是沒有問題的。
5、舉例
筆者正在使用的某款cortex-M3內(nèi)核芯片,需求的波特率是460800bps。串口時鐘頻率是36MHz。此款芯片波特率配置方法是串口時鐘頻率除以16,再除以分頻因子。計算出分頻因子(分頻因子只能是整數(shù)),然后寫入相應(yīng)寄存器即可。算來算去,無論如何計算都不能準(zhǔn)確分頻出460800bps。按照如下代碼計算出的分頻因子是4。然后反推出波特率是562500bps,整除失去了小數(shù)位,導(dǎo)致差距巨大,根本無法通訊。
// baud rate = (serial clock freq) / (16 * divisor).
tmpBaudRateDiv = (clocks.PCLK_Frequency / 16) / UART_InitStruct->UART_BaudRate;
于是乎做了個優(yōu)化,如下代碼,計算出的分頻因子是5。然后反推出波特率是450,000bps,差距比較小,測試了一下通訊性能沒問題。
// baud rate = (serial clock freq) / (16 * divisor).
tmpBaudRateDiv = ((clocks.PCLK_Frequency / 16) + UART_InitStruct->UART_BaudRate / 2) / UART_InitStruct->UART_BaudRate;
6、不建議串口高速使用
串口畢竟是一個低速的數(shù)據(jù)傳輸協(xié)議,這種異步傳輸,沒有時鐘同步信號,在傳輸?shù)拿總€字節(jié)中采樣有誤差積累,不建議高速使用,筆者使用過幾種高波特率460800、921600、1500000等。原因是低端的單片機主頻速率較低,處理高速數(shù)據(jù)流效率低下,如需高速使用,可根據(jù)自己需求開啟串口FIFO、串口DMA、串口流控等。
-
嵌入式
+關(guān)注
關(guān)注
5125文章
19438瀏覽量
313018 -
晶振
+關(guān)注
關(guān)注
34文章
3155瀏覽量
69261 -
串口
+關(guān)注
關(guān)注
14文章
1580瀏覽量
78330 -
uart
+關(guān)注
關(guān)注
22文章
1251瀏覽量
102847 -
波特率
+關(guān)注
關(guān)注
2文章
310瀏覽量
34620
發(fā)布評論請先 登錄
相關(guān)推薦
STM32串口波特率大小計算案例

什么是串口波特率?串口波特率的分類及應(yīng)用詳解

C Core芯片SCI串口波特率容限優(yōu)化

串行通信的實現(xiàn)條件和波特率自動整定問題

串口波特率計算詳解

串口通訊波特率出現(xiàn)誤差的因素
什么是波特率?為什么要設(shè)置波特率?

串口傳輸速率低于波特率怎么辦 串口通信的波特率如何設(shè)置
什么是串口波特率?串口通信為什么要設(shè)置波特率?

評論