《前言》
正確的USART通信要求發(fā)送和接收波特率的匹配度足夠高,否則可能發(fā)生通信錯(cuò)誤。
當(dāng)在兩個(gè)設(shè)備之間建立通信鏈路時(shí),自動(dòng)波特率檢測(cè)十分有用,因?yàn)閺脑O(shè)備能夠檢測(cè)到主控制器的波特率并進(jìn)行相應(yīng)的自我調(diào)整。這需要使用一種自動(dòng)機(jī)制來(lái)確定波特率。
某些STM32器件中內(nèi)置的USART外設(shè)提供許多功能,包括硬件自動(dòng)波特率檢測(cè)。
本應(yīng)用筆記旨在介紹STM32微控制器的自動(dòng)波特率檢測(cè)功能,并為沒(méi)有在硬件中實(shí)現(xiàn)此功能的STM32器件提供替代軟件方法。
本應(yīng)用筆記適用于表 1中所列產(chǎn)品。
《硬件自動(dòng)波特率檢測(cè)》
1、特性概述
自動(dòng)波特率檢測(cè)(ABR)使接收設(shè)備能夠接受來(lái)自各種以不同速率工作的發(fā)送設(shè)備的數(shù)據(jù),無(wú)需事先建立數(shù)據(jù)速率。
在一些STM32產(chǎn)品中,USART能夠使用專用硬件自動(dòng)確定波特率。
表 2提供了支持自動(dòng)波特率檢測(cè)的STM32系列設(shè)備的概述。
對(duì)于內(nèi)置ABR的STM32系列設(shè)備而言,并非所有實(shí)例化USART接口均支持自動(dòng)波特率檢測(cè)。
表 3詳細(xì)說(shuō)明了這一限制。
2、自動(dòng)波特率檢測(cè)模式
ABR是指接收設(shè)備通過(guò)檢查第一個(gè)字符(通常是預(yù)先選擇的標(biāo)志字符)確定傳入數(shù)據(jù)速率的過(guò)程。
STM32產(chǎn)品上的自動(dòng)波特率檢測(cè)功能內(nèi)置的各種模式基于不同字符模式:
?以“1”位為開頭的任意字符:模式0
?以10xx模式開頭的任何字符:模式1
?0x7F:模式2
?0x55:模式3
在激活自動(dòng)波特率檢測(cè)之前,必須通過(guò)USARTx_CR2寄存器中的ABRMOD[1:0]字段選擇一種ABR模式。在所有ABR模式下,都會(huì)在同步數(shù)據(jù)接收期間多次檢測(cè)波特率,并將每一次的檢測(cè)值與上一次的檢測(cè)值進(jìn)行比較。
注:在7位數(shù)據(jù)長(zhǎng)度模式下,不支持0x7F和0x55幀檢測(cè)ABR模式。
3、ABR誤差計(jì)算
由USART時(shí)鐘源(fCK)決定通信速率范圍(尤其是最大通信速率)。接收器采用不同的用戶可配置過(guò)采樣技術(shù),可區(qū)分有效輸入數(shù)據(jù)和噪聲,從而用于恢復(fù)數(shù)據(jù)。這可以在最大通信速率與抗噪聲/時(shí)鐘不準(zhǔn)確性之間實(shí)現(xiàn)平衡。
可通過(guò)編程USARTx_CR1寄存器中的OVER8位來(lái)選擇過(guò)采樣方法,可以是波特率時(shí)鐘的16倍或8倍。
USART時(shí)鐘源頻率必須與預(yù)期通信速率兼容:
?16倍過(guò)采樣時(shí),波特率介于fCK/65535與fCK/16之間。
?8倍過(guò)采樣時(shí),波特率介于fCK/65535與fCK/8之間。
波特率誤差取決于USART時(shí)鐘源、過(guò)采樣方法和ABR模式。
其中:
?預(yù)期波特率取決于發(fā)送設(shè)備
?實(shí)際波特率是USART接收器使用自動(dòng)波特率檢測(cè)操作確定的波特率。
《軟件自動(dòng)波特率檢測(cè)》
如果不支持硬件自動(dòng)波特率檢測(cè),可采用本節(jié)描述的軟件方法。
軟件方法的理念是發(fā)送0x7F數(shù)據(jù)幀到USARTx_RX引腳。這將連接到EXTI線路,該線路被配置為在每個(gè)上升沿生成中斷。
使用Systick定時(shí)器測(cè)量?jī)蓚€(gè)上升沿之間間隔的持續(xù)時(shí)間。此持續(xù)時(shí)間對(duì)應(yīng)于8位的持續(xù)時(shí)間,因此
?位時(shí)間 = 計(jì)算的持續(xù)時(shí)間 / 8
?波特率 = 1/位時(shí)間
然后,根據(jù)計(jì)算的波特率值進(jìn)行USARTx_BRR寄存器編程。
《軟件和硬件方法設(shè)置》
此設(shè)置示例使用的是內(nèi)置硬件自動(dòng)波特率檢測(cè)功能的STM32F303xD/E。
PC應(yīng)用“超級(jí)終端”用于向/從STM32F303發(fā)送/接收數(shù)據(jù)幀。因此,測(cè)試的是介于600bits/s至115200 bits/s之間的標(biāo)準(zhǔn)波特率。使用另一個(gè)STM32F3器件作為發(fā)送器測(cè)試可以達(dá)到的最高波特率值(9 Mbits/s)。
1、USART1配置示例
在兩個(gè)示例中,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時(shí)鐘源是使用HSE PLL時(shí)鐘源的72 MHz系統(tǒng)時(shí)鐘。(某些測(cè)試使用HSI時(shí)鐘作為USART1時(shí)鐘源來(lái)執(zhí)行。這是為了檢查HSI不準(zhǔn)確性對(duì)結(jié)果的影響。)
2、硬件自動(dòng)波特率檢測(cè)
USART1被配置為自動(dòng)檢測(cè)波特率。用戶必須在USART1初始化函數(shù)中選擇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) {}
在整個(gè)初始化過(guò)程完成后,USART等待從超級(jí)終端接收數(shù)據(jù),然后開始自動(dòng)波特率檢測(cè)階段。通過(guò)ABRF標(biāo)志監(jiān)測(cè)此階段的結(jié)束。
?如果自動(dòng)波特率檢測(cè)操作不成功,則ABRE標(biāo)志置位
?如果自動(dòng)波特率檢測(cè)操作成功完成,則向超級(jí)終端發(fā)送確認(rèn)數(shù)據(jù)。
/* 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、軟件自動(dòng)波特率檢測(cè)
表 5詳細(xì)說(shuō)明了軟件方法。
4、誤差計(jì)算
圖 2顯示ABR模式2和3的精確度高于模式0和1;它們的波特率誤差值更低。
不過(guò),由于預(yù)期波特率與實(shí)際波特率之間的誤差小于1%,因此所有模式的結(jié)果均正常。
圖 3顯示在通常情況下,當(dāng)由72 MHz系統(tǒng)時(shí)鐘為USART提供時(shí)鐘(HSE作為PLL時(shí)鐘源)時(shí),結(jié)果優(yōu)于USART時(shí)鐘源使用HSI時(shí)鐘。這要?dú)w因于HSI的相對(duì)不準(zhǔn)確性。
圖 4顯示在大多數(shù)情況下,硬件方法提供的結(jié)果優(yōu)于軟件方法。不過(guò),在某些情況下,軟件方法能夠提供相比于使用硬件方法時(shí)更好的結(jié)果。
圖 5顯示:
?使用硬件方法時(shí),達(dá)到最大波特率9 Mbits/s時(shí)誤差為0%。
?使用軟件方法時(shí),達(dá)到最大波特率時(shí)誤差為約30%,這要?dú)w因于執(zhí)行中斷處理程序所花費(fèi)的CPU周期。
《結(jié)論》
此應(yīng)用筆記描述了某些STM32器件內(nèi)置的硬件自動(dòng)波特率檢測(cè)功能。它還提供了在軟件中實(shí)現(xiàn)此功能的技術(shù),作為STM32器件沒(méi)有在硬件中實(shí)現(xiàn)此功能的解決方案。
盡管示例中的自動(dòng)波特率檢測(cè)均應(yīng)用在示例的開頭部分,但是可以進(jìn)行擴(kuò)展并在每次發(fā)送和接收設(shè)備檢測(cè)到通信錯(cuò)誤時(shí)使用。當(dāng)主機(jī)使用不同波特率進(jìn)行通信時(shí),這一特性可實(shí)現(xiàn)應(yīng)用的穩(wěn)健性。
審核編輯 :李倩
-
通信
+關(guān)注
關(guān)注
18文章
6034瀏覽量
136037 -
STM32
+關(guān)注
關(guān)注
2270文章
10901瀏覽量
356224 -
USART
+關(guān)注
關(guān)注
1文章
195瀏覽量
30874
原文標(biāo)題:STM32的USART自動(dòng)波特率檢測(cè)
文章出處:【微信號(hào):airX嵌入式,微信公眾號(hào):airX嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論