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是在關閉的時候才能修改!!

空閑中斷實現及中斷錯誤處理:

(30條消息) stm32: 串口空閑中斷的實現(HAL庫)_hal庫串口空閑中斷_哈搭石的博客-CSDN博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM