0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

串口波特率誤差產(chǎn)生的原因

CHANBAEK ? 來源:硬件工程師技術(shù)干貨 ? 作者:硬件工程師技術(shù)干 ? 2023-04-13 16:20 ? 次閱讀

1、UART接口

UART全稱Universal Asynchronous Receiver/Transmitter,通用異步收發(fā)器,是一種非常常見的異步收發(fā)協(xié)議,在嵌入式領(lǐng)域應(yīng)用十分廣泛。收發(fā)雙方按照約定好通訊波特率進(jìn)行配置,如果波特率不匹配會(huì)導(dǎo)致失敗。

2、分頻與波特率

使用單片機(jī)的朋友,經(jīng)常使用4800、9600、38400、115200等波特率。設(shè)計(jì)電路時(shí)經(jīng)常采用11.0592Mhz這樣“不規(guī)則”晶振,看起來不規(guī)則,實(shí)際上很規(guī)則,原因是可以精確分頻成常用波特率。

11.0592MHz=11059200=115200*96

11.0592MHz=11059200=57600*192

11.0592MHz=11059200=19200*576

有細(xì)心的朋友經(jīng)常采用11.0592Mhz晶體設(shè)計(jì)電路,調(diào)試完串口通訊之后更換為12MHz后單片機(jī)依然能夠正常通訊,并沒有出現(xiàn)通訊異常。可見波特率有少許誤差也是能夠容忍的。

3、串口如何采樣

串口接收方,在收到起始位后,延時(shí)1.5個(gè)位周期進(jìn)行第1位采樣,然后依次隔一個(gè)位周期采樣一位,直至把所有數(shù)據(jù)位采樣完成。如果接收方采樣位置正好在數(shù)據(jù)位的中間位置,那么采樣非常完美,不會(huì)出現(xiàn)問題。以下是8bit串口通訊數(shù)據(jù)格式示意圖。

注意,這里的采樣并不是只采樣一次,有些芯片會(huì)采樣多次,這里僅做示意。

4、誤差原因

如果接收方位周期略微大于發(fā)送方位周期,就會(huì)出現(xiàn)下圖所示的情況。采樣位置逐漸偏移數(shù)據(jù)位中心,bit7采樣位置偏移最嚴(yán)重。這就是波特率誤差。采樣點(diǎn)移位過多就會(huì)導(dǎo)致位錯(cuò)誤,導(dǎo)致通訊失敗。當(dāng)然如果接收方位周期略微小于發(fā)送方位周期,也是同樣道理。一般測特率誤差2%-3%是沒有問題的。

5、舉例

筆者正在使用的某款cortex-M3內(nèi)核芯片,需求的波特率是460800bps。串口時(shí)鐘頻率是36MHz。此款芯片波特率配置方法是串口時(shí)鐘頻率除以16,再除以分頻因子。計(jì)算出分頻因子(分頻因子只能是整數(shù)),然后寫入相應(yīng)寄存器即可。算來算去,無論如何計(jì)算都不能準(zhǔn)確分頻出460800bps。按照如下代碼計(jì)算出的分頻因子是4。然后反推出波特率是562500bps,整除失去了小數(shù)位,導(dǎo)致差距巨大,根本無法通訊。

// baud rate = (serial clock freq) / (16 * divisor).
  tmpBaudRateDiv = (clocks.PCLK_Frequency / 16) / UART_InitStruct->UART_BaudRate;

于是乎做了個(gè)優(yōu)化,如下代碼,計(jì)算出的分頻因子是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、不建議串口高速使用

串口畢竟是一個(gè)低速的數(shù)據(jù)傳輸協(xié)議,這種異步傳輸,沒有時(shí)鐘同步信號(hào),在傳輸?shù)拿總€(gè)字節(jié)中采樣有誤差積累,不建議高速使用,筆者使用過幾種高波特率460800、921600、1500000等。原因是低端的單片機(jī)主頻速率較低,處理高速數(shù)據(jù)流效率低下,如需高速使用,可根據(jù)自己需求開啟串口FIFO、串口DMA、串口流控等。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5045

    文章

    18816

    瀏覽量

    298442
  • 晶振
    +關(guān)注

    關(guān)注

    33

    文章

    2728

    瀏覽量

    67502
  • 串口
    +關(guān)注

    關(guān)注

    14

    文章

    1533

    瀏覽量

    75451
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1199

    瀏覽量

    100822
  • 波特率
    +關(guān)注

    關(guān)注

    2

    文章

    290

    瀏覽量

    33922
