树莓派4B与STM32串口通信全流程:从接线到Minicom调试(附引脚对照表)
·
树莓派4B与STM32串口通信实战指南:从硬件对接到Minicom高效调试
在嵌入式开发领域,树莓派与STM32的协同工作已成为智能硬件项目的经典组合。本文将彻底解析两者间的串口通信全流程,不仅涵盖引脚连接、电平匹配等硬件细节,更深入探讨Minicom调试中的波特率陷阱排查技巧,以及如何利用树莓派4B新增的四个硬件串口实现多设备并行通信。
1. 硬件连接与电平匹配
1.1 引脚对接方案
树莓派4B的40针GPIO接口中,GPIO14(TXD)和GPIO15(RXD)是默认的串口通信引脚。与STM32连接时需注意:
-
物理连接:
- 树莓派TXD(GPIO14) → STM32RXD
- 树莓派RXD(GPIO15) → STM32TXD
- 共地连接(GND ↔ GND)
-
推荐线材:
- 镀金杜邦线(降低接触电阻)
- 带磁环的屏蔽线(抗干扰)
典型接线错误案例:
错误接法 正确接法
树莓派TXD-TXD 树莓派TXD-RXD
树莓派RXD-RXD 树莓派RXD-TXD
1.2 电平转换关键参数
树莓派4B与STM32存在电平差异:
| 参数 | 树莓派4B | STM32F103 | 兼容方案 |
|---|---|---|---|
| 逻辑高电平 | 3.3V | 3.3V/5V | 直接连接 |
| 逻辑低电平 | 0V | 0V | - |
| 最大输入电压 | 3.3V | 5V | 需电平转换芯片 |
| 波特率范围 | 50-4Mbps | 50-2Mbps | 建议≤115200bps |
提示:当STM32工作电压为5V时,必须使用TXS0108E等双向电平转换器,否则可能损坏树莓派GPIO
2. 树莓派串口系统配置
2.1 硬件串口资源分配
树莓派4B的串口架构较前代有重大改进:
# 查看所有串口设备
ls /dev/tty*
# 典型输出:
/dev/ttyAMA0 # 主硬件串口(默认蓝牙占用)
/dev/ttyAMA1 # 新增硬件串口2
/dev/ttyS0 # mini串口(性能差)
2.2 三步激活硬件串口
通过以下配置释放高性能串口:
-
修改系统配置:
sudo raspi-config选择:
Interface Options→Serial Port- 关闭登录功能,启用硬件串口
-
编辑config.txt:
sudo nano /boot/config.txt添加:
enable_uart=1 dtoverlay=uart2 dtoverlay=uart3 dtoverlay=uart4 dtoverlay=uart5 -
验证映射关系:
ls -l /dev/serial* # 正常应显示: /dev/serial1 -> ttyAMA0 /dev/serial2 -> ttyAMA1
3. Minicom调试实战技巧
3.1 参数配置陷阱排查
安装与基础配置:
sudo apt install minicom
sudo minicom -s
关键参数对照表:
| 参数 | 必须匹配项 | 常见错误值 | 正确设置 |
|---|---|---|---|
| 波特率 | 双方一致 | 9600 | 115200 |
| 数据位 | 8位 | 7位 | 8位 |
| 停止位 | 1位 | 2位 | 1位 |
| 流控 | 无 | RTS/CTS | 无 |
| 本地回显 | 关闭 | 开启 | 关闭 |
3.2 双向通信测试方法
发送测试:
- 在Minicom界面直接输入字符
- STM32端应通过串口中断接收数据:
HAL_UART_Receive_IT(&huart1, rx_data, 1);
接收测试:
- STM32发送固定格式数据包:
uint8_t tx_data[] = "TEST\n"; HAL_UART_Transmit(&huart1, tx_data, sizeof(tx_data), 100); - 树莓派端应实时显示接收数据
调试快捷键备忘:
Ctrl+A Z→ 显示帮助菜单Ctrl+A O→ 进入配置界面Ctrl+A C→ 清除屏幕缓冲区
4. 高级应用:多串口并行通信
4.1 多设备连接方案
利用树莓派4B新增串口实现扩展:
| 串口设备 | GPIO引脚 | 典型应用场景 |
|---|---|---|
| /dev/ttyAMA1 | GPIO0/1 | 工业传感器 |
| /dev/ttyAMA2 | GPIO4/5 | GPS模块 |
| /dev/ttyAMA3 | GPIO8/9 | 无线数传模块 |
| /dev/ttyAMA4 | GPIO12/13 | 备用调试接口 |
4.2 Python多线程串口监控
import serial
import threading
def uart_listener(port):
ser = serial.Serial(port, 115200, timeout=1)
while True:
data = ser.readline()
print(f"[{port}] {data.decode().strip()}")
ports = ['/dev/ttyAMA0', '/dev/ttyAMA1']
for port in ports:
t = threading.Thread(target=uart_listener, args=(port,))
t.daemon = True
t.start()
注意:多串口操作时需确保每个端口有独立接地,避免共地干扰
5. 常见故障排除手册
5.1 通信失败排查流程
-
物理层检查:
- 万用表测量TXD/RXD电压(树莓派:3.3V,STM32:3.3V/5V)
- 交换TX/RX线序测试
-
软件层检查:
# 查看串口占用 lsof /dev/ttyAMA* # 测试端口基本功能 echo "test" > /dev/ttyAMA0 -
内核日志分析:
dmesg | grep tty # 典型错误: "serial8250: too much work for irq4"
5.2 性能优化参数
编辑/boot/cmdline.txt移除console相关参数:
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
调整CPU频率固定策略:
sudo nano /etc/default/cpufrequtils
# 添加:
GOVERNOR="performance"
更多推荐


所有评论(0)