GD32F103实战指南(7):USART串口中断与DMA高效数据收发

张开发
2026/4/18 14:27:17 15 分钟阅读

分享文章

GD32F103实战指南(7):USART串口中断与DMA高效数据收发
1. USART串口通信基础与GD32F103实战价值串口通信就像两个人在用对讲机聊天只不过这里的人换成了芯片和外部设备。GD32F103的USART模块相当于一个智能对讲机既能同步也能异步通信。实际项目中我更喜欢用异步模式UART因为它不需要额外的时钟线布线简单成本低。这个国产MCU的USART有几个实用特性特别值得关注首先是小波特率发生器我实测在115200波特率下误差不到0.1%比某些进口芯片还稳定其次是支持LIN总线去年做汽车电子项目时就靠这个省了颗专用芯片最关键是DMA功能在接收传感器数据流时能降低80%的CPU占用率。2. 中断模式下的高效数据收发2.1 中断服务函数优化技巧新手常犯的错误是把中断服务函数写成百货商店——什么功能都往里塞。我在调试工业传感器时吃过亏后来总结出三条铁律中断里只做最紧急的事比如把数据存到缓冲区绝对避免调用库函数特别是带延时的那种处理时间要短于数据间隔这是优化后的中断处理代码#define BUF_SIZE 256 uint8_t rx_buffer[BUF_SIZE]; uint16_t buf_index 0; void USART0_IRQHandler(void) { if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){ rx_buffer[buf_index] usart_data_receive(USART0); if(buf_index BUF_SIZE) buf_index 0; // 环形缓冲区处理 } }2.2 常见数据丢失问题排查上周还有个网友问我为什么收到的数据总是丢最后几个字节 这个问题我踩过坑根本原因在于没有正确处理TC传输完成标志。分享我的检查清单波特率误差是否超过3%用示波器测量实际波形发送完成判断要这样写while(RESET usart_flag_get(USART0, USART_FLAG_TC)); // 注意是TC不是TBE中断优先级是否被其他高优先级中断抢占3. DMA模式实战配置3.1 DMA通道配置详解GD32的DMA控制器就像个快递小哥能自动搬运数据。配置时要注意这几点外设地址要写成USART_DATA(USART0)内存地址建议用数组首地址传输宽度记得匹配串口字长这是我在智能家居项目中验证过的配置dma_parameter_struct dma_init_struct; dma_deinit(DMA0, DMA_CH4); dma_init_struct.direction DMA_PERIPHERAL_TO_MEMORY; dma_init_struct.memory_addr (uint32_t)rx_dma_buffer; dma_init_struct.memory_inc DMA_MEMORY_INCREASE_ENABLE; dma_init_struct.memory_width DMA_MEMORY_WIDTH_8BIT; dma_init_struct.number BUF_SIZE; dma_init_struct.periph_addr (uint32_t)USART_DATA(USART0); dma_init_struct.periph_inc DMA_PERIPH_INCREASE_DISABLE; dma_init_struct.periph_width DMA_PERIPHERAL_WIDTH_8BIT; dma_init_struct.priority DMA_PRIORITY_HIGH; dma_init(DMA0, DMA_CH4, dma_init_struct);3.2 双缓冲区的妙用处理高速数据流时我推荐使用双缓冲区方案。具体做法是准备两个缓冲区A和BDMA先填满缓冲区A触发半传输中断时切换缓冲区B主程序处理非活跃缓冲区的数据这样既不会丢数据又能给主程序足够的处理时间。实测在1Mbps波特率下也能稳定工作。4. 工程实践中的可靠性设计4.1 错误检测与恢复机制好的串口通信要像老司机开车——既知道怎么走也要懂得应对突发状况。这几个错误处理技巧很实用帧错误检测定期检查USART_FLAG_FERR标志噪声过滤连续三次收到相同数据才确认有效超时机制用定时器判断数据是否接收完整4.2 实际项目中的参数优化根据我在工业现场的经验这些参数组合最稳定应用场景波特率停止位校验位缓冲区大小传感器采集1152001偶校验512字节无线模块通信576001无1024字节设备固件升级4608001奇校验2048字节调试时建议先用USB转TTL工具测试等通信稳定后再接实际设备。最近帮客户排查的一个诡异问题最后发现是RS485终端电阻没焊好。

更多文章