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的情況。