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

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

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

STM32的串口自動識別波特率

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 作者:黃工的嵌入式技術(shù) ? 2020-03-04 09:53 ? 次閱讀

最近有朋友問關(guān)于UART串口自動識別波特率的問題,今天就在這里寫點相關(guān)內(nèi)容。

1寫在前面

關(guān)于自動識別UART串口波特率的這個問題,相信有項目經(jīng)驗,或者認(rèn)真研究過串口的朋友都應(yīng)該多多少少知道一點自動識別的方法。

可能絕大部分知道的就是通過波特率一一匹配來實現(xiàn),這種方法也是最常見,而且還比較有效的一種方法。

上面這種方法就是大家熟知的通過軟件來檢測波特率的方法,其實,還有一種方法就是通過硬件自身完成波特率來檢測。

針對STM32,在ST官方其實在應(yīng)用筆記和參考手冊文檔中都有提到。下面,我結(jié)合文檔簡單講下硬件自動波特率檢測的內(nèi)容。

2

STM32硬件自動波特率檢測

ABR:Auto Baud Rate,自動波特率檢測使接收設(shè)備能夠接受來自各種以不同速率工作的發(fā)送設(shè)備的數(shù)據(jù),無需事先建立數(shù)據(jù)速率。

1.ABR應(yīng)用地方

事先不知道系統(tǒng)的通信速度。

系統(tǒng)正在使用精確度相對較低的時鐘源且該機(jī)制允許在不測量時鐘偏差的情況下獲得正確的波特率。

2.支持ABR系列

在STM32中,支持硬件自動波特率檢測的只有部門系列才支持,之前出來比較早的系列不支持(如F1 F4),這后面推出來的系列都支持這個功能,包含最新才出來的STM32H7、G0系列都支持。

當(dāng)然,對于內(nèi)置ABR的STM32系列設(shè)備而言,并非所有實例化USART接口均支持自動波特率檢測。

3.自動波特率檢測模式

ABR是指接收設(shè)備通過檢查第一個字符(通常是預(yù)先選擇的標(biāo)志字符)確定傳入數(shù)據(jù)速率的過程。

STM32產(chǎn)品上的自動波特率檢測功能內(nèi)置的各種模式基于不同字符模式:

模式0:以“1”位為開頭的任意字符;

模式1:以10xx模式開頭的任何字符;

模式2:0x7F;

模式3:0x55;

提示:

A.在所有ABR模式下,都會在同步數(shù)據(jù)接收期間多次檢測波特率,并將每一次的檢測值與上一次的檢測值進(jìn)行比較。

B.在7位數(shù)據(jù)長度模式下,不支持0x7F和0x55幀檢測ABR模式。

4.代碼配置

相關(guān)代碼,官方提供有基于(標(biāo)準(zhǔn)外設(shè)庫、HAL庫的)參考例程,比如F0標(biāo)準(zhǔn)外設(shè)庫參考代碼:

static void AutoBauRate_StartBitMethod(void){ /* USART enable */ USART_Cmd(EVAL_COM1, ENABLE); /* Configure the AutoBaudRate method */ USART_AutoBaudRateConfig(EVAL_COM1, USART_AutoBaudRate_StartBit); /* Enable AutoBaudRate feature */ USART_AutoBaudRateCmd(EVAL_COM1, ENABLE); /* Wait until Receive enable acknowledge flag is set */ while(USART_GetFlagStatus(EVAL_COM1, USART_FLAG_REACK) == RESET) {} /* Wait until Transmit enable acknowledge flag is set */ while(USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TEACK) == RESET) {} /* Loop until the end of Autobaudrate phase */ while(USART_GetFlagStatus(EVAL_COM1, USART_FLAG_ABRF) == RESET) {} /* If AutoBaudBate error occurred */ if (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_ABRE) != RESET) { /* Turn on LED3 */ STM_EVAL_LEDOn(LED3); } else { /* Turn on LED2 */ STM_EVAL_LEDOn(LED2); /* Wait until RXNE flag is set */ while(USART_GetFlagStatus(EVAL_COM1, USART_FLAG_RXNE) == RESET) {} /* Wait until TXE flag is set */ while(USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TXE) == RESET) {} /* Send received character */ USART_SendData(EVAL_COM1, USART_ReceiveData(EVAL_COM1)); /* clear the TE bit (if a transmission is on going or a data is in the TDR, it will be sent before efectivelly disabling the transmission) */ USART_DirectionModeCmd(EVAL_COM1, USART_Mode_Tx, DISABLE); /* Check the Transfer Complete Flag */ while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {} } /* USART Disable */ USART_Cmd(EVAL_COM1, DISABLE);}

