天天看點

stm32序列槽_STM32序列槽自動識别波特率

stm32序列槽_STM32序列槽自動識别波特率

1寫在前面

關于自動識别UART序列槽波特率的這個問題,相信有項目經驗,或者認真研究過序列槽的朋友都應該多多少少知道一點自動識别的方法。

可能絕大部分知道的就是

通過波特率一一比對來實作

,這種方法也是最常見,而且還比較有效的一種方法。

上面這種方法就是大家熟知的

通過軟體

來檢測波特率的方法,其實,還有一種方法就是

通過硬體

自身完成波特率來檢測。

針對STM32,在ST官方其實在應用筆記和參考手冊文檔中都有提到。下面,我結合文檔簡單講下硬體自動波特率檢測的内容。

2 STM32硬體自動波特率檢測

ABR:Auto Baud Rate,自動波特率檢測

使接收裝置能夠接受來自各種以不同速率工作的發送裝置的資料,無需事先建立資料速率。

1.ABR應用地方
  • 事先不知道系統的通信速度。
  • 系統正在使用精确度相對較低的時鐘源且該機制允許在不測量時鐘偏差的情況下獲得正确的波特率。
2.支援ABR系列

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

stm32序列槽_STM32序列槽自動識别波特率

當然,對于内置ABR的STM32系列裝置而言,并非所有執行個體化USART接口均支援自動波特率檢測。

stm32序列槽_STM32序列槽自動識别波特率
3.自動波特率檢測模式

ABR是指接收裝置通過檢查第一個字元(通常是預先選擇的标志字元)确定傳入資料速率的過程。

STM32産品上的自動波特率檢測功能内置的各種模式基于不同字元模式:

模式0:

以“1”位為開頭的任意字元;

模式1:

以10xx模式開頭的任何字元;

模式2:

0x7F;

模式3:

0x55;

stm32序列槽_STM32序列槽自動識别波特率
提示: 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模式。

stm32序列槽_STM32序列槽自動識别波特率

其中:

• 預期波特率取決于發送裝置

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

6.誤差

下圖來自官方測試資料,基于:fCK = 72 MHz時ABR的誤差計算,115200 bits/s預期波特率

stm32序列槽_STM32序列槽自動識别波特率

從上圖可以看出:ABR模式2和3的精确度高于模式0和1;它們的波特率誤內插補點更低。

不過,由于預期波特率與實際波特率之間的誤差小于1%,是以所有模式的結果均正常。

物聯網開發 - 直播課程 - 創客學院​www.makeru.com.cn

stm32序列槽_STM32序列槽自動識别波特率

物聯網項目開發 - 智能小車設計 - 創客學院直播室​www.makeru.com.cn

stm32序列槽_STM32序列槽自動識别波特率