前言
在串口通信過程中,我們常常用到接受和發送中斷,相信大家都不陌生。這里還有另一個非常有用的中斷可能被大家所忽略,即總線空閑狀態IDLE中斷。當一幀數據傳輸結束之后,總線會維持高電平空閑,此時會觸發MCU的IDLE中斷。在本文中,將介紹使用該中斷來進行不定長串口數據接收的辦法。通過該中斷,可以省卻用于檢測數據傳輸是否完成的判斷操作。
實驗環境
· STM32F411RE-NUCLEO
· STM32CubeMX
總線狀態分析
下圖是發送0xAA 0x55的所抓取到的波形。從圖中我們可以看到在發送該幀之前和之后,總線時鐘處于IDLE狀態。在該幀中,字節與字節之間,沒有IDLE狀態出現,即不會出現IDLE誤觸發的情況。
不定長數據接收
本次制作的工程是基于HAL庫的。在原生的HAL庫中,并沒有集成IDLE中斷的處理。所以,在本文我們介紹的方法中,需要修改一些庫文件來實現。
使用 STM32CubeMX 生成實驗工程
工程的配置如下圖:
1. 系統始終配置為100MHz
2. 配置USART2為Asynchrones,管腳配置為PA2,PA3。
3. USART2參數:9600Bits/s, 8bits, None,1Stop
為了方便打印接收到的相關信息,需要對生成的工程做如下修改來映射print函數。
main.c-聲明
main.c-Code
修改工程代碼
增加接收Buffer
main.c
stm32f4xx_hal_uart.c
在接收函數中使能IDLE中斷
stm32f4xx_hal_uart.c -> HAL_UART_Receive_DMA()函數
處理IDLE中斷
stm32f4xx_hal_uart.c -> HAL_UART_IRQHandler ()函數
接收完成處理(IDLE產生,一幀數據傳輸完成)
stm32f4xx_hal_uart.c -> HAL_UART_AbortReceive_IT ()函數
main.c
使能接收
main.c
實驗結果
使用串口調試,通過STLINK的虛擬串口發送數據,MCU會返回接收多少個字節的數據,并將接收到的數據打印出來。下圖是發送0xAA 0x55的實驗結果。
小結
合理使用串口總線空閑狀態中斷,在接收那些數據量不確定的場合會非常方便,同時也能很好地優化代碼設計。
審核編輯:彭菁
-
mcu
+關注
關注
146文章
16984瀏覽量
350294 -
數據
+關注
關注
8文章
6888瀏覽量
88826 -
參數
+關注
關注
11文章
1784瀏覽量
32086 -
uart
+關注
關注
22文章
1227瀏覽量
101171
發布評論請先 登錄
相關推薦
評論