1. 项目概述与准备工作
大家好,今天我来分享一个在STM32F103平台上使用USART的DMA传输机制实现Modbus从机协议的实战经验。这个项目特别适合需要高效串口通信的工业控制场景,比如传感器数据采集、设备监控等。我会从环境搭建开始,一步步带你完成整个实现过程,包括CubeMX配置、DMA收发机制、Modbus协议处理,最后还会教你如何用Modbus Poll工具进行测试。
为什么选择DMA+Modbus这个组合? 在实际项目中,我发现传统的串口中断方式在处理大量数据时容易导致CPU负载过高,影响系统实时性。而DMA(直接内存访问)可以在不需要CPU干预的情况下完成数据搬运,大大提高了效率。结合Modbus这一工业领域广泛应用的通信协议,可以轻松实现设备间的可靠数据交换。
你需要准备以下工具和环境:
- STM32CubeMX(推荐V6.10或更高版本)
- Keil MDK或STM32CubeIDE
- Modbus Poll和Modbus Slave软件(用于测试)
- 一块STM32F103开发板(我这里用的是ZET6核心板)
- USB转串口模块(如果板载没有的话)
Modbus测试软件可以从百度网盘下载(提取码bai8),使用方法参考CSDN上的详细教程。如果你用的是其他STM32系列,比如F4或H7,配置方法基本类似,只是DMA通道和寄存器名称可能稍有不同。
2. CubeMX基础配置
首先打开STM32CubeMX,新建一个工程,选择你的芯片型号(我这里是STM32F103ZET6)。第一步配置时钟树,将系统时钟设置为72MHz,这是F103的最高主频,能充分发挥性能。接着配置USART1为异步模式,波特率设为9600(工业常用速率),数据位8位,无校验,停止位1位。这些参数要和Modbus主站保持一致,否则通信会失败。
GPIO配置:USART1的TX(PA9)和RX(PA10)引脚会自动配置,不需要手动修改。但建议在Pinout视图里检查一下,确保没有和其他功能冲突。比如PA9和PA10默认是USART功能,但如果之前配置过其他外设,可能需要重新映射。
DMA配置是关键步骤:在DMA Settings标签页,点击Add添加两个DMA通道。发送通道(Memory to Peripheral)选择DMA1 Channel 4,方向为内存到外设,优先级中等,内存地址自增,外设地址不变。接收通道(Peripheral to Memory)选择DMA1 Channel 5,方向为外设到内存,其他设置相同。注意这里不要勾选Circular模式,因为最新版本的CubeMX在处理空闲中断时可能有兼容性问题,我们稍后在代码中手动重启DMA接收。
NVIC设置:使能USART1全局中断和DMA通道中断。优先级建议设置为USART中断高于DMA,因为空闲中断处理需要及时响应。最后生成代码时,选择MDK-ARM工具链,这样可以直接用Keil打开工程。
3. DMA数据收发机制详解
生成代码后,先别急着写Modbus逻辑,我们来测试一下DMA收发是否正常。CubeMX已经帮我们初始化了DMA和USART,但发送数据需要自己调用HAL库函数。HAL库提供了三种发送方式:阻塞式、中断式和DMA方式。对于Modbus这种实时性要求高的场景,强烈推荐DMA方式,因为它不占用CPU时间,适合高速数据流。
发送测试代码:在ma


546

被折叠的 条评论
为什么被折叠?



