最近有朋友問(wèn)關(guān)于UART串口自動(dòng)識(shí)別波特率的問(wèn)題,今天就在這里寫(xiě)點(diǎn)相關(guān)內(nèi)容。
1寫(xiě)在前面
關(guān)于自動(dòng)識(shí)別UART串口波特率的這個(gè)問(wèn)題,相信有項(xiàng)目經(jīng)驗(yàn),或者認(rèn)真研究過(guò)串口的朋友都應(yīng)該多多少少知道一點(diǎn)自動(dòng)識(shí)別的方法。
可能絕大部分知道的就是通過(guò)波特率一一匹配來(lái)實(shí)現(xiàn),這種方法也是最常見(jiàn),而且還比較有效的一種方法。
上面這種方法就是大家熟知的通過(guò)軟件來(lái)檢測(cè)波特率的方法,其實(shí),還有一種方法就是通過(guò)硬件自身完成波特率來(lái)檢測(cè)。
針對(duì)STM32,在ST官方其實(shí)在應(yīng)用筆記和參考手冊(cè)文檔中都有提到。下面,我結(jié)合文檔簡(jiǎn)單講下硬件自動(dòng)波特率檢測(cè)的內(nèi)容。
2
STM32硬件自動(dòng)波特率檢測(cè)
ABR:Auto Baud Rate,自動(dòng)波特率檢測(cè)使接收設(shè)備能夠接受來(lái)自各種以不同速率工作的發(fā)送設(shè)備的數(shù)據(jù),無(wú)需事先建立數(shù)據(jù)速率。
1.ABR應(yīng)用地方
事先不知道系統(tǒng)的通信速度。
系統(tǒng)正在使用精確度相對(duì)較低的時(shí)鐘源且該機(jī)制允許在不測(cè)量時(shí)鐘偏差的情況下獲得正確的波特率。
2.支持ABR系列
在STM32中,支持硬件自動(dòng)波特率檢測(cè)的只有部門(mén)系列才支持,之前出來(lái)比較早的系列不支持(如F1 F4),這后面推出來(lái)的系列都支持這個(gè)功能,包含最新才出來(lái)的STM32H7、G0系列都支持。
當(dāng)然,對(duì)于內(nèi)置ABR的STM32系列設(shè)備而言,并非所有實(shí)例化USART接口均支持自動(dòng)波特率檢測(cè)。
3.自動(dòng)波特率檢測(cè)模式
ABR是指接收設(shè)備通過(guò)檢查第一個(gè)字符(通常是預(yù)先選擇的標(biāo)志字符)確定傳入數(shù)據(jù)速率的過(guò)程。
STM32產(chǎn)品上的自動(dòng)波特率檢測(cè)功能內(nèi)置的各種模式基于不同字符模式:
模式0:以“1”位為開(kāi)頭的任意字符;
模式1:以10xx模式開(kāi)頭的任何字符;
模式2:0x7F;
模式3:0x55;
提示:
A.在所有ABR模式下,都會(huì)在同步數(shù)據(jù)接收期間多次檢測(cè)波特率,并將每一次的檢測(cè)值與上一次的檢測(cè)值進(jìn)行比較。
B.在7位數(shù)據(jù)長(zhǎng)度模式下,不支持0x7F和0x55幀檢測(cè)ABR模式。
4.代碼配置
相關(guān)代碼,官方提供有基于(標(biāo)準(zhǔn)外設(shè)庫(kù)、HAL庫(kù)的)參考例程,比如F0標(biāo)準(zhǔn)外設(shè)庫(kù)參考代碼:
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誤差計(jì)算
由USART時(shí)鐘源( fCK)決定通信速率范圍(尤其是最大通信速率)。接收器采用不同的用戶(hù)可配置過(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è)操作確定的波特率。
6.誤差
下圖來(lái)自官方測(cè)試數(shù)據(jù),基于:fCK = 72 MHz時(shí)ABR的誤差計(jì)算,115200 bits/s預(yù)期波特率
從上圖可以看出:ABR模式2和3的精確度高于模式0和1;它們的波特率誤差值更低。
不過(guò),由于預(yù)期波特率與實(shí)際波特率之間的誤差小于1%,因此所有模式的結(jié)果均正常。
-
STM32
+關(guān)注
關(guān)注
2270文章
10895瀏覽量
355740 -
uart
+關(guān)注
關(guān)注
22文章
1235瀏覽量
101354 -
波特率
+關(guān)注
關(guān)注
2文章
307瀏覽量
34115 -
代碼
+關(guān)注
關(guān)注
30文章
4779瀏覽量
68524
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論