5.ABR誤差計算

由USART時鐘源( fCK)決定通信速率范圍(尤其是最大通信速率)。接收器采用不同的用戶可配置過采樣技術(shù),可區(qū)分有效輸入數(shù)據(jù)和噪聲,從而用于恢復(fù)數(shù)據(jù)。這可以在最大通信速率與抗噪聲/時鐘不準(zhǔn)確性之間實現(xiàn)平衡。

可通過編程USARTx_CR1寄存器中的OVER8位來選擇過采樣方法,可以是波特率時鐘的16倍或8倍。

USART時鐘源頻率必須與預(yù)期通信速率兼容:

? 16倍過采樣時,波特率介于fCK/65535與fCK/16之間。

? 8倍過采樣時,波特率介于fCK/65535與fCK/8之間。

波特率誤差取決于USART時鐘源、過采樣方法和ABR模式。

其中:

? 預(yù)期波特率取決于發(fā)送設(shè)備

? 實際波特率是USART接收器使用自動波特率檢測操作確定的波特率。

6.誤差

下圖來自官方測試數(shù)據(jù),基于:fCK = 72 MHz時ABR的誤差計算,115200 bits/s預(yù)期波特率

從上圖可以看出:ABR模式2和3的精確度高于模式0和1;它們的波特率誤差值更低。

不過,由于預(yù)期波特率與實際波特率之間的誤差小于1%,因此所有模式的結(jié)果均正常。

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

    關(guān)注

    2264

    文章

    10854

    瀏覽量

    354289
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1219

    瀏覽量

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

    關(guān)注

    2

    文章

    293

    瀏覽量

    34036
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4722

    瀏覽量

    68229
