STM32 HAL庫中串口空閑中斷+DMA實驗


開啟空閑中斷並開啟dma 無IT接收
添加空閑中斷處理函數與實體
編寫中斷處理實體
 
此時我們定義的數組長度是50
發送超過10個以上的字符將會被截斷

設置DMA發送:
發送好幾次4個字節每次只接受的到一個:
調試發現memset不能在DMA傳送之后,因為DMA被cpu開啟后就會自己傳送,cpu接着執行下一條語句memeset會刪除DMA需要發送的緩存區.
所以需要在傳送完成之后在執行memset,需要配合DMA傳送完成中斷來做
其實配置發現DMA在usart配置中是默認開啟的。
所以:
如果傳輸要啟動中斷,需要調用:HAL_UART_Transmit_IT,以中斷方式啟動DMA才會傳輸完成是啟動回調函數
在Transmit_DMA函數中:
傳送完成將調用框中的DMA傳送完成函數:此函數又將調用:
而一般USE_HAL_UART_REGISTER_CALLBACKS=0,所以會調用弱函數
串口注冊的回調函數,所以,最終傳輸完成會調用上圖中的函數
我們實現此函數:傳送完成在清除數據:
數據正常

用Queue實現指針傳送:queue傳送有數據的結構體的地址。
 
指針4字節也就是32位
創建結構體:
定義兩個結構體也就是兩個緩沖區,一個接收則另一個發送
重新定義空閑中斷處理函數:和清零回調函數,pre_stru表示當前是0號還是1號結構體正在被接收DMA使用
設置改任務的優先級最高,當有隊列消息是立馬通過發送過來的結構體地址回發出去

 

有個小bug:還未解決:
上電第一次點擊發送下位機不會回應,點擊第二次才開始回應后面點擊都正常?


免責聲明!

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



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