《前言》
正確的USART通信要求發送和接收波特率的匹配度足夠高,否則可能發生通信錯誤。
當在兩個設備之間建立通信鏈路時,自動波特率檢測十分有用,因為從設備能夠檢測到主控制器的波特率并進行相應的自我調整。這需要使用一種自動機制來確定波特率。
某些STM32器件中內置的USART外設提供許多功能,包括硬件自動波特率檢測。
本應用筆記旨在介紹STM32微控制器的自動波特率檢測功能,并為沒有在硬件中實現此功能的STM32器件提供替代軟件方法。
本應用筆記適用于表 1中所列產品。

《硬件自動波特率檢測》
1、特性概述
自動波特率檢測(ABR)使接收設備能夠接受來自各種以不同速率工作的發送設備的數據,無需事先建立數據速率。
在一些STM32產品中,USART能夠使用專用硬件自動確定波特率。
表 2提供了支持自動波特率檢測的STM32系列設備的概述。

對于內置ABR的STM32系列設備而言,并非所有實例化USART接口均支持自動波特率檢測。
表 3詳細說明了這一限制。

2、自動波特率檢測模式
ABR是指接收設備通過檢查第一個字符(通常是預先選擇的標志字符)確定傳入數據速率的過程。
STM32產品上的自動波特率檢測功能內置的各種模式基于不同字符模式:
?以“1”位為開頭的任意字符:模式0
?以10xx模式開頭的任何字符:模式1
?0x7F:模式2
?0x55:模式3

在激活自動波特率檢測之前,必須通過USARTx_CR2寄存器中的ABRMOD[1:0]字段選擇一種ABR模式。在所有ABR模式下,都會在同步數據接收期間多次檢測波特率,并將每一次的檢測值與上一次的檢測值進行比較。
注:在7位數據長度模式下,不支持0x7F和0x55幀檢測ABR模式。
3、ABR誤差計算
由USART時鐘源(fCK)決定通信速率范圍(尤其是最大通信速率)。接收器采用不同的用戶可配置過采樣技術,可區分有效輸入數據和噪聲,從而用于恢復數據。這可以在最大通信速率與抗噪聲/時鐘不準確性之間實現平衡。
可通過編程USARTx_CR1寄存器中的OVER8位來選擇過采樣方法,可以是波特率時鐘的16倍或8倍。
USART時鐘源頻率必須與預期通信速率兼容:
?16倍過采樣時,波特率介于fCK/65535與fCK/16之間。
?8倍過采樣時,波特率介于fCK/65535與fCK/8之間。
波特率誤差取決于USART時鐘源、過采樣方法和ABR模式。

其中:
?預期波特率取決于發送設備
?實際波特率是USART接收器使用自動波特率檢測操作確定的波特率。
《軟件自動波特率檢測》
如果不支持硬件自動波特率檢測,可采用本節描述的軟件方法。
軟件方法的理念是發送0x7F數據幀到USARTx_RX引腳。這將連接到EXTI線路,該線路被配置為在每個上升沿生成中斷。
使用Systick定時器測量兩個上升沿之間間隔的持續時間。此持續時間對應于8位的持續時間,因此
?位時間 = 計算的持續時間 / 8
?波特率 = 1/位時間
然后,根據計算的波特率值進行USARTx_BRR寄存器編程。

《軟件和硬件方法設置》
此設置示例使用的是內置硬件自動波特率檢測功能的STM32F303xD/E。
PC應用“超級終端”用于向/從STM32F303發送/接收數據幀。因此,測試的是介于600bits/s至115200 bits/s之間的標準波特率。使用另一個STM32F3器件作為發送器測試可以達到的最高波特率值(9 Mbits/s)。
1、USART1配置示例
在兩個示例中,STM32 USART1的配置如下:
/*##-1- Configure the UART peripheral ######################################*/ /* Put the USART peripheral in the Asynchronous mode (UART Mode) */ /* UART configured as follows: - Word Length = 8 Bits - Stop Bit = One Stop bit - Parity = NONE parity - BaudRate = 115200 baud It can be any other value as the USARTx_BRR register will be reprogrammed - Hardware flow control disabled (RTS and CTS signals) - The oversampling mode is 8 or 16 (Both are tested) */ UartHandle.Instance = USARTx; UartHandle.Init.BaudRate = 115200; UartHandle.Init.WordLength = UART_WORDLENGTH_8B; UartHandle.Init.StopBits = UART_STOPBITS_1; UartHandle.Init.Parity = UART_PARITY_NONE; UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; UartHandle.Init.Mode = UART_MODE_TX_RX; UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
注:
USART1時鐘源是使用HSE PLL時鐘源的72 MHz系統時鐘。(某些測試使用HSI時鐘作為USART1時鐘源來執行。這是為了檢查HSI不準確性對結果的影響。)
2、硬件自動波特率檢測
USART1被配置為自動檢測波特率。用戶必須在USART1初始化函數中選擇ABR模式,如下所示:
/*##-2- Configure the AutoBaudRate method */ UartHandle.AdvancedInit.AdvFeatureInit =UART_ADVFEATURE_AUTOBAUDRATE_INIT; UartHandle.AdvancedInit.AutoBaudRateEnable = UART_ADVFEATURE_AUTOBAUDRATE_ENABLE; /*Uncomment your appropriate mode */ //UartHandle.AdvancedInit.AutoBaudRateMode = UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBIT; //UartHandle.AdvancedInit.AutoBaudRateMode = UART_ADVFEATURE_AUTOBAUDRATE_ONFALLINGEDGE; //UartHandle.AdvancedInit.AutoBaudRateMode = UART_ADVFEATURE_AUTOBAUDRATE_ON0X7FFRAME; //UartHandle.AdvancedInit.AutoBaudRateMode = UART_ADVFEATURE_AUTOBAUDRATE_ON0X55FRAME; if (HAL_UART_Init(&UartHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Wait until Receive enable acknowledge flag is set */ while(__HAL_UART_GET_FLAG(&UartHandle,UART_FLAG_REACK) == RESET) {} /* Wait until Transmit enable acknowledge flag is set */ while(__HAL_UART_GET_FLAG(&UartHandle,UART_FLAG_TEACK) == RESET) {} /* Loop until the end of Autobaudrate phase */ while(__HAL_UART_GET_FLAG(&UartHandle,UART_FLAG_ABRF) == RESET) {}
在整個初始化過程完成后,USART等待從超級終端接收數據,然后開始自動波特率檢測階段。通過ABRF標志監測此階段的結束。
?如果自動波特率檢測操作不成功,則ABRE標志置位
?如果自動波特率檢測操作成功完成,則向超級終端發送確認數據。
/* If AutoBaudBate error occurred */
if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_ABRE)!= RESET)
{
Error_Handler();
}
else
{
/* Wait until RXNE flag is set */
while(__HL_UART_GET_FLAG(&UartHandle,UART_FLAG_RXNE) == RESET)
{}
/* Send acknowledgement message*/
if (HAL_UART_Transmit_DMA(&UartHandle, (uint8_t *)aTxBuffer, TXBUFFERSIZE) != HAL_OK)
{
/* Transfer error in transmission process */
Error_Handler();
}
while (HAL_UART_GetState(&UartHandle) != HAL_UART_STATE_READY)
{
}
}
3、軟件自動波特率檢測
表 5詳細說明了軟件方法。



4、誤差計算
圖 2顯示ABR模式2和3的精確度高于模式0和1;它們的波特率誤差值更低。
不過,由于預期波特率與實際波特率之間的誤差小于1%,因此所有模式的結果均正常。

圖 3顯示在通常情況下,當由72 MHz系統時鐘為USART提供時鐘(HSE作為PLL時鐘源)時,結果優于USART時鐘源使用HSI時鐘。這要歸因于HSI的相對不準確性。

圖 4顯示在大多數情況下,硬件方法提供的結果優于軟件方法。不過,在某些情況下,軟件方法能夠提供相比于使用硬件方法時更好的結果。

圖 5顯示:
?使用硬件方法時,達到最大波特率9 Mbits/s時誤差為0%。
?使用軟件方法時,達到最大波特率時誤差為約30%,這要歸因于執行中斷處理程序所花費的CPU周期。

《結論》
此應用筆記描述了某些STM32器件內置的硬件自動波特率檢測功能。它還提供了在軟件中實現此功能的技術,作為STM32器件沒有在硬件中實現此功能的解決方案。
盡管示例中的自動波特率檢測均應用在示例的開頭部分,但是可以進行擴展并在每次發送和接收設備檢測到通信錯誤時使用。當主機使用不同波特率進行通信時,這一特性可實現應用的穩健性。
審核編輯 :李倩
-
通信
+關注
關注
18文章
6330瀏覽量
139686 -
STM32
+關注
關注
2307文章
11128瀏覽量
371472 -
USART
+關注
關注
1文章
201瀏覽量
32959
原文標題:STM32的USART自動波特率檢測
文章出處:【微信號:airX嵌入式,微信公眾號:airX嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
UART波特率計算及UART收發回顯實驗
串口波特率設置1200用不了是怎么回事?
115200的波特率,為啥實際速度只有11KB/s?
波特率是什么
可編程電源的通信波特率應如何設置?
基于瑞薩64位MPU RZ/G2L的uboot串口多波特率支持介紹
MAX13051 ±80V故障保護CAN收發器,具有自動波特率模式技術手冊
STM32U575串口接收+GPDMA波特率不匹配怎么解決?
STM32G070 UART串口,低波特率傳送數據時,TIMER出現嚴重延時現象如何解決?
CAN總線十萬個為什么 | CAN自定義波特率有什么用?

STM32的USART自動波特率檢測
評論