STM32 RS485总线通信开发指南:零基础入门,详解开发流程第60步
主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
RS485总线 | 电路原理,跳线设置,驱动程序。其他RS485通信。 | 了解电路原理和RS485协议。 |
师从洋桃电子,杜洋老师
📑文章目录
(图1:开发板与RS485连接示意图)
(图2:RS485通讯示意图)
一、RS485通信系统架构
+------------------+ +------------------+ +------------------+
| STM32控制器 | | RS485驱动芯片 | | RS485总线设备 |
| (USART3 PB10/11) |<----->| (SP3485/MAX485) |<----->| (A/B差分信号线) |
+------------------+ +------------------+ +------------------+
↑ ↗↙
| |
+------------------+ +------------------+
| 触摸按键输入 | | 终端电阻(120Ω) |
| (收发控制触发) | +------------------+
+------------------+
二、RS485核心原理与优势
2.1 差分信号传输
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); // 默认接收模式
}
关键点:
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); // 切回接收模式
}
时序控制:
- 拉高RE/DE使能发送器
- 通过USART3发送数据
- 发送完成立即切回接收模式
- 发送间隔需大于总线稳定时间(典型值≥3ms)
五、通信测试与调试
5.1 标准测试配置
STM32 (主设备) RS485总线 STM32 (从设备)
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ USART3 │ │ │ │ USART3 │
│ SP3485 ├──A───────────┤ 120Ω ├──A───────────┤ SP3485 │
│ RE=PA8 ├──B───────────┤ 终端电阻 ├──B───────────┤ RE=PA8 │
└──────────────┘ └──────────────┘ └──────────────┘
有效测试步骤:
- 硬件连接:
- 主从设备A线接A线,B线接B线
- 总线两端并联120Ω终端电阻
- 软件配置:
- 波特率一致(如115200bps)
- 数据格式:8位数据位、无校验、1停止位
- 测试流程:
- 主机发送数据:
RS485_printf("Test")
- 从机接收数据:通过中断或查询方式读取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通信开发,重点包括:
- 硬件设计:SP3485电路与终端电阻配置
- 驱动实现:RE/DE引脚的精确时序控制
- 协议扩展:Modbus RTU工业协议集成
关键开发建议:
通过本方案,开发者可构建工业自动化、智能楼宇等场景的可靠通信系统。完整工程代码已通过STM32F103验证,可直接应用于实际项目。
💬 技术讨论(请在评论区留言~)
📌 下期预告:下一期将探讨CAN总线
重点课程
,欢迎持续关注!点击查阅🔍往期【STM32专栏】文章
版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志:v1.0 初始版本(2025-03-09)
作者:触角01010001