收藏 人收藏

    評論

    相關(guān)推薦

    STM32串口波特率大小計(jì)算案例

    波特率的計(jì)算 STM32下的波特率串口外設(shè)時(shí)鐘息息相關(guān),USART 1的時(shí)鐘來源于APB2,USART 2-5的時(shí)鐘來源于APB1。在STM32中,有個(gè)波特率寄存器USART_BRR
    的頭像 發(fā)表于 10-23 14:19 ?7968次閱讀
    STM32<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>大小計(jì)算案例

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

    什么是串口波特率串口波特率是指串口通信系統(tǒng)中傳輸數(shù)據(jù)的速率。在UART串口通信中,數(shù)據(jù)以位(bi
    的頭像 發(fā)表于 08-08 10:09 ?5303次閱讀
    什么是<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>?<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>的分類及應(yīng)用詳解

    串口波特率計(jì)算工具下載

    串口波特率計(jì)算工具
    發(fā)表于 03-11 09:38 ?179次下載

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

    發(fā)現(xiàn)了C*Core國芯芯片中SCI發(fā)送與接受方波特率誤差導(dǎo)致數(shù)據(jù)不匹配問題,分析了發(fā)送與接受方數(shù)據(jù)傳輸丟幀、誤幀現(xiàn)象出現(xiàn)的根本原因,總結(jié)了SCI容限值與芯片主頻及標(biāo)準(zhǔn)波特率之間規(guī)
    發(fā)表于 03-05 17:45 ?17次下載
    C Core芯片SCI<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>容限優(yōu)化

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

    串行通信在波特率誤差超過一定范圍時(shí),會(huì)產(chǎn)生錯(cuò)誤。本節(jié)介紹的內(nèi)容在51單片機(jī)上僅用軟件就實(shí)現(xiàn)了波特率自動(dòng)整定,最大程度地減小了波特率
    發(fā)表于 03-23 14:52 ?3754次閱讀
    串行通信的實(shí)現(xiàn)條件和<b class='flag-5'>波特率</b>自動(dòng)整定問題

    STM32的串口自動(dòng)識(shí)別波特率

    STM32串口自動(dòng)識(shí)別波特率
    的頭像 發(fā)表于 03-04 09:53 ?8976次閱讀

    串口通訊實(shí)際的波特率測量

    平時(shí)使用串口打印出現(xiàn)亂碼的絕大部分原因串口波特率沒對。那么我們怎么測量實(shí)際的波特率呢?在這之前,順便一起回顧一下
    的頭像 發(fā)表于 04-04 17:27 ?6914次閱讀
    <b class='flag-5'>串口</b>通訊實(shí)際的<b class='flag-5'>波特率</b>測量

    串口波特率計(jì)算詳解

    STM32下波特率計(jì)算詳解波特率的計(jì)算????STM32下的波特率串口外設(shè)時(shí)鐘息息相關(guān),USART 1的時(shí)鐘來源于APB2,USART 2-5的時(shí)鐘來源于APB1。在STM32中,有
    發(fā)表于 12-05 09:06 ?22次下載
    <b class='flag-5'>串口</b><b class='flag-5'>波特率</b>計(jì)算詳解

    串口通訊波特率出現(xiàn)誤差的因素

    串口通訊(UART)是一種異步通訊,收發(fā)雙方需要按照約定的波特率進(jìn)行通訊。當(dāng)波特率出現(xiàn)誤差時(shí),會(huì)導(dǎo)致通訊出錯(cuò)。那導(dǎo)致波特率出現(xiàn)
    的頭像 發(fā)表于 07-03 17:40 ?9419次閱讀

    波特率是什么?波特率設(shè)計(jì)

    從宏觀理解,波特率表征了串口的傳輸速度。
    的頭像 發(fā)表于 06-05 15:19 ?2.2w次閱讀
    <b class='flag-5'>波特率</b>是什么?<b class='flag-5'>波特率</b>設(shè)計(jì)

    什么是波特率?為什么要設(shè)置波特率?

    歡迎來到東用知識(shí)小課堂!一、什么是波特率波特率(BaudRate)單位bps是用于衡量串口通信速度的單位,它表示每秒鐘發(fā)送的比特?cái)?shù)。如果一個(gè)串口
    的頭像 發(fā)表于 04-08 00:00 ?6098次閱讀
    什么是<b class='flag-5'>波特率</b>?為什么要設(shè)置<b class='flag-5'>波特率</b>?

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

    如果串口傳輸速率低于波特率,您可以嘗試以下方法來解決問題:   1. 檢查硬件連接:確保串口連接正確且牢固。檢查連接線是否完好,確保沒有松動(dòng)或斷開的接觸。   2. 檢查波特率設(shè)置
    的頭像 發(fā)表于 09-08 16:23 ?5514次閱讀

    什么是串口波特率?串口通信為什么要設(shè)置波特率?

    在電子設(shè)備的世界中,數(shù)據(jù)是通過各種方式進(jìn)行傳輸?shù)?。其中?b class='flag-5'>串口通信是一種常見的數(shù)據(jù)傳輸方式,它以其簡單、可靠和廣泛的特性,成為了電子設(shè)備間通信的重要手段。而在串口通信中,有一個(gè)非常重要的參數(shù)——波特率
    的頭像 發(fā)表于 11-03 08:21 ?3760次閱讀
    什么是<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>?<b class='flag-5'>串口</b>通信為什么要設(shè)置<b class='flag-5'>波特率</b>?

    什么是串口波特率串口通信為什么要設(shè)置波特率?

    什么是串口波特率?串口通信為什么要設(shè)置波特率?波特率與比特的關(guān)系 如何選擇
    的頭像 發(fā)表于 01-22 16:10 ?1543次閱讀

    如何使用示波器測量串口波特率

    在通信和電子測量領(lǐng)域,串口波特率是一個(gè)至關(guān)重要的參數(shù),它決定了數(shù)據(jù)在串行通信線上的傳輸速率。使用示波器來測量串口波特率是一種常見且有效的方法,尤其是在沒有專業(yè)
    的頭像 發(fā)表于 05-27 16:25 ?2929次閱讀