韦东山《ARM 架构与编程》3-1 硬件知识_LED 原理图 · 学习笔记
所属课程 :ARM 架构与编程 · 基于 STM32F103(前身《单片机核心 / RTOS 必备 · 硬件编程大全》)
所在章节 :第三章 第一个程序(点亮 LED)· 第 1 节
原视频 :https://video.100ask.net/p/t_pc/course_pc_detail/video/v_5f858f8ee4b06aff1a03db26
整理日期:2026-09-28
目录
- 摘要
- 一、本节在课程中的位置
- [1.1 课程坐标系](#1.1 课程坐标系)
- [1.2 与相邻小节的关系](#1.2 与相邻小节的关系)
- [二、核心命题:点亮 LED 的三步法](#二、核心命题:点亮 LED 的三步法)
- [2.1 第一步:看原理图,确定控制 LED 的引脚](#2.1 第一步:看原理图,确定控制 LED 的引脚)
- [2.2 第二步:查主芯片手册,确定引脚如何配置](#2.2 第二步:查主芯片手册,确定引脚如何配置)
- [2.3 第三步:写程序](#2.3 第三步:写程序)
- [三、如何读一张 LED 原理图](#三、如何读一张 LED 原理图)
- [3.1 原理图上的三类符号](#3.1 原理图上的三类符号)
- [3.2 关键判据:LED 的正极接在哪一端](#3.2 关键判据:LED 的正极接在哪一端)
- [3.3 网络标号与引脚命名](#3.3 网络标号与引脚命名)
- [四、LED 的四种驱动方式](#四、LED 的四种驱动方式)
- [4.1 方式一:高电平点亮(拉电流)](#4.1 方式一:高电平点亮(拉电流))
- [4.2 方式二:低电平点亮(灌电流)](#4.2 方式二:低电平点亮(灌电流))
- [4.3 灌电流与拉电流的工程差异](#4.3 灌电流与拉电流的工程差异)
- [4.4 方式三与方式四:三极管驱动](#4.4 方式三与方式四:三极管驱动)
- 五、为什么必须串限流电阻
- [5.1 LED 是电流驱动器件](#5.1 LED 是电流驱动器件)
- [5.2 限流电阻的估算](#5.2 限流电阻的估算)
- [5.3 电阻位置的等价性](#5.3 电阻位置的等价性)
- [六、三极管驱动:从"驱动 LED"到"驱动开关"](#六、三极管驱动:从"驱动 LED"到"驱动开关")
- [6.1 NPN 低侧驱动](#6.1 NPN 低侧驱动)
- [6.2 为什么要用三极管](#6.2 为什么要用三极管)
- [6.3 两级驱动的反相逻辑](#6.3 两级驱动的反相逻辑)
- 七、从原理图推导程序逻辑
- [7.1 电平与"亮 / 灭"的映射表](#7.1 电平与"亮 / 灭"的映射表)
- [7.2 常见误区](#7.2 常见误区)
- 八、本节结论与延伸
- [附录 A:术语速查](#附录 A:术语速查)
- [附录 B:读完本节后的自查清单](#附录 B:读完本节后的自查清单)
摘要
本节以点亮 LED 为切入点,提出"读原理图、查手册、写程序"三步法;辨析高低电平两种接法,阐明限流电阻的分压作用,比较灌电流与拉电流的能力差异,并给出三极管扩展驱动电路。旨在建立"先看硬件、再定电平、后写代码"的工程思维,为后续 GPIO 操作奠定基础。
一、本节在课程中的位置
1.1 课程坐标系
《ARM 架构与编程》是一门寄存器版单片机裸机课程 ,同一套知识点分别在 STM32F103(Cortex-M3)、I.MX6ULL(Cortex-A7)、STM32MP157(Cortex-A7 + M4)三款开发板上各录一遍,因此本节的标题在三个版本中完全一致(仅连接符写法略有差异:硬件知识_LED原理图 / 硬件知识-LED 原理图)。
课程对使用者的定位很清楚:
| 维度 | 说明 |
|---|---|
| 面向人群 | 已用 Keil + HAL 库学过单片机,但想理解内部机制的人;准备学 U-Boot / RTOS / Linux 驱动却无从入手的人 |
| 与 HAL 路线的关系 | HAL 封装了细节,难以直接切入 RTOS 与 U-Boot;本课程从第一条指令、第一个寄存器讲起 |
| 承上启下 | 上承"嵌入式概念及硬件组成",下启"GPIO 操作方法概述 → 各芯片的 GPIO 操作 → LED 编程" |
1.2 与相邻小节的关系
第三章的四个(I.MX6ULL / STM32MP157 版本为五个)小节构成一条完整的"让灯亮起来"的链路:
text
3-1 硬件知识_LED 原理图 ← 本节:硬件层,回答"引脚是哪根、什么电平点亮"
↓
3-2 GPIO 引脚操作方法概述 ← 抽象层,回答"通用地看,怎么让引脚输出高低电平"
↓
3-3 具体芯片的 GPIO 操作方法 ← 芯片层,回答"STM32F103 上用什么寄存器、什么位域"
↓
3-4 具体芯片的 LED 编程 ← 软件层,回答"如何写出第一个能烧进板子的程序"
本节是整条链路的前置条件:如果不知道开发板上 LED 挂在哪个引脚、哪个电平才是"亮",后面三步写出来的代码只能是照抄,无法自己判断对错。
二、核心命题:点亮 LED 的三步法
课程把"点亮一个 LED"类比为 C 语言的 Hello World,并把它拆成三个可复用的固定步骤。这三步是跨芯片通用的方法论------换一块板子、换一款芯片,流程不变,变的只是中间步骤的具体答案。
2.1 第一步:看原理图,确定控制 LED 的引脚
从开发板提供的原理图(Schematic)中找到 LED 所在的那一小块电路,读出两件事:
- 控制引脚是谁 ------通过网络标号(Net Label)追到主芯片的某个引脚,例如
PC13、GPIO5_3、PA1。 - 什么电平点亮------顺着 LED 的极性判断,见第三节。
2.2 第二步:查主芯片手册,确定引脚如何配置
拿到引脚编号后,回到主芯片的数据手册 / 参考手册,查清三件事:
- 该引脚属于哪个端口(Port / Bank);
- 要让这个引脚"能输出",需要配置哪些寄存器、哪些位;
- 部分芯片还需要先使能该端口的时钟,否则寄存器写下去没有任何反应。
2.3 第三步:写程序
把上一步的寄存器操作翻译成代码,编译、烧写、观察现象。这一步的输入完全依赖前两步的结论:引脚错了灯不亮,电平判断反了灯常亮或常灭。
方法论的要点:三步法把"点亮 LED"从一次性的技巧,变成了一套可迁移的排查路径。后面点按键、点串口、点 LCD,走的都是同一套流程。
三、如何读一张 LED 原理图
3.1 原理图上的三类符号
读 LED 电路,只需认识三类符号:
| 符号类型 | 在图上的样子 | 需要读到什么 |
|---|---|---|
| 电源与地 | VCC / 3V3 / VDD,以及接地符号 GND |
电流回路的起点与终点 |
| 无源器件 | 电阻(矩形或折线)、LED(三角形加一横、带两个箭头) | LED 的三角形指向即电流方向,横线一端是阴极 |
| 连接关系 | 网络标号(PC13、LED1)、连线交点 |
这块电路接到了哪个引脚、哪个网络 |
3.2 关键判据:LED 的正极接在哪一端
这是本节最实用的一条结论,可以概括成一句口诀:
LED 正极接引脚、负极接 GND → 引脚输出高电平点亮。
LED 正极接 VCC、负极接引脚 → 引脚输出低电平熄灭、输出低电平点亮(低电平有效)。
严格来说判据是"看电流往哪流":LED 是单向导通器件,只有阳极电位高于阴极且压差达到正向压降时才有电流,灯才亮。因此只要确定 LED 的阳极接在引脚上还是接在电源上,就能反推出"点亮值"是 1 还是 0。
3.3 网络标号与引脚命名
原理图上不会画一整根线连到芯片,而是用网络标号 代替。见到 PC13 这样的标记要能拆解:
P:Pin / Port,通用引脚;C:端口组编号(A、B、C ...);13:组内引脚序号。
因此 PC13 表示"端口 C 的第 13 号引脚"。这一步的产出,正是第二步去查手册的索引。
四、LED 的四种驱动方式
课程把常见的 LED 驱动电路归纳为四种方式。它们分成两组:前两种是引脚直驱,后两种是加三极管驱动。
4.1 方式一:高电平点亮(拉电流)
- 引脚输出 3.3V → 点亮 ,输出 0V → 熄灭。
- 电路形态:
引脚 → 限流电阻 → LED 阳极 → LED 阴极 → GND。 - 电流由芯片引脚提供 ,称为拉电流(Source Current),也叫"高电平有效"。
4.2 方式二:低电平点亮(灌电流)
- 引脚输出 0V → 点亮 ,输出 3.3V → 熄灭。
- 电路形态:
VCC → LED 阳极 → LED 阴极 → 限流电阻 → 引脚。 - 电流由外部电源提供、经引脚流入芯片内部 ,称为灌电流(Sink Current),也叫"低电平有效"。
4.3 灌电流与拉电流的工程差异
课程强调这两种方式并非等价,选型时看的是芯片的驱动能力:
| 对比项 | 灌电流(低电平点亮) | 拉电流(高电平点亮) |
|---|---|---|
| 电流来源 | 外部电源经引脚灌入芯片 | 芯片引脚自己输出 |
| 常见能力 | 较强,单个 IO 常见十几至二十几 mA | 较弱,许多经典 MCU 的 IO 高电平驱动能力明显不足 |
| 代码心智 | 逻辑"反相":写 0 才是亮 | 逻辑直观:写 1 就是亮 |
| 实践倾向 | 多数开发板采用这种接法 | 用于小电流指示灯 |
需要注意的工程约束:即使灌电流能力较强,芯片手册通常还会规定所有 IO 的合计电流上限。所以"同时点亮很多个 LED"未必可行,必须回去查手册的绝对最大额定值。
4.4 方式三与方式四:三极管驱动
当芯片引脚"驱动能力不足"(例如某些低功耗芯片的 IO 输出电流很小),或者 LED 需要由独立电源供电时,就引入三极管:
- 方式三 :引脚输出 1.2V → 点亮 ,输出 0V → 熄灭。
- 方式四 :引脚输出 0V → 点亮 ,输出 1.2V → 熄灭。
这里的 1.2V 指的是 LED 支路的独立电源电压。这两条结论的价值不在于记住具体电压值,而在于揭示一个事实:
一旦引入三极管,引脚的角色就从"提供点亮 LED 的电流"变成"控制一个开关的通断",引脚只需给出高 / 低电平即可,不再需要关心这个电平是 3.3V 还是 1.2V,也不需要具备点亮 LED 的电流能力。
五、为什么必须串限流电阻
5.1 LED 是电流驱动器件
LED 不是"给足电压就亮"的器件,它的正向伏安特性十分陡峭:正向压降一旦达到阈值(红光典型约 2.0V,蓝白光更高),继续加压会让电流急剧上升。
若把 LED 直接接在 3.3V 与 GND 之间,LED 两端被强加 3.3V,远超其正向压降,回路电流将不受控地增大,结果是 LED 迅速烧毁,严重时还会连带损坏 IO 口。
因此必须串联一个电阻来分压并限制电流------这就是"限流电阻"。
5.2 限流电阻的估算
工程上用一个近似式估算:
text
R ≈ (V_电源 − V_LED正向压降) / I_期望电流
以 3.3V 系统、红色 LED(V_f ≈ 2.0V)、期望 8 mA 为例:
text
R ≈ (3.3 − 2.0) / 0.008 ≈ 162 Ω → 取标称值 330 Ω(更保守、更安全)
取值要点:
- 算出的是下限,实际选型一般往上取(电流略小,亮度足够、更安全);
- 不同颜色 LED 的 V_f 差别很大,蓝白光 LED 在 3.3V 系统下压差很小,会显得偏暗;
- 若为灌电流接法(引脚在低侧),电阻串在 LED 与引脚之间。
5.3 电阻位置的等价性
从限流的物理本质看,电阻串在 LED 的哪一侧并不改变回路电流(回路串联、电流处处相等)。原理图上它常被画在靠引脚的一侧,主要出于布线与阅读习惯的考虑,而不是电气上的必须。
六、三极管驱动:从"驱动 LED"到"驱动开关"
6.1 NPN 低侧驱动
最常见的形式是把 NPN 三极管当作低侧电子开关:
text
VCC ── 限流电阻 ── LED ── 三极管 C 极
├─ E 极 ── GND
引脚 ── 基极电阻 R_B ── 三极管 B 极
- 引脚输出高电平 → 三极管导通 → LED 回路接通 → 点亮;
- 引脚输出低电平 → 三极管截止 → 回路断开 → 熄灭。
引脚此时只提供极小的基极电流 ,典型设计取 I_B ≈ I_C / 10(保证三极管进入饱和区,而不是停留在放大区)。因为基极电流可以小到零点几毫安,引脚驱动能力不足的问题就被彻底绕开了。
6.2 为什么要用三极管
归纳起来有三个动机:
- 补足驱动能力:把 IO 从"扛负载电流"降级为"送一个控制信号"。
- 隔离风险:LED 短路等故障电流流经三极管而非直接灌入 IO,降低主芯片损坏概率。
- 电平解耦:负载可以由独立电源(5V / 12V / 1.2V)供电,引脚电平与负载电压互不绑定。
6.3 两级驱动的反相逻辑
如果连驱动一个 NPN 的基极电流都嫌大,可以再串一级:用小电流的 PNP 去控制 NPN,形成两级放大。代价是逻辑发生反相 ------低电平导通第一级、进而点亮 LED,代码里的电平映射需要相应取反。选型时应优先挑选饱和压降 V_CE(sat) 小的三极管,以减少无谓的压降损失。
七、从原理图推导程序逻辑
7.1 电平与"亮 / 灭"的映射表
做完前面几步,最终要产出的其实是这样一张表------它才是写代码时的直接依据:
| 原理图形态 | 引脚输出 0 | 引脚输出 1 | 代码中的"点亮" |
|---|---|---|---|
| LED 阳极接引脚、阴极接 GND | 灭 | 亮 | 输出 1 |
| LED 阴极接引脚、阳极接 VCC | 亮 | 灭 | 输出 0 |
| NPN 低侧驱动(阳极经电阻接 VCC) | 灭 | 亮 | 输出 1 |
| 两级驱动(反相) | 亮 | 灭 | 输出 0 |
7.2 常见误区
- 误以为"写 1 就是点亮"。绝大多数教学板的 LED 是低电平有效,写 1 反而熄灭。判断依据只能是原理图,不能靠经验。
- 忽略端口时钟。STM32 等芯片在配置 GPIO 之前必须先使能对应端口时钟,否则寄存器写入无效------这一步由 3-3 展开,但心智模型在本节就该建立。
- 省掉限流电阻。任何情况下 LED 回路都必须有限流电阻,无论直驱还是三极管驱动。
- 把"引脚驱动能力"当成无限。要同时看单个 IO 电流与全芯片合计电流两个限制。
八、本节结论与延伸
本节的落点可以浓缩为一句话:
点亮 LED 的第一步不是写代码,而是读原理图;读原理图要回答的唯一问题是------我们想让灯亮时,引脚该输出高电平还是低电平。
由这一句往外延伸,本节埋下了三颗后续会反复用到的种子:
- **"三步法"**是嵌入式外设开发的通用范式(原理图 → 手册 → 代码);
- **"灌电流 / 拉电流"**的区分,会出现在后面按键、UART、I²C 等所有涉及电平的外设中;
- **"IO 只负责控制,不负责出力"**的思路,正是后面学 RTOS、U-Boot 时理解驱动分层的起点。
下一节 3-2《GPIO 引脚操作方法概述》将把"让引脚输出高低电平"这件事,从本节的具体电路抽象成通用的操作方法。
附录 A:术语速查
| 术语 | 含义 |
|---|---|
| 网络标号(Net Label) | 原理图上代替连线的名字,如 PC13,用于指认引脚 |
| 灌电流 / Sink Current | 电流从外部经引脚流入芯片,通常对应低电平有效 |
| 拉电流 / Source Current | 电流由引脚输出到外部,通常对应高电平有效 |
| 限流电阻 | 串在 LED 回路中分压限流的电阻,不可省略 |
| 饱和区 | 三极管作为开关"完全导通"的工作区,需保证足够的基极电流 |
| V_f(正向压降) | LED 导通时的正向电压,红光约 2.0V,蓝白光更高 |
| V_CE(sat)(饱和压降) | 三极管饱和导通时 C-E 之间的残留压降,越小越好 |
附录 B:读完本节后的自查清单
- 能说出点亮 LED 的三个固定步骤,并解释为什么顺序不能颠倒。
- 拿到一张 LED 原理图,能在 30 秒内说出"控制引脚是谁"和"什么电平点亮"。
- 能解释限流电阻的作用,并写出其估算公式。
- 能说明灌电流与拉电流的区别,以及为什么多数开发板选择低电平点亮。
- 能画出一个 NPN 低侧驱动 LED 的电路,并说明基极电阻的作用。
- 能说明引入三极管之后,引脚的作用发生了什么本质变化。
本文档依据课程公开目录、原视频页信息及公开学习笔记整理,配合原视频 3-1 使用。