从 MCU 的一个 GPIO 引脚出发,看它如何点亮 LED、驱动蜂鸣器、切换继电器、放大三极管、斩波 MOS 管——并理解背后那个最简"按键翻转"程序的执行流程。
STM32 的 GPIO 只能直接输出 ±25 mA 左右的电流,且电压固定在 0 / 3.3V。要点亮 5 mA 的 LED 还凑合,但要驱动蜂鸣器、继电器、电机、LED 灯带、加热丝……几乎都需要"驱动级"。于是我们引入三极管、MOS 管来放大电流、隔离电压,再用蜂鸣器、继电器这些"执行器"完成最终的物理输出。
LED · 最简单的光输出
电流放大 · 中等负载驱动
电压控制 · 大电流斩波
有源/无源 · 声音输出
电气隔离 · 高低压切换
LED 本质是一个 PN 结。当 N 区接高电平、P 区接低电平,正向偏置时电子与空穴在结区复合,多余能量以光子形式释放,从而发光。颜色由半导体材料决定(红/黄/绿/蓝/白)。
作为状态指示灯:电源指示、运行指示、故障告警、人机交互反馈。亮度由流过 LED 的电流决定(3 mA 微亮、20 mA 高亮)。
NPN 三极管有 B(基极)、C(集电极)、E(发射极) 三极。当 VBE ≈ 0.7V 时,BE 结导通,产生基极电流 IB;集电极电流 IC = β · IB。MCU 给出几 mA 的 IB,就能"开闸"放出几百 mA 给负载——这是"以小控大"。
用极小的 MCU 信号驱动电流较大的器件。蜂鸣器(30 mA)、继电器线圈(70 mA)、小电机都靠它来"续命"。
MOSFET 是电压控制器件——栅极(G)相对于源极(S)电压 VGS 超过阈值 Vth 时,氧化层下感应出 N 型反型层,漏极(D)与源极之间形成"沟道",电流导通。
与三极管的关键区别:栅极几乎不取电流(只充放电容),所以 MCU 可以轻松驱动;导通电阻极小(15N10 典型 10 mΩ@VGS=10V),几乎不发热。
内部由线圈、磁铁、振动膜片组成。通电后线圈产生交变磁场驱动膜片振动发声。
蜂鸣器工作电流 10–30 mA,接近 MCU 单引脚 25 mA 上限,且长期满载会损伤 MCU 内部 MOSFET。所以工程中一律用 NPN 做低边开关,蜂鸣器接 5V,单片机只负责给基极一个 mA 级的控制信号。
继电器由线圈和触点两部分组成,靠磁场隔空"拉"一个金属簧片。线圈通电 → 产生磁力 → 衔铁吸合 → 公共端(COM)从常闭(NC)打到常开(NO)。
把 5 种输出电路放在同一张原理图里:从 PA15 输出的控制信号,经过 LED 直驱、NPN 三极管电流放大、N-MOS 大电流开关,再驱动 5V 有源蜂鸣器、声光报警组合以及继电器控制输出。实际接线时,只需把任意一路的控制端接到 PB12,程序即可统一控制。
演示程序是"按键翻转输出"——每按一次 KEY(PB11),PB12 的电平就翻转一次。这个动作可以作为控制上述 5 种输出器件的统一接口:把 PB12 接到任意一个的驱动端,行为完全一致。
| 引脚 | 方向 | 功能 |
|---|---|---|
| PB11 | INPUT | 用户按键 KEY(上拉,按下 = 低) |
| PB12 | OUTPUT | 推挽输出,连接到 5 种负载的驱动端 |
| HSE | — | 外部 8 MHz 晶振 × 9 = 72 MHz 系统时钟 |
时钟树:HSE 8M → PLL ×9 → SYSCLK 72M → AHB 72M / APB1 36M / APB2 72M。
/* main.c · 主循环:按键翻转 PB12 */ while (1) { // ① 检测 KEY 是否被按下(PB11 == RESET = 低电平) if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET) { // ② 按键消抖:等待 10 ms 后再读一次 HAL_Delay(10); // ③ 确认仍然按下(不是抖动) if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET) { // ④ 等待按键松开(防止长按连续触发) while (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET); // ⑤ 松开后翻转 PB12 → 驱动端切换状态 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12); } } }
PB11 平时为高电平(内部上拉),按下按键后变为低电平。整个程序运行在 while(1) 主循环中,按住按钮再松开,完整跑一遍循环体的 5 个步骤:检测 → 消抖 → 确认 → 等待松开 → 翻转输出,然后回到循环顶部。PB12 的电平变化同时驱动右侧的红色 LED 和蜂鸣器仿真。
按住按钮模拟按下(PB11 → LOW),松开后触发翻转。流程图与 LED / 蜂鸣器仿真会同步响应。
按住不放,松开后触发一次翻转