任何芯片在运行时都要和外部通信,GPIO就是芯片CPU和芯片外部的接口,是由芯片内部寄存器控制的一组可编程的外部引脚接口。
从物理层面来说,GPIO 引脚是芯片封装上的金属引脚(或焊盘),直接连接到外部电路。每个引脚内部连着一个可配置的电路单元(输入缓冲器、输出驱动器、上拉/下拉电阻等)。这些电路单元的工作模式由 内部寄存器控制。
从寄存器层面来说,芯片内部有一组GPIO控制寄存器,例如:
方向寄存器(DIR/DDR):配置输入还是输出
数据输出寄存器(ODR):输出高/低电平
数据输入寄存器(IDR):读取引脚电平
功能复用寄存器(AFR/MUX):选择是普通 GPIO 还是外设功能(UART、SPI 等)
上拉/下拉控制寄存器(PUPDR):配置内部上拉/下拉
CPU 修改这些寄存器,就能间接控制引脚的电气行为。
CPU通过寄存器告诉GPIO电路“这个脚是输出还是输入、输出高还是低”,GPIO电路按指令驱动封装引脚(或读取它的状态)。外部电路通过物理连接与芯片交互。
上图的I/O引脚就是芯片引脚,其他部分是GPIO的内部结构。
保护二极管
保护二极管用于保护引脚外部过高或过低的电压输入。当引脚输入电压高于VDD 时,上面的二极管导通,当引脚输入电压低于 VSS 时,下面的二极管导通,从而使输入芯片内部的电压稳定。这样的保护很有限,大电压大电流接入很容易烧坏芯片。在实际的设计中要考虑设计引脚的保护电路。
上拉、下拉电阻
阻值大概在30~50K欧之间,可以通过上、下两个对应的开关控制。当没有外部的上、下拉电压,引脚的电平由引脚内部上、下拉决定。开启内部上拉电阻工作,引脚电平为高;开启内部下拉电阻工作,则引脚电平为低。
如果内部上、下拉电阻都不开启,这种情况就是浮空模式。浮空模式下,引脚的电平是不确定的,引脚的电平可以由外部的上、下拉电平决定。
施密特触发器(Schmitt Trigger)
把输入信号“整形”,产生滞回效应,抑制噪声和毛刺。特别适合处理慢变化或带抖动的信号(比如机械按键、模拟传感器输出)。
输入有两个阈值:上阈值 Vth+、下阈值 Vth−。当输入电压上升到 Vth+ 才切换到高电平;下降到 Vth− 才切换到低电平。中间的小波动不会引起输出反复跳变。
P-MOS管和N-MOS管
这个结构控制GPIO的开漏输出和推挽输出两种模式。
开漏输出:输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻。
推挽输出:两只对称的MOS管每次只有一只导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载拉电流。推拉式输出既能提高电路的负载能力,又能提高开关速度。
GPIO 有八种工作模式,四种输入和四种输出:
1、输入浮空
上拉/下拉电阻断开,施密特触发器打开,输出被禁止。IO口的电平完全由外部电路决定。如果IO引脚没有连接其他的设备,那么检测其输入电平是不确定的。该模式可以用于按键检测等情景。
上拉/下拉输入是给输入端加一个弱电阻,保证没有外部信号时,输入信号不会漂浮。
2、输入上拉
上拉电阻导通,施密特触发器打开,输出被禁止。 当外部没有信号时,输入电平被拉到高电平(逻辑 1)。如果外部拉低(比如开关接地),电阻限制电流,输入变低(逻辑 0)。常用于按钮、开关输入。
3、输入下拉
下拉电阻导通,施密特触发器打开,输出被禁止。当外部没有信号时,输入端被拉到低电平(逻辑 0)。如果外部拉高(接 VDD),输入变高(逻辑 1)。常用于需要默认低电平的开关输入。
4、模拟输入
上下拉电阻断开,施密特触发器关闭,双MOS管也关闭。其他外设可以通过模拟通道输入输出。 该模式下需要用到芯片内部的模拟电路单元单元,用于ADC、DAC、MCO这类操作模拟信号的外设。
5、开漏输出(Open-Drain)
GPIO内部只保留下拉晶体管(N型MOSFET)。晶体管导通,拉到GND时,输出低电平;晶体管断开,输出悬空,此时外部连接一个上拉电阻到VDD,才能得到高电平。开漏输出模式下可以读取IO引脚状态。适合总线型或多设备共用场景。
常见用途:
I²C 总线,SDA/SCL都是开漏输出,多个设备可共享一条总线;高电平由上拉电阻生成,低电平由任意设备拉低
中断/信号线,MCU给外部设备一个信号,但不确定外部电压,开漏可安全连接不同电压域
外部驱动器接口,驱动LED、继电器等外部器件,确保不会短路
6、推挽输出(Push-Pull Output)
P型和N型晶体管同时驱动,输出高电平时P型导通,拉到VDD;输出低电平时N型导通,拉到GND。
常见用途:
普通数字输出,控制MCU内部或外部逻辑电平,如点亮LED、驱动蜂鸣器等
PWM 输出,用于电机控制、灯光调光等
高速信号输出,MCU 内部通信或外设时序信号
直接控制低功耗负载,直接拉高/拉低电压,无需外部上拉电阻
7、开漏式复用功能、推挽式复用功能
普通GPIO输出由CPU写寄存器直接控制引脚高低,复用功能输出由外设模块(例如 UART_DR、I²C_DR)控制,CPU 只能间接干预(或者配置外设寄存器)。
每个复用功能可以设置为推挽输出(Push-Pull)或开漏输出(Open-Drain)。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |