一文说清树莓派插针定义的物理编号与BCM区别

树莓派GPIO接线总翻车?一文讲透物理编号和BCM到底怎么用

你有没有过这样的经历:照着教程把LED接到树莓派上,代码跑起来却一点反应都没有?查了又查,线路没错、电源正常、程序也看着没问题——最后才发现,原来是引脚编号搞混了

在树莓派的世界里,同一个金属针脚,居然有两种“名字”:一个叫物理编号,另一个叫BCM编号。它们指向的是同一根硬件引脚,但如果你在编程时弄错了,轻则外设不工作,重则烧板子。

这不是玄学,而是每个刚入门嵌入式开发的人都会踩的坑。今天我们就来彻底说清楚:

这两种编号到底有什么区别?什么时候该用哪个?为什么大多数代码都推荐用BCM?


从一块板子说起:树莓派的GPIO排针长什么样?

拿起你的树莓派,你会看到一排20或40个金属针脚整齐排列在边缘。这就是我们常说的GPIO排针(General Purpose Input/Output),是连接外部传感器、按钮、电机等设备的关键接口。

这40个针脚并不是随便安排的。它们中有一些是固定的电源和地线(比如3.3V、5V、GND),还有一些是可以编程控制的通用IO口,也就是我们说的GPIO。

但问题来了:当我们要写代码去控制某个引脚时,该怎么告诉程序“我要操作哪一个”?

答案就是——编号系统。

而树莓派偏偏提供了两种不同的编号方式。


物理编号(Physical Pin Numbering):按位置数数

想象你在数一排座位:“第一排左边第一个是1号,右边那个是2号,下面依次是3、4、5……”

这就是物理编号的本质:完全按照引脚在电路板上的实际位置来编号,从1开始顺序递增。

它的特点很直观:

  • 左上角第一个引脚是Pin 1
  • 往下是 Pin 3、5、7…
  • 右边一列是 Pin 2、4、6、8…
  • 所有型号只要排针布局一样,这个编号就一致

适合谁用?

  • 刚入门的新手
  • 做实验需要快速插线的人
  • 出接线图、教学PPT的时候标注用

因为你看一眼板子就能找到“第12个针脚”,不需要查资料。

但它有个致命弱点:

不是所有物理编号对应的都是可编程GPIO!

比如:
- Pin 1 → 3.3V 电源(不能做输入输出)
- Pin 2 → 5V 电源
- Pin 6 → GND(地)

这些都不是你能通过代码控制高低电平的“GPIO”。如果你在程序里试图对Pin 1设置output HIGH,那不仅没意义,还可能造成短路风险。

所以记住一句话:

物理编号 ≠ GPIO编号

它只是一个物理位置标签,包含了电源、地、保留引脚和真正的GPIO。


BCM编号(Broadcom SOC Channel):芯片级的真实身份

现在换个视角:你不看板子了,转而去研究树莓派的核心芯片——博通(Broadcom)设计的SoC。

在这个芯片内部,每一个可以被软件控制的IO通道都有一个唯一的数字代号,比如 GPIO18、GPIO21……这些就是BCM编号

举个例子:

你在程序里写GPIO.setup(18, OUT),这里的“18”指的就是 BCM18,对应的是SoC内部第18号通用IO通道。

无论这个引脚在PCB上位于左上角还是右下角,只要它是BCM18,操作系统就会准确找到并控制它。

这种编号的优势在哪?

维度说明
✅ 精准映射直接关联到芯片寄存器,没有歧义
✅ 功能支持完整PWM、SPI、I²C等功能只绑定特定BCM引脚
✅ 行业标准几乎所有官方文档、库、示例都默认使用BCM

比如你想用硬件PWM输出方波信号,只有 BCM12、BCM13、BCM18 支持。你不可能靠“物理位置”实现这种功能。

再比如 I²C 的 SDA 和 SCL 引脚,在大多数树莓派上分别是 BCM2 和 BCM3 —— 而它们的物理编号是 Pin 3 和 Pin 5。


一张表看清本质区别

对比项物理编号(BOARD)BCM编号(BCM)
编号依据板子上的物理位置SoC内部通道编号
是否连续是(1,2,3,…)否(跳着来,如2,3,4,7,8,9…)
包含哪些引脚所有针脚(含5V/3.3V/GND)仅可编程GPIO
编程中常用吗很少极其常见
推荐用于接线图、硬件连接写代码、调API
Python中如何设置GPIO.setmode(GPIO.BOARD)GPIO.setmode(GPIO.BCM)

🛑重点提醒:如果你用了GPIO.setmode(GPIO.BCM),那你后面写的引脚号就必须是BCM编号;反之亦然。一旦错配,后果就是“接对了线,却控制错了脚”。


实战案例:为什么我的LED不亮?

假设你想点亮一个LED,把它接到了树莓派的物理编号12上。

查一下引脚图你会发现:
👉 物理编号12 =BCM18

接下来你写了段Python代码:

import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) # 注意这里设的是BOARD模式 LED_PIN = 18 # 你以为这是BCM18? GPIO.setup(LED_PIN, GPIO.OUT) for _ in range(5): GPIO.output(LED_PIN, GPIO.HIGH) time.sleep(0.5) GPIO.output(LED_PIN, GPIO.LOW) time.sleep(0.5) GPIO.cleanup()

结果呢?灯没亮。

错在哪?

虽然你接的是物理12(BCM18),但在代码中你用了GPIO.setmode(GPIO.BOARD),这意味着LED_PIN = 18指的是物理编号18

而物理编号18对应的是BCM24—— 完全不是你接的那个引脚!

这就相当于:你买了张12号座位的票,却坐到了18号位上,当然没人给你发餐。

正确做法一(推荐):

统一使用BCM编号:

GPIO.setmode(GPIO.BCM) LED_PIN = 18 # 明确表示BCM18 GPIO.setup(LED_PIN, GPIO.OUT)

正确做法二(仅限简单项目):

坚持用物理编号,那就必须用物理编号写代码:

GPIO.setmode(GPIO.BOARD) LED_PIN = 12 # 物理编号12 GPIO.setup(LED_PIN, GPIO.OUT)

✅ 总结一句口诀:

接线看物理,编程用BCM;模式要匹配,别让脚乱跑。


如何快速查清对应关系?三个实用工具推荐

1. 终端命令:pinout

如果你用的是较新的 Raspberry Pi OS,直接在终端输入:

pinout

它会打印出当前树莓派型号的完整引脚图,清晰标注每个针脚的物理编号、BCM编号、功能名称(如SDA、SCL、TXD等),甚至还有文字说明。

2. 在线可视化工具

搜索 “raspberry pi pinout interactive” 可以找到很多图形化网页工具,比如 pinout.xyz 。

鼠标悬停就能看到详细信息,特别适合初学者学习。

3. 打印一张贴纸贴在板子旁

老司机的做法:下载一份高清引脚图,打印出来贴在工作台或盒子盖上,随时对照。


高阶提示:别忽视特殊功能引脚

有些BCM引脚具备复用功能,比如:

BCM编号特殊功能
BCM18支持硬件PWM0
BCM8 / BCM7SPI CS0 / CS1
BCM2 / BCM3I²C SDA / SCL
BCM14 / BCM15UART TXD / RXD

如果你想实现精确的PWM调光、高速SPI通信或者稳定I²C读取,一定要优先选择这些原生支持的引脚,而不是随便找个GPIO凑合。

否则只能靠软件模拟,性能差、不稳定、占用CPU资源。


团队协作中的最佳实践

当你和其他人一起做项目时,最容易出问题的就是编号混乱

为了避免扯皮,建议遵循以下规范:

  1. 代码中一律使用 BCM 编号
    - 统一标准,减少误解
    - 更容易移植到其他项目

  2. 注释中标明物理编号
    python LED_PIN = 18 # BCM18, 物理Pin 12

  3. 绘制接线图时双标
    - 同时写出物理编号和BCM编号
    - 标注功能用途(如“连接DHT11数据线”)

  4. 在README中声明编号模式
    ⚠️ 本项目使用 BCM 编号,请确保代码开头设置: GPIO.setmode(GPIO.BCM)


最后划重点:别再被编号绊倒了

