公司动态

STM32-RS485

📅 2026/8/5 10:09:02
STM32-RS485
一、先理清几个容易混淆的概念学习 RS485 前最容易混在一起的几个词是串口、UART、TTL/CMOS、RS232、RS422、RS485。串口是一个比较泛的说法。UART、RS232、RS422、RS485 都遵循类似的串行通信时序因此平时经常被统称为“串口通信”。UART 是 STM32 内部的串口外设它负责产生串行通信时序例如起始位有效数据位校验位停止位TTL/CMOS、RS232、RS422、RS485 则更偏向“接口电气标准”也就是逻辑 1 和逻辑 0 在物理线路上怎么表示。可以这样理解名称重点简单理解UART通信时序STM32 内部外设产生 TX/RX 串口帧TTL/CMOS单端逻辑电平MCU 引脚直接输出的逻辑电平RS232单端接口标准常用于传统串口设备电平范围和 MCU 不同RS422差分接口标准抗干扰能力强常见一发多收结构RS485差分接口标准支持多节点总线常用于工业控制所以STM32 想使用 RS485 通信时并不是直接把 UART_TX、UART_RX 接到总线上而是需要经过 RS485 收发器完成电平和信号形式转换。二、RS485 是什么RS485 是一种串行通信接口标准使用差分信号进行传输。它常用于工业控制、仪表采集、楼宇控制、远距离设备互联等场景。RS485 的主要特点差分信号传输抗干扰能力强接口电平较低不容易损坏芯片传输速率较高传输距离远支持多个节点挂接在同一条总线上常和 Modbus 等上层协议配合使用RS485 的强项不是“协议复杂”而是“物理层可靠”。在噪声较多、线缆较长、设备较分散的环境里RS485 比普通 TTL 串口更适合。三、差分信号为什么抗干扰普通 TTL 串口是单端信号接收端判断某一根线相对地的电平高低。线缆较长或现场干扰较强时地电位差、共模噪声都可能影响判断。RS485 使用 A、B 两根线传输一对相反的差分信号。接收端关心的不是某一根线对地电压而是 A、B 两线之间的电压差。逻辑关系可以概括为逻辑状态差分电压含义逻辑 1差分电压为正约(2~6)V逻辑 0差分电压为负约-(2~6)V实际学习时不必死记某个芯片在所有条件下的精确电压值先抓住核心接收器看的是两根线的差值因此同向叠加到两根线上的干扰会被很大程度抵消。四、RS485 总线结构RS485 通常通过收发器芯片把 STM32 的 UART 信号转换为 A/B 差分总线信号。常见结构如下图中可以看到STM32 侧仍然使用 UART 的 TX、RX中间的 TP8485/SP3485 等芯片负责电平转换和总线驱动总线侧使用 A、B 两根差分线多个节点可以挂在同一条 A/B 总线上总线两端通常需要终端匹配电阻RS485 总线连接时要特别关注匹配电阻。匹配电阻的作用是提高总线稳定性、抑制反射和噪声。线缆较长、通信速率较高、节点较多时这一点尤其重要。实际布线还要注意A/B 极性要统一不能一端接反总线拓扑尽量使用一条主干线减少过长分支线缆建议使用双绞线远距离通信要考虑共地、隔离和浪涌保护多节点通信时上层协议要解决地址和总线仲裁问题五、RS485 与 Modbus 的关系RS485 只规定物理接口和电气传输方式它本身不规定“谁发给谁”“数据是什么意思”“从机地址是多少”。Modbus 是常见的上层通信协议可以运行在 RS485 总线上。很多工业设备说“支持 RS485”实际使用时往往还会说“支持 Modbus RTU”。二者关系可以这样分层次作用RS485解决电气传输差分信号、长距离、多节点UART提供串行时序起始位、数据位、校验位、停止位Modbus RTU定义数据帧地址、功能码、寄存器、CRC 校验也就是说RS485 让数据能可靠地在总线上传输Modbus RTU 决定这些数据应该如何组织和解释。六、TP8485 收发器引脚说明STM32 使用 RS485 时常见做法是外接 485 电平转换芯片例如 TP8485、SP3485 等。TP8485 常见引脚含义如下引脚含义说明ROReceiver Output接收器输出端通常接 STM32 的 UART_RXREReceiver Enable接收器输出使能低电平有效DEDriver Enable驱动器输出使能高电平有效DIDriver Input驱动器输入端通常接 STM32 的 UART_TXABus A接收器输入端 / 驱动器输出端BBus B接收器输入端 / 驱动器输出端其中最关键的是RE和DE。RS485 常见半双工通信中发送和接收共用 A/B 两根线。为了避免多个节点同时驱动总线需要通过DE、RE控制当前节点处于发送状态还是接收状态。常见控制方式工作模式DERE状态说明接收模式00驱动器关闭接收器打开监听总线发送模式1通常关闭接收驱动器打开向 A/B 总线发送数据很多开发板会把RE和DE接到同一个 GPIO 上GPIO 输出低电平进入接收模式GPIO 输出高电平进入发送模式这样控制简单但要注意发送完成后及时切回接收模式否则可能错过其他节点返回的数据。七、STM32 HAL 库中常用接口RS485 的底层收发依然依赖 UART所以 HAL 层主要使用 UART 相关接口。HAL 接口或宏作用__HAL_RCC_USARTx_CLK_ENABLE使能串口外设时钟HAL_UART_Init初始化串口工作参数__HAL_UART_ENABLE_IT使能串口相关中断HAL_UART_Transmit串口发送数据HAL_UART_Receive串口接收数据__HAL_UART_GET_FLAG查询当前串口状态这里要注意一个点HAL UART 接口只负责“串口收发”不会自动替你处理 RS485 的收发方向。因此在半双工 RS485 中发送流程通常要包含拉高方向控制引脚进入发送模式调用 UART 发送接口等待数据真正发送完成拉低方向控制引脚回到接收模式如果只等发送函数返回但移位寄存器里最后一位还没完全发出去就立刻切回接收模式可能导致最后的数据位被截断。工程中通常要关注发送完成标志例如 TC 标志。八、RS485 配置步骤STM32 上配置 RS485可以按下面的顺序理解1. 配置串口工作参数先确定 UART 的基本通信参数波特率数据位停止位校验方式收发模式通信双方必须保持一致否则会出现乱码、接收失败或校验错误。2. 完成串口底层初始化底层初始化一般包括配置 UART TX/RX 对应 GPIO使能 GPIO 时钟使能 USART 外设时钟配置中断控制器 NVIC配置 RS485 方向控制 GPIORS485 方向控制引脚建议在初始化后默认置为接收模式因为总线大部分时间应该处于监听状态。3. 开启串口异步接收中断RS485 总线通信通常不知道对方什么时候发数据因此接收端常用中断方式。开启接收中断后收到数据时可以及时进入中断处理流程避免主循环轮询不及时造成数据丢失。4. 设置中断优先级并使能中断需要配置 USART 对应的中断优先级并使能对应 IRQ。优先级要根据项目中其他外设的重要程度合理安排。如果系统中还有定时器、DMA、RTOS 或其他实时任务就要避免 UART 接收中断被长时间阻塞。5. 编写串口中断服务逻辑中断服务函数中一般会调用 HAL 接收相关处理完成数据读取、缓冲和状态更新。这里不展开源码只强调思路中断里不要做太重的业务逻辑建议把数据放入缓冲区再由主循环或任务层解析。6. 发送数据前后控制方向半双工 RS485 最容易出问题的地方就是方向切换。推荐思路平时保持接收模式发送前切到发送模式发送完成后等待最后一位真正发完再切回接收模式这样可以减少总线冲突也能及时接收对端回复。