STM32与树莓派通信

STM32 与树莓派(Raspberry Pi)的通信常见方案及实现步骤:


1. UART 串口通信(最简单)

适用场景 :短距离、低速数据交换(如传感器数据、调试信息)。
硬件连接:

STM32引脚 树莓派引脚 备注
TX RX (GPIO15) 交叉连接
RX TX (GPIO14) 交叉连接
GND GND 共地

软件配置:

  • STM32 端(使用HAL库):

    objectivec 复制代码
    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):

    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 端(作为从设备):

    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,主设备):

    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从模式):

    cpp 复制代码
    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,主模式):

    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):

    1. 在CubeMX中启用USB Device模式,选择CDC类。

    2. 生成代码后,通过 CDC_Transmit_FS() 发送数据。

  • 树莓派端 (自动识别为 /dev/ttyACM0):

    python 复制代码
    import serial
    ser = serial.Serial('/dev/ttyACM0', 115200)
    ser.write(b"Hello STM32!")

注意事项

  1. 电平兼容:STM32和树莓派GPIO均为3.3V,直接连接时避免5V设备。

  2. 共地:所有通信方式必须共地(GND连接)。

  3. 协议一致性:双方波特率、地址、数据格式需匹配。

通信方式 速率 距离 复杂度 适用场景
UART 低(≤1Mbps) 短 简单 调试、传感器数据
I2C 中(≤400kHz) 短 中等 多从设备控制
SPI 高(≥10Mbps) 短 高 高速数据传输(如屏幕)
USB 高 中 中等 即插即用通信
相关推荐
吠品6 小时前
智谱开源 ZCode 之后,真正的考试才开始
单片机·嵌入式硬件·1024程序员节
Chery11407 小时前
高速ADC与精密DAC怎么选?DP9230D与DP8532D应用解析
嵌入式硬件·物联网·射频工程
小李不想当小白10 小时前
SPI通信外设与W25Q64 (硬件SPI)(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
LCG米11 小时前
STM32驱动W5500以太网模块实测:TCP吞吐瓶颈定位、TX指针回绕陷阱与断线重连保活落地
stm32·单片机·嵌入式硬件·tcp/ip
尼喃12 小时前
662K/65Z5三脚稳压芯片规格书—PW6566B33/B30引脚功能
嵌入式硬件
创界工坊工作室12 小时前
63-基于STC89C52霍尔传感器的智能化电能表设计
stm32·单片机·嵌入式硬件·51单片机·proteus
智购科技自动售货机厂家13 小时前
让AI经营自动售货机:从Project Vend看工具权限与业务规则~YH
大数据·服务器·单片机·嵌入式硬件·深度学习
意法半导体STM3215 小时前
【官方原创】LAT6048 如何扩大MP2的A35核和M33核共享内存
stm32·单片机·嵌入式硬件·内存映射·stm32mp2
en.en..15 小时前
STM32(F429)启动模式与两种烧录方式
stm32·单片机·嵌入式硬件
单片机仿真设计16 小时前
基于 51 单片机的数字温度计(DS18B20+LCD1602+Proteus 仿真,支持阈值可调声光报警)
单片机·嵌入式硬件·proteus·课设