回到最初的问题:

物理编号和BCM有什么区别?

答案已经很清楚了:

  • 物理编号是给人看的——方便你动手接线;
  • BCM编号是给程序看的——确保指令精准送达。

你可以把它们理解为:

📍 地址门牌 vs 户主身份证号

你在地图上找地方靠门牌号(物理编号),但银行开户必须用身份证号(BCM编号)。两者有关联,但用途完全不同。


掌握这一点,你就迈过了树莓派GPIO编程的第一道门槛。下次再遇到“接了线没反应”的情况,先别急着重启树莓派,花30秒检查一下:

“我是不是把物理编号当成BCM用了?”

往往问题就出在这儿。

如果你正在做一个物联网项目、自动化小车,或是学生实验作业,不妨现在就打开终端敲一遍pinout,重新认识一下这块小板子上的每一根针脚。

毕竟,真正的嵌入式开发,从来都不是“接上线就能跑”,而是理解每一行代码背后真实的硬件世界

如果你在实践中还遇到过其他GPIO相关的坑,欢迎留言分享,我们一起避坑前行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1146186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 有用的资源

C 学习资源 官方文档与标准 ISO C 官方网站:提供最新标准、会议记录和核心语言指南。C 参考手册:涵盖语法、标准库及编译器支持情况。 在线教程与课程 LearnCpp.com:从基础到高级的免费教程。C for Programmers (Coursera):由…

一文说清常见USB转串口芯片驱动下载方式

一文说清主流USB转串口芯片的驱动安装与避坑指南 你有没有遇到过这样的情况:手里的开发板插上电脑,设备管理器里却只显示“未知设备”?或者明明装了驱动,COM口刚出现又消失了?更离谱的是,换一台电脑就能用&…

当教育遇上AI:瞬维AI如何为教培行业打开获客新通路?

“酒香也怕巷子深”,这句话正在今天的教育行业上演。随着教育市场日益细分,竞争愈发激烈,许多优质的教育机构、独立教师和知识分享者面临着一个共同的困境:内容做得很用心,产品打磨得很扎实,但就是“被看见…

解密 AI 人工智能里的 Gemini 技术商业化

解密 AI 人工智能里的 Gemini 技术商业化 关键词:Gemini AI、人工智能商业化、多模态模型、技术架构、应用场景、商业模式、挑战与机遇 摘要:本文深入探讨Google DeepMind开发的Gemini人工智能技术的商业化路径。我们将从技术原理出发,分析其多模态架构的创新性,详细解读其…

Altium Designer差分信号布局实战案例详解

差分信号PCB布局实战:从Altium Designer设置到高速USB设计避坑在现代电子系统中,只要涉及“高速”二字——无论是通信、存储还是数据采集——差分信号几乎无处不在。USB、PCIe、以太网、DDR……这些我们每天打交道的接口,背后都依赖着精密的差…

Multisim下载在虚拟课堂中的应用完整示例

用Multisim打造“永不打烊”的电子实验室:一位工科教师的实战手记最近在给大二学生上《模拟电子技术》时,有位同学私信问我:“老师,我在宿舍试了三遍共射放大电路,波形还是失真,但又不敢拆焊重来……” 我看…

arm64平台上交叉编译x64动态库完整步骤

在 arm64 平台交叉编译 x86_64 动态库:从零开始的实战指南你有没有遇到过这种情况:手头只有一台基于 ARM 架构的设备,比如苹果 M1/M2 Mac、树莓派 5 或 NVIDIA Jetson 开发板,但项目却需要为传统的 x86_64 Linux 系统生成一个.so文…

零基础搭建Multisim主数据库:手把手教程

从零开始搭建 Multisim 主数据库:电子工程师的“元件仓库”实战指南你有没有遇到过这种情况——在实验室或公司里,打开别人的 Multisim 工程文件时,弹出一连串“找不到元件”的警告?又或者自己辛辛苦苦建了个新芯片模型&#xff0…

iverilog操作指南:常用命令参数深度剖析

iverilog实战精要:从命令行到高效仿真的完整路径你有没有过这样的经历?写好了Verilog代码,信心满满地敲下iverilog *.v,结果编译器报错:“No top-level module found”?或者明明定义了宏,条件编…

