聊聊GPIO 工作模式

嵌入式开发中,GPIO(General-Purpose Input/Output)是最基础也最常用的功能模块之一。你可以把它想象成微控制器伸出来的无数根"手脚":既可以用它输出 信号去点亮LED、驱动外设,也可以用它输入信号来检测按键、读取传感器状态。

输出模式-主动出击

1)推挽输出 (Push-Pull Output)

Plain 复制代码
      VDD(3.3V)
        │
        ├───[PMOS]───┐
        │            │
        │            ├───● GPIO引脚
        │            │
        └───[NMOS]───┘
        │
       GND(0V)

工作原理:

  • 输出高电平(1):PMOS打开,NMOS关闭 → 引脚接电源VDD(3.3V)
  • 输出低电平(0):NMOS打开,PMOS关闭 → 引脚接地GND(0V)

使用场景:控制LED灯、数字信号输出

2)开漏输出 (Open-Drain Output)

Plain 复制代码
       VDD(内部无连接!)
        │
        │
        X ← [PMOS被拆除]
        │
        └───[NMOS]───● GPIO引脚
        │
       GND

工作原理

  • 输出低电平:NMOS打开 → 接地
  • 输出高电平:NMOS关闭 → 悬空(高阻态)→ 必须外接上拉电阻到VDD才能输出高电平

使用场景:I²C/SMBus 总线 (多设备共享线路)、驱动高压设备 (外接上拉到 5V/12V)、多主机通信

输入模式-竖起耳朵听

1)浮空输入 (Floating Input)

Plain 复制代码
       VDD
        │
        │
        X ← 无内部上拉
        │
GPIO引脚 ┼───● 输入检测电路
        │
        X ← 无内部下拉
        │
       GND
  • 引脚完全断开内部电阻
  • 电平状态完全由外部电路决定

必须使用场景:ADC 模拟信号采样

2)上拉/下拉输入 (Pull-up/Pull-down Input)

Plain 复制代码
上拉输入结构:

       VDD
        │
        │
        R(≈40kΩ)← 内部上拉电阻
        │
GPIO引脚 ┼───● 输入检测电路
        │
        X
        │
       GND
下拉输入结构:

       VDD
        │
        │
        X
        │
GPIO引脚 ┼───● 输入检测电路
        │
        R(≈40kΩ)← 内部下拉电阻
        │
       GND

工作原理

  • 上拉输入:无外部信号时默认高电平(3.3V)
  • 下拉输入:无外部信号时默认低电平(0V)

按键检测:按键接地型电路、按键接VCC型电路

注意

  1. 开漏输出必须外接上拉电阻:阻值依总线速度和功耗选择 (常用 4.7KΩ)
  2. 推挽输出禁止并联:会导致 VDD-GND 短路损坏MOS管
  3. 输入电平容限:
    1. 5V容忍引脚:可承受 5V 输入
    2. 非容忍引脚:输入电压 ≤ VDD+0.3V
  4. 模式切换:读输入前需切换为输入模式(尤其输出转输入时)
  5. 静电防护:未使用引脚设为下拉/推挽输出低电平
相关推荐
天天爱吃肉8218几秒前
交叉表格与卡方检验:新能源汽车研发测试中的分类变量关联性分析实战
人工智能·python·嵌入式硬件·机器学习·分类·数据挖掘·汽车
MAR-Sky1 分钟前
STC8H1K08简单点亮LED的过程记录和分析
单片机·stc8系列·简单测试记录
oioihoii2 分钟前
博客与短视频谁更能成就你的个人品牌?
c++
嵌入式学习和实践5 分钟前
XHSC(小华)单片机 — HC32F460基础点灯工程
单片机·hc32f460
仰泳的熊猫6 分钟前
题目1109:Hanoi双塔问题
数据结构·c++·算法·蓝桥杯
七夜zippoe8 分钟前
Cython终极性能优化指南:从Python到C++的混合编程实战
c++·python·macos·cython·类型系统·内存视图
lingzhilab23 分钟前
零知IDE——零知标准板+INA219电流传感器的锂电池智能充放电监测系统
ide·stm32·单片机
项目題供诗25 分钟前
C语言基础(七)
c语言·开发语言
优雅的潮叭9 小时前
c++ 学习笔记之 shared_ptr
c++·笔记·学习
SunkingYang9 小时前
QT中使用Lambda表达式作为槽函数用法,以及捕获列表和参数列表用法与区别
c++·qt·用法·lambda表达式·捕获列表·槽函数·参数列表