天天看點

STM32CubeMX之序列槽不定長資料接收(接收中斷+空閑中斷)

概述

​ 上一篇講了用序列槽中斷的方式接收資料,但是它有兩個缺點

  1. 隻能定長接收資料
  2. 如果資料超出,那麼産生溢出中斷,那時發送的資料将不再接收

    是以接下來就會用

    IDLE

    中斷來解決這個問題

文章目錄

      • 概述
      • 一. 空閑(IDLE)中斷
        • 1. 空閑幀
      • 二. 空閑中斷相關的宏
      • 三. 空閑中斷使用執行個體

環境:

  • 開發闆:STM32F4探索者(正點原子)

一. 空閑(IDLE)中斷

1. 空閑幀

​ 什麼是空閑幀?在 STM32的中文參考手冊 中,你會發現如下解釋:

​ 空閑幀可了解為整個幀周期内電平均為“1”(停止位的電平也是“1”),該幀後是下一個資料幀的起始位。如下圖所示:

STM32CubeMX之序列槽不定長資料接收(接收中斷+空閑中斷)

​ 其實按使用的情況來看,應是資料幀接收之後,從停止位開始一直為高電平,一直持續一幀的時間(包含停止位)為高電平,那時就會産生空閑中斷。

二. 空閑中斷相關的宏

  • 使能

    IDLE

    中斷
  • 擷取

    IDLE

    中斷标志位
  • 清除

    IDLE

    挂起标志位

三. 空閑中斷使用執行個體

​ 在上一篇文章(STM32CubeMX之序列槽使用(中斷方式))的測試代碼的基礎之上進行修改。

​ 在序列槽中斷處理函數中添加自定義的空閑中斷處理函數 ,如下圖所示:

STM32CubeMX之序列槽不定長資料接收(接收中斷+空閑中斷)

然後在主函數中,進行自定義空閑中斷處理函數 ,如下

//自定義空閑中斷處理函數
void HAL_UART_IDLE_HANDLER(UART_HandleTypeDef *huart)
{
   uint32_t isrflags   =  READ_REG(huart->Instance->SR); 
   if((USART_SR_IDLE & isrflags) != RESET && ( huart->RxXferCount > 0))
   {
       printf("idle\r\n");
       __HAL_UART_CLEAR_IDLEFLAG(huart);
      /* Disable the UART Data Register not empty Interrupt */
      __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
      /* Disable the UART Parity Error Interrupt */
      __HAL_UART_DISABLE_IT(huart, UART_IT_PE);
      /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
      __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);
      /* Rx process is completed, restore huart->RxState to Ready */
      huart1.RxState = HAL_UART_STATE_READY;  
      HAL_UART_RxCpltCallback(huart); 
   }else if((USART_SR_IDLE & isrflags) != RESET && ( huart->RxXferCount == 0 ))
   { 
       __HAL_UART_CLEAR_IDLEFLAG(huart);
      
   } 
}
           

在測試序列槽的結構中,添加初始化函數用來初始化使能空閑中斷,如下圖

STM32CubeMX之序列槽不定長資料接收(接收中斷+空閑中斷)

使用初始化函數如下:

STM32CubeMX之序列槽不定長資料接收(接收中斷+空閑中斷)

用調試助手顯示如下:

STM32CubeMX之序列槽不定長資料接收(接收中斷+空閑中斷)

測試代碼已上傳,歡迎下載下傳。

​後續還會繼續分享序列槽的其他基礎知識和使用,感興趣的小夥伴記得關注我!

-----------------------------------------------結束--------------------------------------------------------

文章有價值,請各位看官點個贊,關注我或者點右邊打個賞吧

繼續閱讀