最近有朋友問關于UART串口自動識別波特率的問題,今天就在這里寫點相關內容。
1寫在前面
關于自動識別UART串口波特率的這個問題,相信有項目經驗,或者認真研究過串口的朋友都應該多多少少知道一點自動識別的方法。
可能絕大部分知道的就是通過波特率一一匹配來實現,這種方法也是最常見,而且還比較有效的一種方法。
上面這種方法就是大家熟知的通過軟件來檢測波特率的方法,其實,還有一種方法就是通過硬件自身完成波特率來檢測。
針對STM32,在ST官方其實在應用筆記和參考手冊文檔中都有提到。下面,我結合文檔簡單講下硬件自動波特率檢測的內容。
2
STM32硬件自動波特率檢測
ABR:Auto Baud Rate,自動波特率檢測使接收設備能夠接受來自各種以不同速率工作的發送設備的數據,無需事先建立數據速率。
1.ABR應用地方
事先不知道系統的通信速度。
系統正在使用精確度相對較低的時鐘源且該機制允許在不測量時鐘偏差的情況下獲得正確的波特率。
2.支持ABR系列
在STM32中,支持硬件自動波特率檢測的只有部門系列才支持,之前出來比較早的系列不支持(如F1 F4),這后面推出來的系列都支持這個功能,包含最新才出來的STM32H7、G0系列都支持。
當然,對于內置ABR的STM32系列設備而言,并非所有實例化USART接口均支持自動波特率檢測。
3.自動波特率檢測模式
ABR是指接收設備通過檢查第一個字符(通常是預先選擇的標志字符)確定傳入數據速率的過程。
STM32產品上的自動波特率檢測功能內置的各種模式基于不同字符模式:
模式0:以“1”位為開頭的任意字符;
模式1:以10xx模式開頭的任何字符;
模式2:0x7F;
模式3:0x55;
提示:
A.在所有ABR模式下,都會在同步數據接收期間多次檢測波特率,并將每一次的檢測值與上一次的檢測值進行比較。
B.在7位數據長度模式下,不支持0x7F和0x55幀檢測ABR模式。
4.代碼配置
相關代碼,官方提供有基于(標準外設庫、HAL庫的)參考例程,比如F0標準外設庫參考代碼:
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)決定通信速率范圍(尤其是最大通信速率)。接收器采用不同的用戶可配置過采樣技術,可區分有效輸入數據和噪聲,從而用于恢復數據。這可以在最大通信速率與抗噪聲/時鐘不準確性之間實現平衡。
可通過編程USARTx_CR1寄存器中的OVER8位來選擇過采樣方法,可以是波特率時鐘的16倍或8倍。
USART時鐘源頻率必須與預期通信速率兼容:
? 16倍過采樣時,波特率介于fCK/65535與fCK/16之間。
? 8倍過采樣時,波特率介于fCK/65535與fCK/8之間。
波特率誤差取決于USART時鐘源、過采樣方法和ABR模式。
其中:
? 預期波特率取決于發送設備
? 實際波特率是USART接收器使用自動波特率檢測操作確定的波特率。
6.誤差
下圖來自官方測試數據,基于:fCK = 72 MHz時ABR的誤差計算,115200 bits/s預期波特率
從上圖可以看出:ABR模式2和3的精確度高于模式0和1;它們的波特率誤差值更低。
不過,由于預期波特率與實際波特率之間的誤差小于1%,因此所有模式的結果均正常。
-
STM32
+關注
關注
2270文章
10900瀏覽量
356045 -
波特率
+關注
關注
2文章
307瀏覽量
34142 -
ABR
+關注
關注
1文章
11瀏覽量
9695
原文標題:關于STM32硬件自動波特率檢測知識,項目中會用到!
文章出處:【微信號:mcuworld,微信公眾號:嵌入式資訊精選】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論