4. STM32串口通信基础与RS232/RS485硬件设计

在工业设备通信中,UART 是 STM32 最基础也最常用的外设。它本身只定义异步串行帧格式:1 位起始位、5~9 位数据位、可选校验位、1~2 位停止位,以及双方约定的波特率。真正把 UART 的 TTL 电平送到现场总线上的,是外部的电平转换与收发器电路。本节围绕“STM32 内部 UART 配置 → DMA 收发 → RS232 电平转换 → RS485 收发器与终端/偏置 → 隔离电源”这条硬件与软件协同链路展开。

一、UART 外设配置要点

以 STM32F407 的 USART2 为例,假设使用 APB1 时钟 42 MHz,目标波特率 115200。波特率寄存器 BRR 的计算为:USARTDIV = 42 000 000 / (16 × 115200) ≈ 22.786,整数部分 22,小数部分 0.786×16 ≈ 12.6,取 13,即 BRR ≈ 0x16D。实际波特率约为 115 108,误差约 0.08%,远小于 UART 允许的约 2%~3% 容差,通信可靠。

配置顺序建议为:先使能 GPIO 与 USART 时钟,将 TX 设为复用推挽、RX 设为浮空或上拉输入;再设置 CR1 的 M(字长)、PCE/PS(校验)、TE/RE;随后写 BRR;最后置 UE 使能。若使用中断或 DMA,还需配置 CR1 的 RXNEIE、CR3 的 DMAR/DMAT,并在 NVIC 中使能对应通道。工业现场建议开启校验位或使用 CRC 帧校验,因为长线缆上偶发位翻转难以完全避免。

二、DMA 收发:把 CPU 从字节搬运中解放

轮询或单字节中断在 115200 波特率下尚可承受,但一旦升到 921600 或需要同时处理多路串口,CPU 会被频繁打断。DMA 的价值在于让外设直接与内存交换数据。发送时把待发缓冲区地址写入 DMA_SxM0AR,长度写入 DMA_SxNDTR,使能 USART 的 DMAT 位,DMA 会在每次 TXE 置位时自动搬运一个字节。接收则更关键:由于串口帧长度不定,常用“DMA 循环接收 + 空闲中断(IDLE)”组合。DMA 以循环模式持续把 RX 数据写入环形缓冲区,当总线出现一个字符时间的空闲时触发 IDLE 中断,此时用“缓冲区总长 − DMA_SxNDTR”即可算出本帧实际接收长度。

// 空闲中断中计算本帧长度(示例)
void USART2_IRQHandler(void) {
    if (USART2->SR & USART_SR_IDLE) {
        (void)USART2->DR;                 // 清 IDLE 标志
        uint16_t recv = BUF_SIZE - DMA1_Stream5->NDTR;
        // recv 即本帧字节数,交给协议解析
        DMA1_Stream5->NDTR = BUF_SIZE;    // 重置计数
    }
}

需要注意:DMA 与 CPU 同时访问同一缓冲区时要保证一致性,接收侧建议使用双缓冲或“半传输+传输完成”中断,避免解析到正在被覆盖的数据。

三、RS232 电平转换

STM32 的 UART 引脚是 3.3 V TTL 电平,而 RS232 规定逻辑 1 为 −3~−15 V、逻辑 0 为 +3~+15 V,且与 TTL 反相。因此必须经电平转换芯片,如 MAX3232(3.3 V 供电、内置电荷泵)。典型接法:STM32 TX → 转换芯片 T1IN,T1OUT → DB9 的 Pin3(TXD);DB9 的 Pin2(RXD)→ R1IN,R1OUT → STM32 RX。RS232 适合点对点、短距离(约 15 m 以内)、低干扰场合,工业现场长距离组网通常改用 RS485。

四、RS485 收发器选型与终端、偏置电阻

RS485 采用差分传输,抗共模干扰强,支持多点总线。选型时关注:供电电压(3.3 V 或 5 V)、数据速率、共模范围(−7~+12 V)、是否集成隔离、ESD 等级、节点数(1/8 单位负载可挂 256 节点)。常见型号有 MAX3485(3.3 V、非隔离)、ADM2483(隔离型)、SP3485 等。收发器 DE/RE 通常并联控制:DE 高电平发送,RE 低电平接收,STM32 用一个 GPIO 切换方向,发送完成后要及时切回接收,否则会占住总线。

总线两端必须各接一个终端电阻 RT,阻值等于电缆特性阻抗,通常取 120 Ω,用于吸收信号反射。仅两端接,中间节点不接。当总线空闲且所有驱动器关闭时,差分线可能处于不确定态,需加偏置电阻:在 A 线上拉、B 线下拉,使空闲时 A−B > 200 mV,保证接收端输出确定的高电平。偏置电阻常取 560 Ω~1 kΩ,需与终端电阻一起核算总线负载,避免驱动能力不足。

STM32 串口通信与 RS232/RS485 硬件链路 STM32F407 USART2 BRR=0x16D 115200 8N1 DMA1 Stream5 IDLE 中断 TX RX RS232 转换 MAX3232 3.3V 电荷泵 TTL ↔ ±12V DB9 Pin2/3 点对点 ≤15m TX/RX/DE RS485 收发器 MAX3485 / ADM2483 DE/RE 方向控制 差分 A/B 输出 共模 −7~+12V 1/8 负载 256 节点 A B 120Ω 120Ω 上拉 680Ω 下拉 680Ω 节点1 节点2 隔离电源 B0505S / 金升阳 5V→5V 隔离 隔离耐压 1500V 为隔离收发器供电 切断地环路

五、隔离电源设计

工业现场各设备地电位可能相差数十伏,若 RS485 收发器与 STM32 共地,地电位差会形成地环路电流,轻则通信误码,重则烧毁收发器。解决办法是使用隔离型收发器(如 ADM2483)并为其现场侧单独供电。常用方案是 B0505S 等定压隔离 DC-DC 模块:输入 5 V,输出隔离 5 V,隔离耐压 1500 V DC 以上,功率 1 W 即可满足收发器需求。隔离电源的输入地与输出地必须分开布线,隔离侧的地只与总线侧电路相连,切勿在 PCB 上把两侧地直接短接,否则隔离失效。

调试建议:先用示波器观察 A、B 差分波形,空闲时应稳定在 200 mV 以上;发送时观察差分幅度是否达到 1.5 V 以上。若波形振铃严重,检查终端电阻是否只在两端、阻值是否为 120 Ω。
常见错误:DE 引脚忘记拉低导致总线被长期占用;终端电阻在中间节点重复并联使总线负载过重;隔离电源两侧地未分开导致隔离失效。这些都会表现为通信时通时断或完全无响应。

把以上环节串起来看:STM32 负责帧格式与数据搬运,DMA 与 IDLE 中断解决不定长接收,RS232 转换芯片完成电平与极性变换,RS485 收发器加终端、偏置电阻构成可靠差分总线,隔离电源切断地环路。只有软硬件两侧都到位,工业现场的串口通信才能长期稳定运行。