STM32单片机常用通信协议详解
STM32单片机常用通信协议详解
STM32单片机在嵌入式系统领域应用广泛,其丰富的通信接口支持多种通信协议。本文将详细介绍8种常用的通信协议,包括UART/USART、SPI、I2C、CAN、USB、Ethernet与Modbus、MQTT以及RS-485。每种协议都有其独特的应用场景和特点,通过本文的介绍,读者可以更好地理解这些协议的工作原理和实际应用。
1. UART/USART协议
UART(通用异步收发传输器)是一种异步串行通信协议,通过TXD(发送)和RXD(接收)两线实现全双工通信,支持自定义波特率(如9600bps、115200bps)。
实例
与GPS模块通信:STM32通过UART接收NMEA-0183格式数据。
// STM32Cube HAL库配置示例 HAL_UART_Receive_IT(&huart2, rx_buffer, 128); // 中断接收数据
调试信息输出:通过UART连接PC串口助手,实时打印传感器数据。
特点
- 成本低、易实现
- 无硬件流控制
- 适用于短距离、低速场景
2. SPI协议
SPI(串行外设接口)是一种全双工同步通信协议,通过SCK(时钟)、MOSI(主机发)、MISO(主机收)、CS(片选)四线实现高速数据传输(可达数十MHz)。
实例
驱动OLED屏幕:STM32作为主机,发送显示数据至SSD1306 OLED模块。
// SPI发送函数(HAL库) HAL_SPI_Transmit(&hspi1, oled_data, sizeof(oled_data), 100);
外接Flash存储:如W25Q128芯片,通过SPI实现固件存储或数据备份。
特点
- 速率快、接口简单
- 需占用较多引脚资源
3. I2C协议
I2C(集成电路互连总线)是一种半双工同步通信协议,通过SCL(时钟)和SDA(数据)两线支持多主从设备,地址寻址机制实现设备区分。
实例
连接温度传感器:如BMP280,STM32通过I2C读取温湿度数据。
// I2C读取寄存器(HAL库) HAL_I2C_Mem_Read(&hi2c1, BMP280_ADDR, REG_TEMP, I2C_MEMADD_SIZE_8BIT, data, 2, 100);
管理EEPROM:如AT24C02,存储系统配置参数。
特点
- 节省引脚
- 支持多设备
- 速率较低(通常≤400kHz)
4. CAN协议
CAN(控制器局域网络)是一种差分信号抗干扰的通信协议,支持多主通信,适用于复杂工业环境。
实例
汽车电子控制:STM32作为CAN节点,与ECU(发动机控制单元)通信,传输油门或刹车信号。
// CAN报文发送(HAL库) CAN_TxHeaderTypeDef tx_header; tx_header.StdId = 0x123; // 标准ID HAL_CAN_AddTxMessage(&hcan, &tx_header, tx_data, &mailbox);
工业机器人控制:多个CAN节点同步执行动作指令。
特点
- 高可靠性
- 支持错误检测
- 协议栈复杂度较高
5. USB协议
USB(通用串行总线)是一种高速双向通信协议,支持设备模式(如U盘、HID设备)或主机模式(连接外设)。
实例
自定义HID设备:STM32模拟USB键盘,发送按键指令至PC。
// USB描述符配置(CubeMX生成) __ALIGN_BEGIN static uint8_t HID_REPORT_DESC[] __ALIGN_END = { ... };
数据传输:通过USB CDC类实现虚拟串口,替代传统UART。
特点
- 即插即用
- 速率高(USB2.0可达12Mbps)
- 需复杂协议栈支持
6. Ethernet与Modbus
基于LwIP协议栈实现TCP/IP通信,结合Modbus/TCP或Modbus/RS485协议用于工业网络。
实例
远程数据监控:STM32通过以太网上传传感器数据至云平台。
// Modbus/TCP报文处理 modbus_tcp_poll(&ctx); // LwIP回调处理请求
RS485多设备通信:使用MAX485芯片,实现STM32与多个PLC的Modbus/RTU通信。
特点
- 支持远程控制
- 需外接PHY芯片或转换模块
七、MQTT协议
MQTT(消息队列遥测传输)是一种基于发布/订阅模型的轻量级物联网协议,运行于TCP/IP协议栈之上,支持低带宽、高延迟网络环境下的设备与云端双向通信。采用心跳机制保持长连接,消息体最小仅需2字节,支持QoS(服务质量等级)保证数据传输可靠性。
实例
环境监测系统:STM32通过ESP8266 WiFi模块连接阿里云IoT平台,定时发布温湿度数据至主题/sensor/data。
// 基于Paho MQTT嵌入式库的核心代码片段 MQTTClient_publish(&client, "/sensor/data", "{"temp":25.6}", 12, QoS1, 0);
远程设备控制:订阅/device/ctrl主题,接收云端下发的继电器控制指令。
特点
- 支持百万级设备连接
- 适合电池供电场景(心跳间隔可配置)
- 协议头开销仅2字节,带宽利用率高达95%
- 需外接网络模块(如ESP32/4G模组)
八、RS-485协议
RS-485是一种基于差分信号传输的物理层标准,采用双绞线传输,逻辑"1"对应A-B线间-2V-6V电压,逻辑"0"对应+2V+6V。支持总线型拓扑,通过使能端控制收发方向实现半双工通信。
实例
工业PLC组网:STM32作为Modbus从站,通过MAX485芯片接入RS-485总线,响应主站查询指令:
// 使用USART2实现Modbus RTU协议 HAL_UART_Receive_IT(&huart2, modbus_frame, 8); // 接收功能码01查询请求
楼宇自动化:连接1000米外的电表集群,每30秒轮询用电量数据。
特点
- 抗共模干扰能力达±15kV(通过双绞线抵消电磁干扰)
- 单总线最大支持32节点(需终端匹配120Ω电阻)
- 传输速率与距离成反比(10Mbps@12米,100kbps@1200米)