我們使用輪詢方式接收計算機端發送過來的數據,但是這種方式需要一直在循環語句中查詢是否有數據發送過來,這種方式效率非常低。
為了提高處理器的執行效率,我們使用中斷方式接收計算機端發送過來的數據,當計算機端有數據發送過來時,會觸發STM32的串口中斷,并執行中斷回調函數。
在這種方式中,不用反復去查詢串口是否接收到數據,所以效率非常高,實時性也更好。
HAL庫的中斷接收函數和中斷發送函數分別為HAL_UART_Receive_IT和HAL_UART_Transmit_IT。下面我們對常用的中斷方式接收函數HAL_UART_Receive_IT進行重點介紹。
HAL_UART_Receive_IT函數的原型如下
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
它的三個參數分別為串口句柄,接收到的數據存儲的目標地址和接收多少個字節的數據。
打開函數HAL_UART_Receive_IT,可以看到它的定義如圖8-24所示。
圖8-24 函數HAL_UART_Receive_IT內容示意圖
可以看到,函數HAL_UART_Receive_IT并沒有實際進行數據接收,而只是對串口句柄huart的接收信息進行初始化和使能相關中斷,這些使能中斷的最后一個即為使能串口接收中斷。
由于函數HAL_UART_Receive_IT本質上是對串口的中斷進行使能,所以和設置系統時鐘一起放置于main函數的系統初始化代碼中,而不是放在while循環中反復查詢、執行。
為了便于對比,圖8-25給出了輪詢方式接收函數的定義。
圖8-25 輪詢方式接收函數HAL_UART_Receive定義示意圖
由輪詢方式接收函數的定義可以看到,函數HAL_UART_Receive是確實在接收數據并保存到參數pData指向的存儲單元中。這點和中斷方式接收函數完全不同,讀者千萬不要被函數名迷惑了。
那中斷方式是如何接收數據的呢?下面我們來介紹中斷方式接收數據的步驟。
(1)使能接收中斷。
(2)接收到數據后觸發接收數據中斷,此時程序按以下步驟執行。
①到中斷向量表中找到USART1的中斷入口,如圖8-26所示。
圖8-26 USART1中斷函數入口
②執行中斷函數USART1_IRQHandler,在該中斷函數中調用HAL庫的USART1中斷函數,如圖8-27所示。
圖8-27 USART的中斷函數的內容
注意,該函數需要用戶自己實現,如果用戶使用CubeMX生成工程,則工程會自動在輸出文件stm32f4xx_it.c中生成該函數。
③執行HAL庫的中斷函數HAL_UART_IRQHandler。在該函數中先判斷是否存在接收錯誤,如果不存在,則執行函數UART_Receive_IT(),如圖8-28所示。
圖8-28 函數HAL_UART_IRQHandler定義示意圖
④執行接收完成中斷函數UART_Receive_IT(),如圖8-29所示。
圖8-29 函數UART_Receive_IT()定義示意圖
由圖可見,在該函數中首先判斷字長是9位還是8位,如果是8位,則根據是否使能奇偶校驗使用如下語句讀取數據(見圖8-29中的①):
if (huart- >Init.Parity == UART_PARITY_NONE) /* 如果沒有使能奇偶校驗,數據位為8位 */
{
*huart- >pRxBuffPtr++ = (uint8_t)(huart- >Instance- >DR & (uint8_t)0x00FF);
}
else /* 如果使能了奇偶校驗,數據位為7位 */
{
*huart- >pRxBuffPtr++ = (uint8_t)(huart- >Instance- >DR & (uint8_t)0x007F);
}
在上述程序段中,程序首先將接收到的數據保存到句柄huart的接收區緩沖指針pRxBuffPtr指向的存儲單元中,然后指針pRxBuffPtr的值加1,指向下一個存儲單元。
所以,在中斷方式接收中,數據的接收在中斷函數中完成。
讀到一個數據后,huart的接收計數變量RxXferCount的值減1,并判斷減到0了沒有,如果減到0了,說明數據已經接收完成,關閉串口中斷,如圖8-30中的②所示,接著執行接收完成中斷回調函數HAL_UART_RxCpltCallback,如圖8-30中的③所示。
⑤執行回調函數HAL_UART_RxCpltCallback。由于在步驟④中執行函數UART_Receive_IT時已經關閉了串口的接收中斷,所以如果要繼續采用中斷方式接收數據,則需要在回調函數中再次調用函數HAL_UART_Receive_IT使能串口中斷。
-
接收機
+關注
關注
8文章
1221瀏覽量
54384 -
STM32
+關注
關注
2291文章
11022瀏覽量
363485 -
串口中斷
+關注
關注
0文章
67瀏覽量
14301 -
系統時鐘
+關注
關注
1文章
31瀏覽量
9580 -
HAL庫
+關注
關注
1文章
121瀏覽量
6839
發布評論請先 登錄
STM32使用CubeMAX配置的串口中斷接收方法是什么
STM32 HAL庫多串口中斷通訊【任意長度 不丟幀】精選資料分享
【STM32的HAL庫開發】CubeMX配置HAL庫,不進串口中斷的問題 精選資料分享
【STM32+cubemx】0005 HAL庫開發:uart串口中斷和fifo環形隊列

STM32 HAL庫中串口空閑中斷+DMA 實現串口數據的不定長接收

STM32使用CubeMAX配置的串口中斷接收方法

評論