聊聊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. 静电防护:未使用引脚设为下拉/推挽输出低电平
相关推荐
贾亚超3 小时前
【STM32外设】DAC
stm32·单片机·嵌入式硬件
明天见~~4 小时前
硬件基础:串口通信
嵌入式硬件
黑客思维者4 小时前
《我是如何用C语言写工控系统的漏洞和Bug》连载(1)内容大纲
c语言·bug·工控漏洞
mit6.8244 小时前
并查集|栈
c++
中国胖子风清扬5 小时前
Rust 序列化技术全解析:从基础到实战
开发语言·c++·spring boot·vscode·后端·中间件·rust
j_xxx404_5 小时前
数据结构:栈和队列力扣算法题
c语言·数据结构·算法·leetcode·链表
南莺莺5 小时前
假设一个算术表达式中包含圆括号、方括号和花括号3种类型的括号,编写一个算法来判别,表达式中的括号是否配对,以字符“\0“作为算术表达式的结束符
c语言·数据结构·算法·
sheepwjl5 小时前
《嵌入式硬件(三):串口通信》
网络·嵌入式硬件·网络协议·串口通信
岁忧5 小时前
(LeetCode 面试经典 150 题) 200. 岛屿数量(深度优先搜索dfs || 广度优先搜索bfs)
java·c++·leetcode·面试·go·深度优先
一枝小雨6 小时前
【OJ】C++ vector类OJ题
数据结构·c++·算法·leetcode·oj题