STM32单片机常用通信协议详解
STM32单片机常用通信协议详解
STM32单片机作为目前最流行的嵌入式开发平台之一,支持多种通信协议以满足不同应用场景的需求。本文将详细介绍8种常用的通信协议,包括UART/USART、SPI、I2C、CAN、USB、Ethernet与Modbus、MQTT以及RS-485,帮助开发者更好地理解和应用这些协议。
一、UART/USART协议
示例1-PC上通过UART来调试MCU
示例2-RS-232通过电平转换芯片与MCU通讯
示例3-MCU串口通讯
原理:异步串行通信,通过TXD(发送)和RXD(接收)两线实现全双工通信,支持自定义波特率(如9600bps、115200bps)。
实例:
- 与GPS模块通信:STM32通过UART接收NMEA-0183格式数据。
// STM32Cube HAL库配置示例
HAL_UART_Receive_IT(&huart2, rx_buffer, 128); // 中断接收数据
- 调试信息输出:通过UART连接PC串口助手,实时打印传感器数据。
特点:成本低、易实现,但无硬件流控制,适用于短距离、低速场景。
二、SPI协议
原理:全双工同步通信,通过SCK(时钟)、MOSI(主机发)、MISO(主机收)、CS(片选)四线实现高速数据传输(可达数十MHz)。
示例1-SPI 数据传输
示例2-SPI 数据传输
示例3-SPI时序信号
示例4-MCU SPI信号模拟图
实例:
- 驱动OLED屏幕:STM32作为主机,发送显示数据至SSD1306OLED模块。
// SPI发送函数(HAL库)
HAL_SPI_Transmit(&hspi1, oled_data, sizeof(oled_data), 100);
- 外接Flash存储:如W25Q128芯片,通过SPI实现固件存储或数据备份。
特点:速率快、接口简单,但需占用较多引脚资源。
三、I2C协议
原理:半双工同步通信,通过SCL(时钟)和SDA(数据)两线支持多主从设备,地址寻址机制实现设备区分。
示例1- I2C总线以及寻址方式
示例2- I2C总线以及寻址方式
实例:
- 连接温度传感器:如BMP280,STM32通过I2C读取温湿度数据。
// I2C读取寄存器(HAL库)
HAL_I2C_Mem_Read(&hi2c1, BMP280_ADDR, REG_TEMP, I2C_MEMADD_SIZE_8BIT, data, 2, 100);
- 管理EEPROM:如AT24C02,存储系统配置参数。
特点:节省引脚,支持多设备,但速率较低(通常≤400kHz)。
四、CAN协议
原理:差分信号抗干扰,支持多主通信,适用于复杂工业环境。
示例1-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节点同步执行动作指令。
特点:高可靠性,支持错误检测,但协议栈复杂度较高。
五、USB协议
原理:高速双向通信,支持设备模式(如U盘、HID设备)或主机模式(连接外设)。
示例1-USB2.0接线实例
实例:
- 自定义HID设备:STM32模拟USB键盘,发送按键指令至PC。
// USB描述符配置(CubeMX生成)
__ALIGN_BEGIN static uint8_t HID_REPORT_DESC[] __ALIGN_END = { ... };
- 数据传输:通过USB CDC类实现虚拟串口,替代传统UART。
特点:即插即用,速率高(USB2.0可达12Mbps),需复杂协议栈支持。
六、Ethernet与Modbus
原理:基于LwIP协议栈实现TCP/IP通信,结合Modbus/TCP或Modbus/RS485协议用于工业网络。
示例1-Ethernet典型应用
示例2-tcp三次握手与四次挥手
实例:
- 远程数据监控:STM32通过以太网上传传感器数据至云平台。
// Modbus/TCP报文处理
modbus_tcp_poll(&ctx); // LwIP回调处理请求
- RS485多设备通信:使用MAX485芯片,实现STM32与多个PLC的Modbus/RTU通信。
特点:支持远程控制,需外接PHY芯片或转换模块。
七、MQTT协议
原理:基于发布/订阅模型的轻量级物联网协议,运行于TCP/IP协议栈之上,支持低带宽、高延迟网络环境下的设备与云端双向通信。采用心跳机制保持长连接,消息体最小仅需2字节,支持QoS(服务质量等级)保证数据传输可靠性。
示例1-mqtt典型应用
实例:
- 环境监测系统: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协议
原理:基于差分信号传输的物理层标准,采用双绞线传输,逻辑"1"对应A-B线间-2V-6V电压,逻辑"0"对应+2V+6V。支持总线型拓扑,通过使能端控制收发方向实现半双工通信。
示例1-485芯片连线图
示例2-485电路图
实例:
- 工业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米)