GPIO 是什么?

GPIO 是什么?

  • 1.引言
  • 2.基础认知
  • 3.I/O端口位的基本结构
  • 4.保护电路
    • 三种工作场景
      • [场景 1:正常工作(引脚电压在 VSS ~ VDD 之间)](#场景 1:正常工作(引脚电压在 VSS ~ VDD 之间))
      • [场景 2:引脚出现**过高电压**(高于 VDD+0.7V,静电 / 浪涌)](#场景 2:引脚出现过高电压(高于 VDD+0.7V,静电 / 浪涌))
      • [场景 3:引脚出现**负压**(低于 VSS-0.7V,负静电)](#场景 3:引脚出现负压(低于 VSS-0.7V,负静电))
  • 5.输出模式
    • [5.1 工作模式](#5.1 工作模式)
    • [5.2 输出原理](#5.2 输出原理)
  • 6.输入模式
    • [6.1 工作模式](#6.1 工作模式)
    • [6.2 工作原理](#6.2 工作原理)
  • 7.结语

1.引言

本文目标:

  • 知道GPIO及其原理
  • GPIO的输入模式
  • GPIO的输出模式

2.基础认知

GPIO 全称:General Purpose Input/Output,中文含义就是通用输入/输出 的意思。本质上,就是MCU内部,用来做输入输出的控制器电路。

这种图展示了板子的全貌, 红色方框框起来的部分,就是MCU,GPIO就在其内部。

GPIO输入输出的是什么?

高低电平。在语言层面上,就是0/1。

输入输出高低电平的目的是什么?

控制外设。比如:

  • 点亮 LED
  • 读取按键
  • 控制蜂鸣器、继电器
  • 与传感器或外设通信

为什么叫通用?

我们已经知道了GPIO是位于MCU内部的,但是MCU内部可不止GPIO这么一个组件的,还有很多组件,它们也需要输入输出高低电平来控制外设。

那么,它们是通过什么来进行输入输出高低电平呢?难道是独属于自己的输入输出控制电路吗?当然不是,这样做势必会增加复杂度,无疑增加了MCU的成本和功耗。所以,这些组件都是通过GPIO来完成输入输出的,因此,叫通用。

下面我们进一步理解。

上图是从数据手册中截取的STM32F103xC、STM32F103xD和STM32F103xE增强型模块框图。

我们看到,有GPIO port A、GPIO port B......GPIO port G。这些都是GPIO的不同端口,也可以理解为分组,内部结构是一样的。

同时,每一组GPIO还对应了一组引脚PIN,比如GPIO port A对应PA0到PA15。

这里补充介绍一下什么是引脚。

引脚(pin),就是芯片、开发板上伸出来的金属触点 / 金属针,是芯片和外部电路交换电信号的接口。

GPIOA 到 GPIOG 的关系,可以类比成"楼栋和房间号":

  • GPIOA、GPIOB、GPIOC 是不同楼栋,每栋楼里有很多个房间
  • PA0、PB0、PC0是具体房间号
    需要注意的是,并不是每一款芯片都有 GPIOA 到 GPIOG,也不是每一组都一定有 16 个完整引脚。具体有哪些 GPIO 端口、每个端口有哪些可用引脚,要以芯片手册和开发板原理图为准。

我们知道了GPIO port 和 GPIO pin 的关系,那么我们现在将聚焦于:在硬件电路上,是怎么通过引脚来进行输入输出的。

3.I/O端口位的基本结构

I/O 端口位,可以简单理解成一组 GPIO(一个 Port)里面对应的那一个引脚 。比如 GPIOA 这一组,PA3 就是 GPIOA 端口的第 3 个端口位,对应物理引脚 PA3。

这张图的上半部分是输入,下半部分是输出,右边是保护电路。

4.保护电路

这个电路叫做双二极管钳位保护电路。

IO 引脚点同时接了两个保护二极管:

  • 上二极管 :阳极接 IO 引脚,阴极接VDD(电源)
  • 下二极管 :阴极接 IO 引脚,阳极接VSS(接地,0V)

二极管特性:正向压差大约 0.7V(硅管),也就是说,当阳极电压比阴极高 0.7V 时才导通。

三种工作场景

场景 1:正常工作(引脚电压在 VSS ~ VDD 之间)

IO 引脚电压在正常范围,两个二极管全都截止,不工作 。

二极管相当于开路,不会影响 GPIO 原本的输入 / 输出功能。

这是绝大多数时候的状态,保护电路 "隐身",不干扰 IO。

场景 2:引脚出现过高电压(高于 VDD+0.7V,静电 / 浪涌)

IO 引脚电压 > VDD+0.7V → 上方二极管正向导通 。

多余的电荷会通过这个二极管泄放到VDD电源轨,把引脚电压钳位在 VDD+0.7V 左右,不让电压继续升高,保护后面内部的 MOS 管。

需要注意的是:

  • 这个电路是在MCU内部的。
  • 只能抗短时间静电脉冲,不能扛持续高压!如果长期接入 5V(3.3V MCU),这个保护二极管会持续导通发热,直接烧毁MCU。
  • 它没有限流能力,如果外部电源直接灌入大电流,依然会损坏MCU。

场景 3:引脚出现负压(低于 VSS-0.7V,负静电)

IO 引脚电压 < VSS-0.7V → 下方二极管正向导通 。

引脚的负电压通过二极管泄放到VSS地轨,把引脚电压钳位在 VSS-0.7V 附近,防止负压击穿内部器件。

总的来说,双二极管钳位保护电路,利用二极管单向导电性,把 IO 引脚电压强制限制在 VSS-0.7V,VDD+0.7V 区间,吸收静电等短暂脉冲高压,保护 GPIO 内部电路。

5.输出模式

这张图,只保留了输出部分的结构。

5.1 工作模式

GPIO的输出模式:

  • 通用推挽输出
  • 通用开漏输出
  • 复用推挽输出
  • 复用开漏输出

先暂且不论这些模式都是什么,我们后面会逐个讲解。先搞清楚一个问题------为什么GPIO会有这么多IO模式?

首先,GPIO不只是给ARM-CPU直接做输入输出的,也会被其他片上外设使用,换句话说,GPIO是"大家的"。

可是,其他片上外设,怎么用GPIO?什么时候用GPIO?事先GPIO完全不知道,所以GPIO就必须把自己的IO功能做得更通用一些,结果就是有好多种输入输出模式。

这里解释一下通用和复用的意思。

  • 所谓通用,就是通常使用,指的是由ARM-CPU直接控制GPIO输出。
  • 所谓复用,意思就是重复使用,指的是MCU内部的片上外设,复用GPIO进行输入输出。

下面,我们讲讲输出原理。

5.2 输出原理

下面我们简化一下。

简化的点:

  • 寄存器是多位的,但是为了减少理解成本,只保留一个比特位。

复用器是什么?

多个输入,经过复用器的选择,最终只让其中一个输入传到输出。它本质就是一个电子选择开关。

举个生活中的例子。

假设有 3 路信号:

信号A ──┐

信号B ──┤

信号C ──┤──→ 复用器 ──→ 输出

│

选择信号

复用器根据"选择信号"决定谁能通过:

选择A → 输出 = 信号A

选择B → 输出 = 信号B

选择C → 输出 = 信号C

我们要知道,一个引脚可能承担很多功能。这点很重要,先记住,后面解释。

复制代码
             ┌─ GPIO输出数据
             │
             ├─ USART
             │
             ├─ SPI
             │
             ├─ TIM/PWM
             │
             └─ 其他外设
                  ↓
                复用器
                  ↓
                I/O引脚

复用器负责从这些信号中选择一个,决定这个GPIO引脚,到底由GPIO本身控制,还是由其他片上外设控制。

为什么需要复用器?

因为 MCU 的引脚数量是有限的。

比如一个MCU只有 64 个引脚,但内部可能有:

  • UART
  • SPI
  • I²C
  • 定时器
  • GPIO
  • ADC
  • CAN

如果每个功能都单独占一个引脚,根本不够用。

所以让一个引脚承担多个功能:

复制代码
    GPIO ──────┐
    UART ──────┤
    SPI  ──────┤
    PWM  ──────┤
    I²C  ──────┤
               ↓
             复用器
               ↓
             一个引脚

然后通过复用功能配置决定当前使用哪个功能。

输出控制是什么?

输出控制就是用来控制MOS管什么时候导通、什么时候关闭的硬件电路。

复用器已经决定谁来控制这个引脚,但最终怎么把这个信号变成真正的电压输出,是输出控制电路负责的。

输出控制电路通过控制 P-MOS 和 N-MOS 的导通与关闭,实现推挽输出、开漏输出和关闭输出(高阻态)。

P-MOS和N-MOS是什么?

由电压控制的电子开关。

最关键的一点是:

P-MOS负责把I/O往VDD(高电平)方向拉,N-MOS负责把I/O往VSS/GND(低电平)方向拉。

复制代码
         VDD
          │
       ┌──────┐
       │ P-MOS│
       └──┬───┘
          │
          ├──────── I/O
          │
       ┌──┴───┐
       │ N-MOS│
       └──┬───┘
          │
         GND

P-MOS导通,I/O输出高电平;N-MOS导通,I/O输出低电平。

这就是推挽输出 ,一个负责向上拉,一个负责向下拉。所以,叫推挽(Push-Pull)。

开漏输出则没有P-MOS,只有N-MOS。

  • N-MOS导通时,把I/O往低电平方向拉,所以输出低电平。
  • N-MOS关闭时,相当于开路,输出高阻态。

因为N-MOS管它没有能力主动把I/O拉高,所以通常需要外部上拉电阻,相当于:

复制代码
VDD
│
电阻
│
I/O ─────
 │
N-MOS
 │
GND

这样,当N-MOS导通时,上拉电阻把I/O拉到高电平。

这就是开漏。

现在,我们可以把整个GPIO输出部分串起来。

复制代码
       	输出数据寄存器
              │
              ↓
           ┌───────┐
外设  ──→   │ 复用器 │
	       └───┬───┘
	           ↓
	        输出控制
	          │
        ┌─────┴─────┐
        ↓           ↓
      P-MOS       N-MOS
        │           │
       VDD         GND
        │           │
        └─────┬─────┘
              ↓
             I/O
  • 输出数据寄存器:存要输入的数据(0/1)。
  • 复用器:决定到底由GPIO还是片上外设提供控制信号。
  • 输出控制:决定两个MOS管什么时候开、什么时候关。
  • P-MOS:向上拉,把I/O接到VDD,也就是拉到高电平。
  • N-MOS:向下拉,把I/O接到GND,也就是拉到低电平。

还有一个问题:能不能同时导通P-MOS和N-MOS?

不能。

如果P-MOS和N-MOS同时导通,那么将会形成一条从 VDD → P-MOS → N-MOS → GND 的直接通路,这相当于把 VDD 和 GND 直接短接,会产生很大的电流。

至此,输出讲完了。

6.输入模式

这张图,只保留了输入部分的结构。

6.1 工作模式

GPIO的输入模式:

  • 上拉输入
  • 下拉输入
  • 浮空输入
  • 模拟输入

模拟输入暂且不讲。

另外,前面在讲输出模式的时候,解释了为什么有这么工作模式,输入和输出是一个道理的,这里就不在赘述。

6.2 工作原理

什么是施密特触发器?

一种带"迟滞"的输入电路,用来把不干净、变化缓慢、带噪声的模拟电压,转换成稳定的数字 0/1。

为什么需要施密特触发器?

因为输入信号不一定是规则的,它有可能是这样:

信号在某个电压附近上下波动。

如果普通数字输入电路的判断门槛是:高于图中横向电压值的为1,低于图中横向电压值的为0。

那么,信号在横向附近晃动时,一会儿是1一会儿又是0。导致输出很不稳定,这就是噪声导致的误触发。

施密特触发器规定了正向阈值电压VT+和负向阈值电压VT-,这两个电压之间就是迟滞区域。

  • 电压从低往高升,必须超过正向阈值电压才认为 0->1。
  • 电压从高往低下降,必须低于负向阈值电压才认为 1->0。

所以,在正向阈值电压附近抖动的信号,不会从1->0,而是保持了原来的状态。在负向阈值电压附近抖动的信号,同理。

所以,施密特触发器就起到了整形、抗噪声的作用。

下面我们讲输入模式。

记住一句话:

上拉、下拉解决的是,当外部没有明确给GPIO一个高/低电平时,GPIO到底应该默认是1还是0。

GPIO作为输入端的时候,它本身不主动输出高低电平。如果引脚什么都没接,那么这个引脚就处于一种浮空状态 。

它的电压可能受到:

  • 电磁干扰
  • 周围信号
  • 人体触摸

等影响。于是可能出现 0 → 1 → 0 → 1 → 1 → 0 ...

所以我们需要给它一个默认状态,这就是上拉和下拉的作用。

上拉输入就是把上面的开关导通。这样,就算外部没有任何输入的情况下,VDD也会把GPIO的电压拉高。也就是说,上拉输入默认是高电平。

下拉输入就是把下面的开关导通。这样,就算外部没有任何输入的情况下,VSS也会把GPIO的电压拉到0V。也就是说,下拉输入默认是低电平。

浮空输入就是把这两个开关都断开,GPIO 输入端既没有被上拉,也没有被下拉,而且外部也没有提供确定的电平。

总结一下:

输入模式 默认状态 原因
上拉输入 1 电阻把 GPIO 拉向 VDD
下拉输入 0 电阻把 GPIO 拉向 GND
浮空输入 不确定 没有确定的电平来源

一个问题------为什么一定要用"电阻",而不是直接接 VDD?

因为接通外部电路后,VDD直接与GND直连,会产生很大的电流,可能会破坏电路。电阻的存在,可以减小电流。

至此,输入也讲完了。

7.结语

如有问题,恳请指出,谢谢!

相关推荐
剑指offer.2 小时前
ARM裸机开发-SPI
arm开发·嵌入式硬件·嵌入式·arm
修船大队长3 小时前
配置接受报文每个报文对应一个mailbox配置流程记录
网络·单片机·mcu
搁浅小泽5 小时前
二极管选型技术规范
单片机·嵌入式硬件·汽车
搁浅小泽5 小时前
电感选型技术规范
单片机·嵌入式硬件·汽车
..Dauntless..5 小时前
【stm32】串口——在MCU内部的工作过程
stm32·单片机·嵌入式硬件
lzqrzpt6 小时前
临沂LED驱动电源工程选型标准与工艺对比解析
python·单片机·嵌入式硬件·物联网
小黄蚁6 小时前
使用LVGL模拟示波器创建正弦函数波形
单片机·学习
hahaha60166 小时前
黑体轨迹和色温--光源白点
人工智能·嵌入式硬件·算法·计算机视觉
Code_Solitude9 小时前
开发板点灯实验源码
stm32·单片机·嵌入式硬件