毛球修剪器电路图中驱动电路热管理设计:工程实践指南

毛球修剪器驱动电路热管理实战:从原理到落地的工程笔记你有没有遇到过这种情况——手里的毛球修剪器用着用着突然“罢工”,等几分钟又好了?拆开一看,电机没坏、电池还有电,问题出在哪?答案往往藏在那块不起…

T触发器时序约束设置:FPGA设计中的关键步骤

T触发器与时序约束:FPGA设计中那些容易被忽视的关键细节你有没有遇到过这样的情况?明明逻辑写得没问题,仿真也跑通了,结果烧进FPGA后系统却时不时“抽风”——数据错乱、状态跳变、甚至直接锁死。查来查去,最后发现罪魁…

Altium Designer柔性电路板PCB绘制项目应用解析

Altium Designer柔性电路板设计实战:从叠层建模到3D验证的全流程解析你有没有遇到过这样的场景?手环刚上市三个月,用户反馈“戴了两周屏幕就失灵”;折叠手机反复开合后摄像头信号中断;医疗内窥镜在弯曲部位频繁断线………

Parasoft C/C++test与MISRA C++兼容性问题解析

用好Parasoft C/Ctest,让MISRA C合规不再“纸上谈兵”在汽车电子、工业控制、航空航天等安全关键系统中,一行代码的失误可能引发灾难性后果。因此,软件的可靠性早已不再是“锦上添花”,而是产品能否上市的生死线。C 因其性能优势被…

技术驱动服务型民企突围:玄晶引擎AI数字化方案的落地逻辑与价值实现

对于深耕咨询、会计、人力资源等领域的服务型民营企业从业者而言,“轻资产运营”的优势背后,藏着太多被“人力依赖”与“流程非标”拖累的痛点。尤其是在当前流量内卷、同质化竞争白热化的市场环境下,高人力成本、低获客效率、服务标准失衡等…

GDAL 实现矢量合并

前言 ❝ 矢量数据作为数据处理的半壁江山,在日常工作中涉及到多种操作,矢量数据合并也是一项常用操作,该功能涉及到两个及以上的数据源在几何对象与属性对象之间的合并操作。在之前的文章中讲了如何使用GDAL或者ogr2ogr工具将txt以及csv文本数…

提升用户体验的标签切换方案:QTabWidget实战案例

让标签页更聪明:从QTabWidget到工业级界面的实战进阶你有没有遇到过这样的场景?程序一启动,卡顿好几秒才弹出主窗口——只因为四个标签页里藏着三个“重量级”模块:一个要加载万行日志,一个得初始化三维渲染引擎&#…

circuit simulator中实现前仿真与后仿真的统一平台方案

如何用一个电路仿真器打通前后仿:构建高效统一的验证平台在今天的深亚微米工艺下,芯片设计早已不是画完原理图、跑个前仿真就万事大吉的事了。尤其是模拟、射频和混合信号电路,后仿真的结果常常让人“惊喜”——增益掉了3dB,带宽缩…

一文说清MOSFET工作原理:开关模式基础认知

深入浅出MOSFET:从零理解开关模式下的核心原理与实战设计你有没有遇到过这样的问题:用MCU控制一个电机,明明代码写对了,可MOSFET一上电就发热甚至烧毁?或者在做DC-DC电源时,效率怎么都提不上去,…

设计模式学习(11) 23-9 组合模式

文章目录0.个人感悟1. 概念2. 适配场景2.1 适合的场景2.2 常见场景举例3. 实现方法3.1 实现思路3.2 UML类图3.3 代码示例4. 优缺点4.1 优点4.2 缺点5. 源码分析(JDK中的组合模式实现)0.个人感悟 组合模式的应用场景比较专,适合树状嵌套场景&…

FreeRTOS任务调度模式选择核心要点

FreeRTOS任务调度模式选择:从理论到实战的深度指南在嵌入式系统的世界里,“实时性”不是锦上添花的功能,而是生死攸关的底线。当你设计一个工业控制器、医疗设备或智能网关时,系统能否在毫秒级内响应关键事件,往往决定…