收藏 人收藏

    評論

    相關(guān)推薦

    MCU串口自動識別波特率原理分析

    現(xiàn)在的單片機(jī)資源越來越豐富了,其中我們常用的串口也是內(nèi)部集成了多個,關(guān)鍵功能也越來越強(qiáng)了。 我們有些應(yīng)用可能會用到串口自動識別波特率,今天就來講講MCU
    的頭像 發(fā)表于 10-23 16:12 ?236次閱讀
    MCU<b class='flag-5'>串口</b><b class='flag-5'>自動識別</b><b class='flag-5'>波特率</b>原理分析

    波特率9600和115200的區(qū)別

    在現(xiàn)代通信技術(shù)中,數(shù)據(jù)傳輸速率是一個關(guān)鍵的性能指標(biāo)。對于串行通信,波特率是衡量數(shù)據(jù)傳輸速度的基本單位。波特率9600和115200是兩種常見的設(shè)置,它們在不同的應(yīng)用場景中有著各自的優(yōu)勢和局
    的頭像 發(fā)表于 10-18 14:56 ?611次閱讀

    波特率與比特有何關(guān)系 波特率與數(shù)據(jù)傳輸速率的關(guān)系

    波特率(Baud Rate)和比特(Bit Rate)是衡量數(shù)據(jù)通信系統(tǒng)性能的兩個重要參數(shù),它們之間有著密切的關(guān)系,但并不完全相同。 波特率(Baud Rate): 波特率是指在數(shù)據(jù)
    的頭像 發(fā)表于 10-18 14:55 ?340次閱讀

    uart波特率和傳輸頻率的關(guān)系 UART串口的常用波特率為多少

    頻率是兩個關(guān)鍵參數(shù),它們之間存在一定的關(guān)系,并且UART串口有一系列常用的波特率。以下是對這兩個概念的介紹。 一、UART波特率和傳輸頻率的關(guān)系 1. 定義與區(qū)別 波特率(Baud R
    的頭像 發(fā)表于 10-06 16:12 ?1257次閱讀
    uart<b class='flag-5'>波特率</b>和傳輸頻率的關(guān)系 UART<b class='flag-5'>串口</b>的常用<b class='flag-5'>波特率</b>為多少

    串口通信中的波特率你真的了解嗎?差距竟如此重要!

    波特率串口通信中的作用在串口通信中,波特率起著至關(guān)重要的作用。因為在傳輸數(shù)據(jù)時,發(fā)送方和接收方需要以相同的波特率進(jìn)行通信。如果兩端的
    的頭像 發(fā)表于 08-27 11:46 ?1033次閱讀
    <b class='flag-5'>串口</b>通信中的<b class='flag-5'>波特率</b>你真的了解嗎?差距竟如此重要!

    485自動收發(fā)電路的波特率是多少

    485自動收發(fā)電路的波特率并不是一個固定的值,而是可以根據(jù)具體的應(yīng)用需求和電路設(shè)計進(jìn)行調(diào)整的。在實際應(yīng)用中,波特率的設(shè)置會受到多種因素的影響,包括傳輸距離、信號衰減、噪音環(huán)境、設(shè)備性能以及通信協(xié)議
    的頭像 發(fā)表于 07-13 09:41 ?2034次閱讀

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

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

    KT142C語音芯片工作電壓多少?電流是多少?串口波特率多少?多大的喇叭?

    KT142C-sop16語音芯片ic工作電壓多少?電流是多少?串口波特率是多少?支持多大的喇叭?
    的頭像 發(fā)表于 05-23 09:45 ?411次閱讀
    KT142C語音芯片工作電壓多少?電流是多少?<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>多少?多大的喇叭?

    波特率有什么危害尼?又該如何避免?

    深入探討了波特率過高可能帶來的危害,并提供了一些實用建議來保護(hù)設(shè)備不受影響。在通信領(lǐng)域,波特率是決定數(shù)據(jù)傳輸速度的重要參數(shù)。然而,波特率設(shè)置不當(dāng)可能會對設(shè)備造成嚴(yán)重的影響。本文旨在揭示波特率
    的頭像 發(fā)表于 04-03 16:45 ?1197次閱讀

    stm32mp157在linux系統(tǒng)下,串口波特率如何使用非標(biāo)準(zhǔn)波特率

    請問stm32mp157在linux系統(tǒng)下,串口波特率如何使用非標(biāo)準(zhǔn)波特率153600。內(nèi)核或者設(shè)備樹里需要怎么改動? 麻煩答復(fù)一下,最好能給個詳細(xì)的更改示例,謝謝!
    發(fā)表于 03-14 06:21

    為啥要轉(zhuǎn)換波特率 波特率和傳輸速率的關(guān)系

    對于串行多主 CAN 總線,如果波特率被稱為“500000波特”,則 CAN 上的該端口每秒最多可傳輸500000位。
    的頭像 發(fā)表于 03-06 17:38 ?4360次閱讀
    為啥要轉(zhuǎn)換<b class='flag-5'>波特率</b> <b class='flag-5'>波特率</b>和傳輸速率的關(guān)系

    PSOC4如何通過代碼修改串口波特率

    由于項目需要,需要實時改變串口波特率,PSOC4如何通過代碼修改串口波特率?謝謝
    發(fā)表于 02-19 07:40

    波特率發(fā)生器使用哪個定時器 波特率發(fā)生器的時鐘來源是什么

    波特率發(fā)生器是一種用于控制串行數(shù)據(jù)通信速率的設(shè)備,它可以生成特定波特率的時鐘信號。在嵌入式系統(tǒng)、通信設(shè)備和計算機(jī)硬件中,波特率發(fā)生器的使用十分常見。波特率發(fā)生器通常使用定時器來實現(xiàn)時鐘
    的頭像 發(fā)表于 01-24 09:56 ?1765次閱讀

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

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

    單片機(jī)的各個通信協(xié)議的波特率

    下面是一些常見的波特率數(shù)值,這些波特率通常被用于串口通信,SPI、I2C、CAN等接口的實際波特率可能有所不同:USART:110bps300bps600bps1200bps2400b
    的頭像 發(fā)表于 12-09 08:00 ?2683次閱讀
    單片機(jī)的各個通信協(xié)議的<b class='flag-5'>波特率</b>