GPIO--单片机连接物理世界的唯一桥梁
2026/9/1 4:50:23 网站建设 项目流程

GPIO(General Purpose Input/Output,通用输入输出)是嵌入式系统中最基础也最核心的接口,可以把它看作是微控制器(如单片机)与外部世界沟通的“数字神经末梢”。

简单来说,它就是一个位于芯片上的物理引脚,你可以通过软件将其配置为输入模式来读取外部信号(如按键是否按下),或配置为输出模式来控制外部设备(如点亮一盏LED灯)。

通过编程,我们可以将芯片的物理引脚配置成输入输出模式,以此来读取外部信号或控制外部设备,控制GPIO本质上是操作芯片内部的一组寄存器,通过向寄存器写入特定的值来配置模式、读取状态或设置输出电平。

GPIO可配置为输出模式和输入模式,由此衍生出8种工作模式。

首先,我们给出GPIO(通用输入输出)引脚的内部标准结构框图

将图用红线切割为上下两部分,图片上半部分:输入路径(读取外部信号),图片下半部分:输出路径与寄存器控制(输出信号)。

1.当引脚作为输入模式时,信号从I/O引脚流入,分两路走:
  • 模拟输入(左上角直通):信号不经过任何数字整形,直接连接到片上的ADC(模数转换器)外设。这对应配置里的模拟输入模式,用于读取电压模拟量。

  • 数字输入(经过施密特触发器):信号先经过TTL肖特基触发器(图中标注),它能把外部缓慢变化或带噪声的模拟信号,整形成边缘陡峭的干净数字信号(0或1)。整形后的信号兵分两路:

    • 一路进入输入数据寄存器IDR),供CPU通过读寄存器指令读取(即GPIO_ReadInputDataBit)。

    • 另一路直接送往片上外设(如UART、TIM、I2C),这对应复用功能输入(引脚作为RX或捕获引脚时使用)。

