STM32 通信协议详解
三种协议概览
| UART | I2C | SPI | |
|---|---|---|---|
| 线数 | 2 (TX/RX) | 2 (SCL/SDA) | 4 (SCK/MOSI/MISO/CS) |
| 通信方式 | 异步,全双工 | 同步,半双工 | 同步,全双工 |
| 速度 | 最高 ~10Mbps | 标准 100K/400K/1M | 最高 ~50Mbps |
| 拓扑 | 一对一 | 多设备总线(7位地址128节点) | 一主多从(CS 片选) |
| 硬件复杂度 | 低 | 中(需上拉电阻) | 高(多路 CS) |
| STM32 外设 | USART/UART | I2C1/I2C2 | SPI1/SPI2 |
一、UART
原理
1 | 起始位 + 数据位(5-9) + 校验位(可选) + 停止位(0.5/1/1.5/2) |
异步机制
1 | UART 没有时钟线。接收方如何知道什么时候采样? |
STM32 HAL 配置
1 | UART_HandleTypeDef huart1; |
三种收发方式
1 | /* 1. 阻塞(简单,浪费时间) */ |
常用场景
| 场景 | 配置 | 说明 |
|---|---|---|
| 串口调试 | 115200-8N1 | printf 重定向 |
| GPS 模块 | 9600-8N1 | 标准 NMEA 协议 |
| HC-05 蓝牙 | 9600-8N1 | AT 命令 + 透传 |
| RS485 | +485 芯片 + 方向控制 | 差分信号,抗干扰 |
| Modbus | 9600-8E1 | 工业协议,偶校验 |
二、I2C
原理
1 | SCL ┌─┬─┐ ┌─┬─┐ ┌─┬─┐ ┌─┬─┐ |
起始/停止条件
1 | SCL 高电平时 SDA 的变化定义起始和停止: |
STM32 HAL 配置
1 | I2C_HandleTypeDef hi2c1; |
读写操作
1 | /* 写寄存器:设备地址(7位<<1) + 寄存器地址 + 数据 */ |
常见设备地址
| 设备 | 7位地址 | 8位地址(<<1) | 说明 |
|---|---|---|---|
| MPU6050 | 0x68 | 0xD0 | AD0=GND |
| SSD1306 OLED | 0x3C | 0x78 | I2C 显示 |
| AT24C02 EEPROM | 0x50 | 0xA0 | 存储芯片 |
| DS3231 RTC | 0x68 | 0xD0 | 实时时钟 |
| BME280 | 0x76 | 0xEC | 温湿压传感器 |
常见问题
1 | 1. SCL/SDA 一直被拉低 |
三、SPI
原理
1 | SCK ─────┐ ┌───┐ ┌─── |
STM32 HAL 配置
1 | SPI_HandleTypeDef hspi1; |
读写操作
1 | /* 收发同时(全双工) */ |
四、三种协议怎么选
1 | ┌──────────────────────────────────────────────────┐ |
五、实战对比(读取一个传感器)
| 步骤 | UART(GPS 模块) | I2C(MPU6050) | SPI(BME280) |
|---|---|---|---|
| 初始化 | HAL_UART_Init() |
HAL_I2C_Init() |
HAL_SPI_Init() |
| 读取 | HAL_UART_Receive_IT() 逐字节解析 |
HAL_I2C_Mem_Read() 读寄存器 |
HAL_SPI_TransmitReceive() 全双工 |
| 解析 | 查 NMEA 协议,找 $GPRMC |
高/低字节拼 `(H<<8) | L` |
| 调试 | 逻辑分析仪 + 串口助手 | 逻辑分析仪看 SCL/SDA | 逻辑分析仪 4 线 |
六、CubeMX 配置速查
| 外设 | CubeMX 要点 |
|---|---|
| USART1 | Mode: Asynchronous, PA9=TX, PA10=RX |
| USART2 | PA2=TX, PA3=RX(常用蓝牙接这里) |
| I2C1 | PB6=SCL, PB7=SDA, Speed: Fast Mode |
| I2C2 | PB10=SCL, PB11=SDA |
| SPI1 | PA5=SCK, PA7=MOSI, PA6=MISO |
| SPI2 | PB13=SCK, PB15=MOSI, PB14=MISO |
七、调试技巧
1 | 1. 逻辑分析仪是最重要的调试工具 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 世海浮沉,于屿得见本真归处!








