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