STM32 與樹莓派(Raspberry Pi)的通信常見方案及實現步驟:
1. UART 串口通信(最簡單)
適用場景:短距離、低速數據交換(如傳感器數據、調試信息)。
硬件連接:
STM32引腳 | 樹莓派引腳 | 備注 |
---|---|---|
TX | RX (GPIO15) | 交叉連接 |
RX | TX (GPIO14) | 交叉連接 |
GND | GND | 共地 |
軟件配置:
STM32 端(使用HAL庫):
UART_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):
import 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 端(作為從設備):
#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,主設備):
import 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從模式):
SPI_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,主模式):
import 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
):import 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 | 高 | 中 | 中等 | 即插即用通信 |