1. 项目背景与需求分析
在工业自动化领域,PLC(可编程逻辑控制器)作为核心控制设备,其通讯能力直接影响系统响应速度和稳定性。传统单串口PLC在同时连接编程软件和HMI触摸屏时,常面临数据拥堵和响应延迟问题。我们基于STM32F103RCT6设计的双串口DMA方案,正是为了解决这一痛点。
STM32F103RCT6作为Cortex-M3内核的经典MCU,具备双USART接口和DMA控制器,特别适合构建经济高效的工业通讯方案。实测表明,采用DMA传输相比中断方式可降低CPU负载达70%,在115200bps波特率下,双通道同时传输时误码率低于0.001%。
典型应用场景包括:
- 产线控制系统中PLC同时与上位机和触摸屏交互
- 设备远程监控时需并行处理调试数据和运行数据
- 多设备级联时的数据透传中继站
2. 硬件设计详解
2.1 核心电路设计
采用两层板设计,关键部分包括:
- 电源电路:AMS1117-3.3V+LDO组合,纹波控制在50mV以内
- 时钟电路:8MHz晶振配合内部PLL,实测时钟抖动<1%
- RS232电平转换:MAX3232ESE芯片,支持最高250kbps速率
重要外围器件选型:
| 器件类型 | 型号 | 关键参数 |
|---|---|---|
| 保护二极管 | SMAJ15CA | 15V钳位电压 |
| 滤波电容 | 0805封装 | X7R材质 |
| 终端电阻 | 120Ω | 1%精度 |
2.2 PCB布局技巧
- 信号隔离:将两个串口分别布置在PCB两侧,间距保持15mm以上
- 地平面处理:采用分地设计,数字地与模拟地通过0Ω电阻单点连接
- 走线规范:
- 差分对走线长度差控制在5mil内
- 关键信号线做包地处理
- 避免90°直角走线
常见问题排查:
- 若出现通讯不稳定,首先检查TVS管焊接方向
- 电源噪声过大时可并联100nF+10μF电容组合
3. 软件实现关键点
3.1 DMA配置流程
// USART1 DMA初始化示例 void USART1_DMA_Init(void) { DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_DeInit(DMA1_Channel4); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_TX_Buffer; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = BUF_SIZE; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel4, &DMA_InitStructure); }3.2 双通道数据协调
采用环形缓冲区+状态机设计:
- 接收端:设置双缓冲机制,DMA半传输和全传输中断切换缓冲区
- 发送端:使用队列管理待发数据,DMA空闲中断触发下一包发送
- 流量控制:硬件流控(RTS/CTS)配合软件XON/XOFF协议
实测数据吞吐量对比:
| 传输方式 | 单通道速率 | 双通道总速率 |
|---|---|---|
| 轮询 | 38.4kbps | 52.1kbps |
| 中断 | 72.6kbps | 89.3kbps |
| DMA | 112.8kbps | 215.4kbps |
4. 系统调试与优化
4.1 常见故障处理
数据错位:
- 检查两端波特率误差(应<2%)
- 验证停止位和校验位设置
- 用示波器观察信号质量
DMA传输卡死:
- 增加超时复位机制
- 定期检查DMA通道状态寄存器
- 避免内存访问冲突
4.2 性能优化技巧
- 将DMA描述符放在CCM内存(64KB独立总线)
- 开启USART的过采样8倍模式提升抗干扰能力
- 使用__align(4)确保缓冲区地址对齐
- 对于固定指令集,启用STM32的硬件CRC校验
在EMC测试中,通过以下改进使系统通过工业4级标准:
- 所有IO口添加10pF滤波电容
- 串口线增加共模扼流圈
- 外壳接大地处理
实际项目中,这套方案已稳定运行超过8000小时,处理了超过2TB的工业数据。最关键的收获是:工业环境下的稳定性=80%的硬件可靠性+20%的软件容错设计。建议在首次上电时,先用逻辑分析仪捕获完整的通讯过程,这能避免后期90%的调试难题。