STM32 串口DMA收發

DMA確實是個好東西!但是可能有很多初學者或者使用串口通信不是很快、且大數據量的情況下一般直接用了接收中斷去處理數據了。但是如果使用串口高頻率的進行大數據量收發的話那麼就要注意了,如果本身程序的架構寫的不是很好,或是上位機線程的不確定很有可能會導致丟幀或是溢出等問題。所以如果是使用STM32的外設進行通信建議優先使用DMA方式吧,現在以STM32F1系列串口進行簡單的DMA功能演示。

功能說明:上位機發送一幀長度爲70的數據給到串口,串口採用DMA進行接收,串口接收完畢後會掛起空閒中斷,在空閒中斷中設置接收完畢標誌,主函數中檢測接收標誌掛起則開啓串口DMA發送使能進行回傳接收到的一幀數據。

串口相關配置步驟:

①串口的GPIO的RCC配置

②串口外設RCC配置

③串口中斷的NVIC配置

④串口配置、串口DMA收發使能、空閒中斷使能

    USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);
    USART_DMACmd(USART1,USART_DMAReq_Rx|USART_DMAReq_Tx,ENABLE);

DMA相關配置步驟:

①DMA的RCC配置

②DMA中斷的NVIC配置

③分別對串口收發使用的DMA通道進行DMA配置

④DMA中斷的配置

DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);

說明:

①參考手冊中顯示STM32F1系列串口的最高波特率可達4.5mbps,實際配置中測試發現使用本人筆記本串口轉usb進行通信串口最高波特率配置爲921.6kbps可正常工作(mcu72M主頻),如再往上則爲亂碼,猜測爲筆記本串口不支持更高的串口波特率。

②實際測試過程中發現,上位機每幀長度70byte自動重發間隔最高設置爲20ms長時間測試未發現丟幀,如降低重發間隔,則會出現丟幀現象。就本人測試數據來看數據異常一般爲整一幀丟失,並未出現丟byte的情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章