STM32 与树莓派(Raspberry Pi)的通信常见方案及实现步骤:
1. UART 串口通信(最简单)
适用场景 :短距离、低速数据交换(如传感器数据、调试信息)。
硬件连接:
| STM32引脚 | 树莓派引脚 | 备注 | 
|---|---|---|
| TX | RX (GPIO15) | 交叉连接 | 
| RX | TX (GPIO14) | 交叉连接 | 
| GND | GND | 共地 | 
软件配置:
- 
STM32 端(使用HAL库): objectivecUART_HandleTypeDef huart1; huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; HAL_UART_Init(&huart1); // 发送数据 uint8_t data[] = "Hello Raspberry Pi!"; HAL_UART_Transmit(&huart1, data, sizeof(data), HAL_MAX_DELAY);
- 
树莓派端(Python): pythonimport serial ser = serial.Serial('/dev/ttyS0', 115200, timeout=1) # 使用硬件串口(GPIO14/15) while True: if ser.in_waiting > 0: received = ser.readline().decode('utf-8').strip() print(f"Received: {received}")
注意事项:
- 
禁用树莓派串口控制台(通过 raspi-config→Interface Options→Serial→ 关闭登录shell)。
- 
电平匹配:STM32是3.3V,树莓派GPIO也是3.3V,可直接连接;若为5V设备需电平转换。 
2. I2C 通信(多设备共享总线)
适用场景:中低速、多设备(如多个传感器)。
注意事项:
- 
确保STM32和树莓派的I2C地址不冲突。 
- 
使用 i2cdetect -y 1检测设备地址。
硬件连接:
| STM32引脚 | 树莓派引脚 | 备注 | 
|---|---|---|
| SCL | SCL (GPIO3) | 接4.7kΩ上拉电阻到3.3V | 
| SDA | SDA (GPIO2) | 接4.7kΩ上拉电阻到3.3V | 
| GND | GND | 共地 | 
软件配置:
- 
STM32 端(作为从设备): cpp#include "stm32f1xx_hal_i2c.h" I2C_HandleTypeDef hi2c1; hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; // 100kHz HAL_I2C_Init(&hi2c1); uint8_t buffer[10]; HAL_I2C_Slave_Receive(&hi2c1, buffer, sizeof(buffer), HAL_MAX_DELAY);
- 
树莓派端(Python,主设备): pythonimport smbus bus = smbus.SMBus(1) # 树莓派默认I2C总线 address = 0x08 # STM32的I2C从地址 bus.write_byte(address, 0x55) # 发送数据
3. SPI 通信(高速数据传输)
适用场景:高速、全双工(如摄像头、显示屏数据)。
注意事项:
- 
树莓派SPI需启用( raspi-config→Interface Options→SPI)。
- 
电平匹配:确保3.3V兼容。 
硬件连接:
| STM32引脚 | 树莓派引脚 | 备注 | 
|---|---|---|
| SCK | SCLK (GPIO11) | 时钟线 | 
| MOSI | MOSI (GPIO10) | 主发从收 | 
| MISO | MISO (GPIO9) | 主收从发 | 
| CS | CE0 (GPIO8) | 片选信号 | 
| GND | GND | 共地 | 
软件配置:
- 
STM32 端(SPI从模式): cppSPI_HandleTypeDef hspi1; hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_SLAVE; HAL_SPI_Init(&hspi1); uint8_t tx_data = 0xAA, rx_data; HAL_SPI_TransmitReceive(&hspi1, &tx_data, &rx_data, 1, HAL_MAX_DELAY);
- 
树莓派端(Python,主模式): pythonimport spidev spi = spidev.SpiDev() spi.open(0, 0) # 总线0,设备0(CE0) spi.max_speed_hz = 1000000 # 1MHz resp = spi.xfer2([0x55]) # 发送并接收数据
4. USB CDC(虚拟串口)
适用场景 :即插即用、免驱动(如调试日志传输)。
硬件连接:STM32的USB接口 ↔ 树莓派USB端口。
软件配置:
- 
STM32 端(使用CubeMX配置USB CDC): - 
在CubeMX中启用USB Device模式,选择CDC类。 
- 
生成代码后,通过 CDC_Transmit_FS()发送数据。
 
- 
- 
树莓派端 (自动识别为 /dev/ttyACM0):pythonimport serial ser = serial.Serial('/dev/ttyACM0', 115200) ser.write(b"Hello STM32!")
注意事项
- 
电平兼容:STM32和树莓派GPIO均为3.3V,直接连接时避免5V设备。 
- 
共地:所有通信方式必须共地(GND连接)。 
- 
协议一致性:双方波特率、地址、数据格式需匹配。 
| 通信方式 | 速率 | 距离 | 复杂度 | 适用场景 | 
|---|---|---|---|---|
| UART | 低(≤1Mbps) | 短 | 简单 | 调试、传感器数据 | 
| I2C | 中(≤400kHz) | 短 | 中等 | 多从设备控制 | 
| SPI | 高(≥10Mbps) | 短 | 高 | 高速数据传输(如屏幕) | 
| USB | 高 | 中 | 中等 | 即插即用通信 |