STM32 硬件UART接收超時檢測設置

STM32 硬件UART接收超時檢測設置

-----------------本文做者「智御電子」,期待與電子愛好者交流學習。----------------函數

應用場景

在uart應用中有時候須要進行雙工通訊,主機須要對從機的數據進行接收超時檢測,例如modbus協議,主機在接收從機數據在3.5個字節時間後認爲數據包接收完畢。那在這種狀況下,通常的作法是設置一個定時器,在每接收到一個字節時清零定時器從新計數,直到定時器超過3.5個字節時間後觸發中斷即默認數據包接收完畢。oop

以上的定時器設置的超時判斷是須要軟件介入的。這裏STM32的有些串口是提供硬件超時檢測功能。這樣就省去如上的步驟。學習

設置步驟

本實驗是利用CubeMx生成的工程進行驗證的。測試

  • 首先,利用cubemx配置usart1(注意:並非每一個STM32芯片的串口都具備硬件超時檢測功能的)。值得注意的是在cubeMX中並無設置硬件超時的選項,因此這裏只是生產可用的usart工程。
  • 生成工程後,咱們去數據手冊,其中有這樣的描述。

    因此本文添加一個使能超時檢測的函數,以下所示
void Uart_RxOvertimeEnable(void)
{
    /*使能接收超時功能*/
    SET_BIT(huart1.Instance->CR2,USART_CR2_RTOEN);
    /*使能超時接收中斷*/
    //SET_BIT(huart1.Instance->CR1,USART_CR1_RTOIE);
    /*向RTOR寄存器填入須要超時的長度,單位爲一個波特時長,3.5個字節*11波特長度 = 39  */
    WRITE_REG(huart1.Instance->RTOR,39);  
}
  • 接着在main函數中添加這個函數,而且寫了一個小小的測試實例。
int main(void)
{

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* Configure the system clock */
  SystemClock_Config();
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  /*使能超時檢測*/
  Uart_RxOvertimeEnable();
  /* Infinite loop */
  /*採用中斷接收數據,模擬接收*/
  HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 100);
  while (1)
  { 
    //數據接收後,一直等待超時
   while(READ_BIT(huart1.Instance->ISR,USART_ISR_RTOF))
    { 
        /*清除rtof標誌*/
         SET_BIT(huart1.Instance->ICR,USART_ICR_RTOCF);
        /*將接收的數據發送出去測試一下*/
       HAL_UART_Transmit_IT(&huart1, (uint8_t *)aRxBuffer, 100);
       HAL_Delay(1000);
    }       
  }
}
  • 最後經過串口調試助手經過上位機發送數據(this is test!)給單片機,單片機能返回數據(後面的***是由於打印了空字節,忽略),則證實有效。
相關文章
相關標籤/搜索