1. 程式人生 > >STM32串口發送中斷

STM32串口發送中斷

!= com 原因 htm modbus .html 輸出 trees dma

今日進行串口數據通信時,使用DMA串口485發送完成中斷進行485發送至接收的狀態轉換時發現,當DMA傳輸完成時,串口發送寄存器中的數據還未通過發送端口傳輸完成,在中斷中需等待查詢串口發送的狀態,while((USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET)); 造成中斷程序程序的阻塞,以5Mbit/s的波特率的計算的話阻塞約3us。 對控制程序仍有很大影響,以簡化中斷處理時間的原則,

采用以下改正方法:

1、使用485自動收發電路,(存在的問題是:成本較高,波特率可能達不到,接收狀態時同樣需要信號輸出引腳端置為低電平,若切換時有中斷進來,延長發送狀態會對總線的數據造成影響。 (電路參考485通訊電路總結http://www.cnblogs.com/my-trees/p/8028960.html))所以不可取。

2、改用發送完成中斷進行485發收狀態的切換,(用DMA串口空閑中斷進行收據的接收)。這樣在串口傳輸完成後即可進行485接收狀態的切換,避免程序阻塞,減少了中斷的執行時間,降低了對控制程序的影響。

在采用方法2進行處理時,在程序中對中斷類型進行判斷,發現在使用串口1中斷後,程序會頻繁進入串口中斷,斷開通訊、關閉接受空閑中斷同樣也會進入,

原因是在發送完成中斷使能後,使能串口USART_Cmd(USART1, ENABLE)時觸發串口中斷;通過仿真看到。CR寄存器發送中斷標誌第6位發送完成中斷位置位,觸發發送完成中斷。 所以在使能發送完成中斷狀態時,當使能串口時USART_Cmd(USART1, ENABLE);程序會進入一次發送完成中斷程序(這與MODBUS發數據協議中介紹的相同,當使能串口發送中斷時STM32會自動發送一個空閑幀觸發中斷描述相同 )。

循環進入中斷是因為在發送完成中斷中轉換485為接受狀態後,重新配置了串口接收DMA,重新使能了串口,造成串口發送完成中斷循環進入。

STM32串口發送中斷