news 2026/3/29 5:59:27

图解说明树莓派4b的GPIO引脚用途

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
图解说明树莓派4b的GPIO引脚用途

图解树莓派4B的GPIO引脚:从零开始掌握硬件控制核心

你有没有过这样的经历?手握一块树莓派4B,插上电源,连上显示器,写好了Python代码,结果一运行——外设没反应、传感器读不到数据、LED灯不闪……最后发现,问题竟然出在引脚接错了

别担心,这几乎是每个嵌入式新手都会踩的坑。而这一切,往往源于对GPIO 引脚布局和功能定义不够清晰

今天我们就来彻底讲明白:树莓派4B那40个密密麻麻的GPIO引脚,到底哪个能干啥?怎么用才安全又高效?


为什么是40针?它不只是“接口”,而是你的硬件遥控器

树莓派4B背面那一排40个金属针脚,学名叫GPIO Header(通用输入输出接口),但它远不止“输入/输出”那么简单。你可以把它想象成一个多功能遥控器:

  • 某些按键可以当普通开关用(数字IO)
  • 某些组合能发摩斯电码(串口通信)
  • 还有些支持组队协作传输高速数据(SPI/I²C)

这些针脚让你能把软件逻辑“伸出手去”,真正触达现实世界——点亮一盏灯、读取温湿度、驱动电机、甚至构建小型机器人。

但前提是:你知道每根针是干什么的。


先搞清两套编号系统:别让程序和实物对不上号

打开任何一张树莓派引脚图,你会发现两个数字体系混在一起:

物理位置BCM 编号
Pin 7GPIO4
Pin 11GPIO17

这就是困扰无数初学者的第一道坎。

📌 物理引脚编号(Pin Number)

这是从左到右、从上到下按顺序数出来的,比如第1针、第2针……一直到第40针。它只代表物理位置,就像教室里的座位号。

📌 BCM GPIO 编号(Broadcom SOC 编号)

这是芯片内部的真实“身份证号”。你在代码里调用GPIO17,指的就是 BCM2711 芯片上的第17号通用引脚。

强烈建议:编程一律使用 BCM 编号!

因为不同型号树莓派的物理布局可能略有差异,但 BCM 编号保持一致,代码更可移植。

🔧 小技巧:可以用命令查看当前启用的 GPIO 状态:

gpio readall

(需安装wiringpi工具包)


电源与地线:所有项目的起点,也是最容易忽视的风险点

在动任何信号线之前,请先认识这几类关键引脚:

引脚号(Pin)类型功能说明
1, 173.3V来自板载稳压器,最大输出约50mA
2, 45V直接来自USB电源输入,电流能力较强(取决于供电适配器)
6, 9, 14, 20, 25, 30, 34, 39GND接地回路,共8个,分布均匀

⚠️ 常见误区警示:

  • ❌ 不要用 3.3V 引脚给继电器或电机供电 → 极易烧毁PMU电源管理单元
  • ❌ 不要将外部电源的地线随意接地 → 可能造成地弹干扰或短路
  • ✅ 正确做法:高功耗设备独立供电,仅通过 GPIO 控制其使能端

💡最佳实践建议:
- 使用靠近目标模块的 GND 引脚,减少回流路径长度
- 多设备共用 I²C/SPI 总线时,确保所有设备共地
- 对敏感模拟电路添加去耦电容(如0.1μF陶瓷电容跨接在电源与地之间)


通用 GPIO:最灵活的“万能键”

除去电源和专用协议引脚,树莓派4B共有26个可编程 GPIO 引脚(BCM0~BCM27 中部分保留用于启动或调试),它们是你实现自定义控制的核心资源。

它们能做什么?

  • 控制 LED 闪烁
  • 读取按钮状态
  • 实现 PWM 输出调节亮度或舵机角度
  • 配置中断响应快速事件(如脉冲计数)

关键参数一览(基于 BCM2711 数据手册):

参数数值说明
工作电平3.3V TTL不兼容5V器件,直接连接有风险
单引脚最大输出电流~16mA建议不超过10mA长期使用
所有GPIO总输出电流限制≤50mA否则可能导致电压下降或系统不稳定
支持上下拉电阻可配置上拉/下拉/禁用,防止悬空误触发

