STM32 RS485总线通信开发指南:零基础入门,详解开发流程第60步

主题 内容 教学目的/扩展视频
RS485总线 电路原理,跳线设置,驱动程序。其他RS485通信。 了解电路原理和RS485协议。

师从洋桃电子,杜洋老师


📑文章目录

  • 一、RS485通信系统架构
  • 二、RS485核心原理与优势
  • 2.1 差分信号传输
  • 2.2 核心优势对比
  • 三、硬件电路设计
  • 3.1 典型电路原理图
  • 3.2 关键元件选型
  • 四、驱动代码深度解析
  • 4.1 初始化配置(rs485.c)
  • 4.2 数据发送函数
  • 五、通信测试与调试
  • 5.1 标准测试配置
  • 5.2 多节点组网测试
  • 六、工业级应用扩展
  • 6.1 Modbus RTU协议实现
  • 6.2 错误处理机制
  • 七、常见问题解决方案
  • 八、相关资源
  • 总结

  • (图1:开发板与RS485连接示意图)

    (图2:RS485通讯示意图)


    一、RS485通信系统架构

    +------------------+       +------------------+       +------------------+
    |   STM32控制器    |       | RS485驱动芯片    |       | RS485总线设备     |
    | (USART3 PB10/11) |<----->| (SP3485/MAX485)  |<----->| (A/B差分信号线)   |
    +------------------+       +------------------+       +------------------+
            ↑                                           ↗↙ 
            |                                           |
    +------------------+                            +------------------+
    |  触摸按键输入     |                            | 终端电阻(120Ω)   |
    | (收发控制触发)    |                            +------------------+
    +------------------+
    

    二、RS485核心原理与优势

    2.1 差分信号传输

  • 信号定义
  • A线:正向信号(V+)
  • B线:反向信号(V-)
  • 逻辑判定
  • V+ – V- > +200mV → 逻辑1
  • V+ – V- < -200mV → 逻辑0
  • 2.2 核心优势对比

    特性 RS232 RS485
    传输距离 <15m 可达1200m
    节点数量 点对点 最多32节点
    抗干扰能力 强(差分传输)
    工作模式 全双工 半双工

    三、硬件电路设计

    3.1 典型电路原理图

             STM32                            SP3485
              │                                  │
              ├──PB11(TX)───────► DI            │
              │                                  │
              ├──PB10(RX)◄─────── RO            │
              │                                  │
              ├──PA8(RE)───────► RE/DE          │
              │                                  │
              └──GND───────────► GND───────┐
                                           │
                                           ├─── A(差分+)
                                           │
                                           ├─── B(差分-)
                                           │
                                           └─── 120Ω终端电阻
    

    3.2 关键元件选型

    元件 型号 参数
    RS485驱动芯片 SP3485 3.3V供电,10Mbps
    终端电阻 120Ω 1% 1/4W金属膜电阻
    TVS二极管 SMAJ6.5CA 防浪涌保护

    四、驱动代码深度解析

    4.1 初始化配置(rs485.c)

    void RS485_Init(void) {
        GPIO_InitTypeDef GPIO_InitStructure;
        // RE引脚配置(PA8)
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // 推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOA, GPIO_Pin_8);  // 默认接收模式
    }
    

    关键点

  • RE/DE引脚复用控制收发状态
  • 上电默认处于接收模式
  • 4.2 数据发送函数

    void RS485_printf(char *fmt, ...) {
        char buffer[USART3_REC_LEN+1];
        va_list arg_ptr;
        
        GPIO_SetBits(GPIOA, GPIO_Pin_8); // 进入发送模式
        
        va_start(arg_ptr, fmt);
        vsnprintf(buffer, sizeof(buffer), fmt, arg_ptr);
        for(int i=0; buffer[i]; i++){
            USART_SendData(USART3, buffer[i]);
            while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
        }
        va_end(arg_ptr);
        
        GPIO_ResetBits(GPIOA, GPIO_Pin_8); // 切回接收模式
    }
    

    时序控制

    1. 拉高RE/DE使能发送器
    2. 通过USART3发送数据
    3. 发送完成立即切回接收模式
    4. 发送间隔需大于总线稳定时间(典型值≥3ms)

    五、通信测试与调试

    5.1 标准测试配置

             STM32 (主设备)                   RS485总线                   STM32 (从设备)
            ┌──────────────┐              ┌──────────────┐              ┌──────────────┐
            │   USART3     │              │              │              │   USART3     │
            │  SP3485      ├──A───────────┤    120Ω      ├──A───────────┤  SP3485      │
            │  RE=PA8      ├──B───────────┤    终端电阻  ├──B───────────┤  RE=PA8      │
            └──────────────┘              └──────────────┘              └──────────────┘
    

    有效测试步骤:

    1. 硬件连接
    2. 主从设备A线接A线,B线接B线
    3. 总线两端并联120Ω终端电阻
    4. 软件配置
    5. 波特率一致(如115200bps)
    6. 数据格式:8位数据位、无校验、1停止位
    7. 测试流程
    8. 主机发送数据:RS485_printf("Test")
    9. 从机接收数据:通过中断或查询方式读取USART3数据

    5.2 多节点组网测试

    设备角色 配置要点
    主机 控制RE引脚,主动发起通信
    从机1 设置独特地址(如0x01)
    从机2 设置地址0x02,启用终端电阻

    六、工业级应用扩展

    6.1 Modbus RTU协议实现

    // Modbus请求帧示例
    void Modbus_ReadHoldingRegisters(u8 addr, u16 reg, u16 num){
        u8 frame[6];
        frame[0] = addr;             // 从机地址
        frame[1] = 0x03;             // 功能码
        frame[2] = reg >> 8;         // 寄存器高地址
        frame[3] = reg & 0xFF;       // 寄存器低地址
        frame[4] = num >> 8;         // 数量高字节
        frame[5] = num & 0xFF;       // 数量低字节
        RS485_printf("%s", frame);   // 发送帧
    }
    

    6.2 错误处理机制

    // 超时检测函数
    uint8_t RS485_WaitAck(uint32_t timeout){
        uint32_t start = HAL_GetTick();
        while(HAL_GetTick() - start < timeout){
            if(USART3->SR & USART_FLAG_RXNE){
                return USART3->DR; // 返回接收数据
            }
        }
        return 0xFF; // 超时标志
    }
    

    七、常见问题解决方案

    问题现象 排查重点 解决方法
    数据收发失败 RE/DE引脚电平时序 示波器检查控制信号
    通信距离短 终端电阻匹配 总线两端并联120Ω电阻
    数据校验错误 波特率偏差 校准双方时钟源精度
    总线冲突 多主机竞争 采用CSMA/CD冲突检测机制

    八、相关资源

    [1] 洋桃电子B站课程-STM32入门100步
    [2] STM32F103xx官方数据手册
    [3] STM32F103X8-B数据手册(中文)
    [4] STM32F103固件函数库用户手册(中文)
    [5] SP3485数据手册(英文)
    [6] RS485通信测试程序


    总结

    本文详细讲解了STM32的RS485通信开发,重点包括:

    1. 硬件设计:SP3485电路与终端电阻配置
    2. 驱动实现:RE/DE引脚的精确时序控制
    3. 协议扩展:Modbus RTU工业协议集成

    关键开发建议:

  • 长距离通信时启用总线隔离
  • 关键数据添加CRC校验
  • 使用屏蔽双绞线并良好接地
  • 通过本方案,开发者可构建工业自动化、智能楼宇等场景的可靠通信系统。完整工程代码已通过STM32F103验证,可直接应用于实际项目。


    💬 技术讨论(请在评论区留言~)


    📌 下期预告:下一期将探讨CAN总线重点课程,欢迎持续关注!

    点击查阅🔍往期【STM32专栏】文章

    版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
    实测开发版:洋桃1号开发版(基于STM32F103C8T6)
    更新日志

  • v1.0 初始版本(2025-03-09)
  • 作者:触角01010001

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 RS485总线通信开发指南:零基础入门,详解开发流程第60步

    发表回复