1. 程式人生 > 其它 >STM32空閒中斷+DMA(轉)

STM32空閒中斷+DMA(轉)

文章參考自:STM32開發---USART接收不定長資料 (空閒中斷+DMA)_zhouml_msn的部落格-CSDN部落格

USART 的兩種資料接收方式
1:RENE - 非空中斷

最常用!程式碼簡單!
但資料處理時稍麻煩,常配合簡單的資料協議,如判斷某字元為接收結束標誌。正點原子的程式碼中USART接收就是使用這種方式。每個位元組中斷一次。系統實時性要求較高時得注意, 如無人機等.

2:IDLE - 空閒中斷 + DMA

最好用!
DMA接收:無需程式碼干預,DMA自動把接收到的位元組,順序存放到指定陣列快取!
空閒中斷:自接收到上個位元組完成起(RXNE=1),超過一個位元組週期時長沒收到新資料,產生硬體中斷(USART的SR第4位IDLE被置1),這時USART_IRQHANDLER()函式被呼叫,使用者可在這裡識別中斷的型別,並做資料處理。
空閒中斷-使用場景
適用:絕大部分場景都適用。

不適用:接收的位元組資料間隔,大於1位元組週期時長的! 如正點原子的LORA模組,硬體機制1ms傳送1個位元組,即115200波特率下接收一位元組用90us,但後面900us左右間隔是閒置的,這類機制,不適合使用空閒中斷。

程式碼編寫注意坑點
1. IDLE的中斷清理方式.

USART的非空中斷標誌位, 是自動清理的, 你只要讀出資料, 標誌會就自動被清, 不用自己費心.
但IDLE的中斷標誌位, 必須通過軟體序列清零, 步驟如下:
u32 temp;
temp=USART1->SR;
temp=USART1->DR;
這兩句順序還不能錯, 之前沒細心看手冊, 除錯差點爆血管. 前人不說, 撞牆也想不出來這前因後果!!
2. DMA 設定

使用DMA時, 一般會設定明確的傳輸資料量, 就是長度是已知道的; 而IDLE 空閒中斷 , 最方便的就是接收不定長資料.
所以NDTR(傳輸數量)要設得比實際數量要大, 注意單位:你的字長, 如200. 大多少沒關係.
中斷處理時, 要重新設定DMA的NDTR. 另外: DMA是在關閉的時候才能修改!!