示例:用 Python 控制一个LED灯(推荐现代库lgpio

import lgpio as gpio import time # 获取GPIO资源句柄 h = gpio.gpiochip_open(0) led_pin = 17 # BCM GPIO17 # 设置为输出模式 gpio.gpio_write(h, led_pin, 0) # 初始低电平 gpio.gpio_claim_output(h, led_pin) try: while True: gpio.gpio_write(h, led_pin, 1) # 开灯 time.sleep(1) gpio.gpio_write(h, led_pin, 0) # 关灯 time.sleep(1) except KeyboardInterrupt: pass finally: gpio.gpio_write(h, led_pin, 0) gpio.gpio_close(h)

💡 提示:相比老旧的RPi.GPIOlgpio更轻量、线程安全、延迟更低,适合实时性要求较高的场景。


I²C:连接小功率传感器的“黄金搭档”

当你需要接入 OLED 屏幕、温湿度传感器(如 SHT30)、RTC 时钟芯片(DS1307)等低速外设时,I²C 是首选方案

对应引脚:

  • SDA(数据线)→ BCM GPIO2(Pin 3)
  • SCL(时钟线)→ BCM GPIO3(Pin 5)

这两根线上内置了弱上拉电阻,但在实际应用中建议外加4.7kΩ 上拉电阻至 3.3V,以增强信号完整性。

如何启用 I²C?

  1. 运行:
    bash sudo raspi-config
  2. 进入 “Interface Options” → 启用 “I2C”
  3. 或手动编辑/boot/firmware/config.txt添加:
    ini dtparam=i2c_arm=on

重启后即可看到设备节点/dev/i2c-1

快速检测设备是否在线:

sudo i2cdetect -y 1

输出示例:

0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ...

这里3c就是常见的 SSD1306 OLED 显示屏地址。

Python读取I²C设备(使用 smbus2)

from smbus2 import SMBus, i2c_msg with SMBus(1) as bus: # 向地址0x52的设备发送请求 msg = i2c_msg.write(0x52, [0x00]) bus.i2c_rdwr(msg) time.sleep(0.01) # 读取返回数据 read_msg = i2c_msg.read(0x52, 2) bus.i2c_rdwr(read_msg) data = list(read_msg) print(f"Received: {data}")

SPI:高速通信的“快车道”

如果你要接 TFT 彩屏、高速 ADC、NRF24L01 无线模块这类对带宽敏感的设备,那就得靠SPI(Serial Peripheral Interface)上场了。

默认 SPI0 引脚分配:

功能BCM GPIO物理引脚
MOSI(主出从入)GPIO10Pin 19
MISO(主入从出)GPIO9Pin 21
SCLK(时钟)GPIO11Pin 23
CE0_N(片选0)GPIO8Pin 24
CE1_N(片选1)GPIO7Pin 26

SPI 是全双工同步通信,速率可达数 MHz 至 tens of MHz,非常适合图像或音频流传输。

启用方法:

/boot/firmware/config.txt添加:

dtparam=spi=on

然后使用spidev库进行操作:

import spidev spi = spidev.SpiDev() spi.open(0, 0) # bus=0, device=0 (CE0) spi.max_speed_hz = 1_000_000 # 1MHz # 发送并接收数据(全双工) send_data = [0xFF, 0x00, 0xAA] recv_data = spi.xfer(send_data) print(f"Send: {send_data}, Recv: {recv_data}") spi.close()

📌 注意事项:
- 树莓派只能作为 SPI 主机(Master),不能做从机
- 多设备共享总线时,必须分别控制各自的片选线(CS)
- 高频信号走线尽量短,避免干扰


UART:经典串口通信,调试神器

UART 是最古老的串行通信方式之一,至今仍是调试嵌入式系统的“标配工具”。

默认串口映射:

  • TXD(发送)→ BCM GPIO14(Pin 8)
  • RXD(接收)→ BCM GPIO15(Pin 10)

但注意!树莓派4B默认把这部分功能交给了蓝牙模块,所以原始串口被重命名为ttyS0,而传统ttyAMA0被占用。

如何恢复为普通串口?

修改/boot/firmware/config.txt

dtoverlay=disable-bt

然后禁用蓝牙服务:

sudo systemctl disable hciuart

重启后/dev/ttyS0就可用于普通串口通信。

Python 接收串口数据(pyserial)

import serial ser = serial.Serial('/dev/ttyS0', baudrate=9600, timeout=1) while True: if ser.in_waiting: line = ser.readline().decode('utf-8').strip() print(f"← {line}")

应用场景包括:
- 接收 GPS 模块的 NMEA 语句
- 与其他单片机(如 Arduino)交换指令
- 日志输出或远程终端交互


实战案例:搭建一个环境监测站

我们来整合前面提到的所有接口,做一个实用的小项目。

外设清单:

  • DHT22 温湿度传感器 → 接 GPIO4(单总线协议)
  • SSD1306 OLED 显示屏 → 接 I²C(GPIO2/3)
  • DS1307 RTC 实时时钟 → 接同一 I²C 总线
  • SD卡模块 → 接 SPI0(GPIO7~11)
  • 电源:5V USB + 外部电池备份 RTC

连接拓扑:

树莓派4B ├── GPIO4 ───── DHT22(数据) ├── I²C ─┬───── SSD1306(显示) │ └───── DS1307(时间) └── SPI ─────── SD Card Module(存储)

所有设备共地,电源合理分区。

工作流程:

  1. 开机初始化各接口
  2. 从 DHT22 获取温湿度
  3. 从 DS1307 获取精确时间
  4. 将数据显示在 OLED 上
  5. 同时记录日志到 SD 卡

全部可用 Python 协同完成,无需额外MCU。


那些年我们都踩过的坑:常见问题与避坑指南

🔧 问题1:I²C设备扫描不到?

  • ✅ 检查接线是否反接(SDA↔SDA, SCL↔SCL)
  • ✅ 确认已启用 I²C 接口
  • ✅ 测量电压:SDA/SCL 应有 3.3V 上拉
  • ✅ 使用i2cdetect -y 1排查地址冲突

🔧 问题2:SPI通信失败?

  • ✅ 片选线(CE)是否正确连接并拉低?
  • ✅ 设备是否支持主模式?树莓派无法做SPI从机
  • ✅ 波特率设置过高?尝试降低至 500kHz 再测试

🔧 问题3:GPIO输出不稳定?

  • ✅ 是否超载?多个LED同时亮起可能超过总电流限制
  • ✅ 使用三极管或MOSFET隔离驱动大负载
  • ✅ 加装限流电阻(如220Ω)保护引脚

🔧 问题4:串口收不到数据?

  • ✅ 检查是否关闭了蓝牙(dtoverlay=disable-bt)
  • ✅ 波特率是否匹配?两边必须一致
  • ✅ 电平是否兼容?TTL(3.3V)≠ RS232(±12V)

最佳实践总结:让你的设计更可靠

  1. 命名统一:代码中始终使用 BCM 编号,文档中标注对应物理引脚
  2. 电源分离:高功耗设备独立供电,避免反灌损坏主板
  3. 信号保护:长距离通信加屏蔽线,必要时使用光耦隔离
  4. 使用 HAT 扩展板:标准化接口,提升安全性与美观度
  5. 加入硬件防护:TVS二极管防静电、0.1μF去耦电容滤噪
  6. 留足散热空间:长时间满载运行时注意通风或加装散热片

掌握了这40根引脚的功能与边界,你就不再只是“跑通Demo”的用户,而是能够自主设计完整嵌入式系统的开发者。

无论是做个智能台灯、自动化温室控制器,还是边缘AI推理前端,树莓派4B 的 GPIO 都是你通往物理世界的入口

现在,拿起你的杜邦线,点亮第一盏由你亲手控制的LED吧!

如果你在实践中遇到具体问题,欢迎留言交流——我们一起拆解每一个“为什么不行”。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/26 20:34:54

41、Windows PowerShell中WMI的使用与查询技巧

Windows PowerShell中WMI的使用与查询技巧 在Windows PowerShell中,与Windows Management Instrumentation (WMI) 交互是一项非常重要的功能。WMI 提供了一种标准化的方式来访问和管理操作系统、应用程序和硬件组件。下面我们将深入探讨如何在PowerShell中使用WMI进行查询和操…

作者头像 李华
网站建设 2026/3/26 21:47:30

5步轻松搞定:Mac免费实现NTFS磁盘完整读写权限终极指南

5步轻松搞定:Mac免费实现NTFS磁盘完整读写权限终极指南 【免费下载链接】Free-NTFS-for-Mac Nigate,一款支持苹果芯片的Free NTFS for Mac小工具软件。NTFS R/W for macOS. Support Intel/Apple Silicon now. 项目地址: https://gitcode.com/gh_mirror…

作者头像 李华
网站建设 2026/3/27 8:24:15

44、Windows脚本库实用功能解析

Windows脚本库实用功能解析 1. I/O实用库的使用 1.1 执行状态记录 在脚本执行过程中,我们可以通过以下代码记录执行状态: var ws = WScript.CreateObject("WScript.Shell"); if (status == 0) {// 成功执行s = WScript.ScriptName + " completed succes…

作者头像 李华
网站建设 2026/3/27 19:06:35

48、Windows脚本库实用指南:PowerShell的高级应用

Windows脚本库实用指南:PowerShell的高级应用 1. PowerShell基础注意事项与网络测试 在PowerShell中, $host 代表控制台,所以不要尝试使用 “Host” 作为变量或参数名。我们可以使用以下函数进行网络测试,该函数可以接受其他参数,也可以从 Get-IPconfig 获取输入: …

作者头像 李华
网站建设 2026/3/26 23:22:07

Zenodo_get终极指南:让科研数据获取效率提升10倍的Python神器

Zenodo_get终极指南:让科研数据获取效率提升10倍的Python神器 【免费下载链接】zenodo_get Zenodo_get: Downloader for Zenodo records 项目地址: https://gitcode.com/gh_mirrors/ze/zenodo_get 还在为这些问题浪费科研时间?当你需要从Zenodo下…

作者头像 李华