2.当引脚作为输出模式时,信号从内部流向I/O引脚,核心在于驱动电路:
  • 输出控制核心(P-MOS 和 N-MOS):这是驱动器的功率管,它们串联在VDD和VSS之间,中间节点连接I/O引脚。

    • P-MOS(上管):导通时,引脚被强拉到高电平(VDD)。

    • N-MOS(下管):导通时,引脚被强拉到低电平(VSS)。

  • 输出驱动器控制逻辑:根据你的配置决定谁来控制这对MOS管:

    • 输出数据寄存器(ODR:你通过GPIO_SetBits写入的数据,经由位设置/清除寄存器(BSRR作用后,直接控制MOS管。推挽输出(上下管都工作)和开漏输出(只有下管工作,上管关闭)就是在这里区分的。

    • 复用功能输出:开关切换,让片上的SPI、USART等外设直接接管对MOS管的控制(引脚作为TX或SCK时)。

接下来介绍几种工作模式

1. 推挽输出

注:当GOIO工作在输出模式时,输入电路并非完全切断,还是存在如图示电路,可以通过此电路读取GPIO的状态。

当我们要输出1时,有俩种写入方式,第一种是将位设置寄存器置1,然后写入输出数据寄存器ODR;第二种是直接写输出数据寄存器;随后数据将通过输出电路到达2个MOS管(可以直接将MOS管当作开关),我们要注意输出控制模块中带有反向器,所以现在到达MOS管的信号为0,P-MOS被打开,VDD通向IO引脚输出高电平1。

当我们要输出0时,同样有俩种方式,但需要注意的是,此时需要将清除寄存器置1,其他步骤类似。

我们可以发现倘如芯片向IO口输出1/0时,要形成闭合回路,IO引脚要接入0/1,这样类似与将电流推/挽(push-up),这就是推挽输出。

2. 开漏输出

开漏输出下P-MOS处于关闭状态。

开漏输出下,输出0步骤与推挽输出模式保持一致,但是我们发现,由于P-MOS关闭,输出1无法通过内部电路完成,因此我们通过外接上拉电阻实现输出1的需求,如图

此时,两个MOS管都关闭,内部电路处于高阻态状态,通过上拉电阻可以将IO引脚输出为高电平。

在此工作模式下,两个MOS管共漏连接,此时两个MOS管漏接开路,因此称为开漏输出。

怎么选择推挽输出和开漏输出呢?

(1) 当你的引脚需要主动、强劲地输出高电平和低电平时,选推挽。

  • 内部原理:P-MOS(上管)和N-MOS(下管)交替导通。输出高电平时,P-MOS强力把引脚拉到VDD(如3.3V);输出低电平时,N-MOS强力把引脚拉到GND(0V)。

  • 适用场景

    • 控制数字信号:点亮LED、驱动蜂鸣器、控制继电器(需加三极管/MOS管驱动)。

    • 普通通信接口SPI(SCK, MOSI)UART(TX)、PWM脉宽调制输出。

  • 优点:响应速度快(边沿陡峭),驱动能力强(毫安级电流),抗干扰性好。

(2) 当你的引脚不能主动输出高电平(只能拉低),高电平全靠外部电路决定时,必须选开漏。

  • 内部原理:P-MOS(上管)被强制关闭,只有N-MOS(下管)工作。引脚输出低电平时导通(拉地);想输出高电平时,N-MOS关闭,引脚处于高阻态,必须依赖外接的上拉电阻把电平拉高。

  • 适用场景(极其重要)

    • 多主机通信总线(必须):典型就是I2C(SCL, SDA)。因为总线上可能挂多个设备,开漏模式配合上拉电阻,能实现“线与”逻辑(只要有一个设备拉低,总线就是低),避免推挽模式下两个设备一个输出高、一个输出低导致的电源短路烧毁

    • 电平不匹配(总线电平转换):当你的主控是3.3V,但外设是5V且引脚耐压为5V容忍(FT)时,上拉电阻接到5V。开漏模式下,低电平主控能拉低(0V),高电平由5V上拉提供,实现了逻辑电平的灵活转换,无需电平转换芯片

    • 共享总线(多个输出共用一根线):类似LED点阵的行列扫描,或者多路报警信号共用一个中断引脚(谁拉低谁触发)。

什么时候坚决避开开漏输出(高速场景)

  • 高速通信(如SPI频率>1MHz,或UART高波特率):开漏输出的高电平是靠外接电阻“慢悠悠”充电上去的(RC延迟),边沿非常平缓。如果用于SPI或高速UART,会导致波形失真、通信失败。推挽输出的上升沿是P-MOS瞬间充上去的,速度极快。

3. 复用输出功能

“复用输出功能”,简单来说,就是把这个GPIO引脚的控制权,从你写的软件(CPU)手里,移交给芯片内部的其他硬件外设(如串口、定时器、SPI)。此时信号来源于芯片外部外设。

它与“通用输出”的本质区别(谁在控制?)

  • 通用输出(GPIO_OUT)软件控制。你调用GPIO_SetBits(),CPU向“输出数据寄存器(ODR)”写1,引脚就输出高电平。电平怎么变,完全由你的代码顺序决定。

  • 复用输出(AF_OUT)硬件控制。配置好后,CPU不再干预引脚电平。引脚的电平完全由片上外设(如USART的发送器、定时器的PWM波形发生器)自动产生。电平怎么变,由外设的硬件逻辑决定。

复用输出依然延续之前的选择逻辑,分为两种:

  • 复用推挽输出绝大多数外设选这个。用于UART(TX)SPI(SCK, MOSI)PWM(定时器输出)。因为这些需要快速的边沿跳变(高→低瞬间完成)和强驱动能力。

  • 复用开漏输出只有特定总线选这个。主要用于I2C(SCL, SDA)。因为I2C协议要求多设备“线与”,必须配合外部上拉电阻。

4. 输入模式

如图为输入模式框图,此处施密特触发器作用是除去边缘毛刺。

当I/O端口配置为输入时:

● 输出缓冲器被禁止

● 施密特触发输入被激活

● 根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接

● 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器

● 对输入数据寄存器的读访问可得到I/O状态

当内部电路处于不同状态时,处于不同工作状态

  • 浮空输入:两个开关都断开,引脚内部是“悬空”的。

  • 上拉输入:连接VDD(高电平)的开关闭合,引脚内部被电阻拉到高电平。

  • 下拉输入:连接VSS(地)的开关闭合,引脚内部被电阻拉到低电平。

如何选择输入模式?

选择浮空、上拉还是下拉输入,核心原则只有一条:看外部电路已经帮你把电平“固定”成什么样了,内部电阻的作用是“补充”而非“对抗”。

秒选指南(按场景匹配)

外部电路特征首选模式为什么?
外部信号源驱动能力很强,能稳定输出明确的高/低电平(如另一个MCU的推挽输出、逻辑门电路)浮空输入外部电平足够强,无需内部电阻多此一举。而且关闭内部电阻最省电(无静态电流消耗)。
外部设备只在“按下/触发”时输出低电平(0V),未触发时引脚处于“悬空”状态(如按键接地)上拉输入未触发时,内部电阻将电平拉高(默认为1);触发时,引脚被外部强行拉低(0)。完美实现“低电平有效”检测。
外部设备只在“按下/触发”时输出高电平(VDD),未触发时引脚处于“悬空”状态(如按键接电源)下拉输入未触发时,内部电阻将电平拉低(默认为0);触发时,引脚被外部强行拉高(1)。完美实现“高电平有效”检测。
通信总线处于空闲状态,但协议要求空闲时必须为确定电平(如某些单总线协议)上拉或下拉根据协议要求,选择内部电阻确保总线空闲时不会乱跳。
模拟输入

当I/O端口被配置为模拟输入配置时:

● 输出缓冲器被禁止;

● 禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置为’0’;

● 弱上拉和下拉电阻被禁止;

● 读取输入数据寄存器时数值为’0’。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询