据说能将处理器的GPIO(General Purpose Input and Output)内部结构和各种模式彻底弄清楚的人并不多?那现在就让多一点
GPIO的功能,简单说就是可以根据自己的需要去配置为输入或输出。但是在配置GPIO管脚的时候,常会见到两种模式:开漏(open-drain,漏极开路)和推挽(push-pull)。
首先,了解GPIO结构里面的三个重要组成部分,如下图所示
s
顾名思义,PUSH-PULL中所谓PUSH指的是把输出推到电路的VDD电压,所谓Pull指的是将输出拉到Ground电压。
Simplified schematic of a push-pull output如上图所示,可以看出是由一对PMOS和NMOS组成了一个简单的Push-Pull结构,具体的原理如下:
如图所示,可以看出开漏输出电路是由一个N沟道MOS管组成的,当NMO管导通时,电路通过NMOS管将输出拉低至GND;当NMOS管关闭时,电路输出管脚浮空。
Schematic of an open drain output开漏输出电路一般用于通信接口,该通信接口下同时挂着n多个devices(比如I2C结构),如上图所示,当Internal signal信号输入高电平的情况下,NMOS管导通,输出被拉低到低电平状态;当Internal signal信号输入低电平的情况下,NMOS管截至,输出高阻态(高阻态、三态、浮空都表示一个意思),此时电路对外没有展示出任何驱动能力,此时可以在外部接一个上拉电阻来实现输出高电平。
【open-drain和push-pull的总结】
对于GPIO的模式的设置,在不考虑是否需要额外的上拉电阻的情况下,是设置为open-drain还是push-pull,说到底,还是个权衡的问题:
如果你想要电平转换速度快的话,那么就选push-pull,但是缺点是功耗相对会大些。
如果你想要功耗低,且同时具有“线与”的功能,那么就用open-drain的模式。(同时注意GPIO硬件模块内部是否有上拉电阻,如果没有,需要硬件电路上添加额外的上拉电阻)[1]
输入浮空、输入上拉、输入下拉、模拟输入
开漏输出、开漏复用功能、推挽输出、推挽复用功能
2MHz
10MHz
50MHz
1、GPIO输入工作模式---输入浮空模式
浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。
详细的说:
(1)首先,外部电路通过I/O端口输入电平,外部电平通过上下拉部分(浮空模式下都关闭,既无上拉也无下拉电阻)传输到施密特触发器(此时施密特触发器为打开状态)
(2)外部电平在经过施密特触发器之后继续传输到输入数据寄存器IDR(Input Data Register)
(3)CPU通过读输入数据寄存器实现读取外部输入电平值的目标,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。
2、GPIO输入工作模式---输入上拉模式
上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。
和输入浮空模式相比较,外部输入通过上拉电阻,施密特触发器存入输入数据寄存器IDR,被CPU读取。但是不同之处在于:
(1)内部有一个上拉电阻连接到VDD(输入上拉模式下,上拉电阻开关接通,阻值约30-50K)(2)但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在高电平;并且在I/O端口输入为低电平的时候,输入端的电平也还是低电平。
3、GPIO输入工作模式---输入下拉模式
上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。
和输入浮空模式相比较,外部输入通过上拉电阻,施密特触发器存入输入数据寄存器IDR,被CPU读取。但是不同之处在于:
(1)内部有一个下拉电阻连接到VSS(输入下拉模式下,下拉电阻开关接通,阻值约30-50K)(2)但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在高电平;并且在I/O端口输入为低电平的时候,输入端的电平也还是低电平。
4、GPIO输入工作模式---输入模拟模式
上拉和下拉部分均为关闭状态(AD转换-模拟量转换为数字量),施密特触发器为截止状态,I/O端口的模拟信号直接通过模拟输入通道输入到CPU,IO口外部电压为模拟量(电压形式非电平形式),作为模拟输入范围一般为0~3.3V
5、GPIO输出工作模式---开漏输出模式
开漏输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值,途经N-MOS管,最终输出到I/O端口。
具体过程如下:
CPU写入位设置/清楚寄存器BSRR,映射到输出数据寄存器ODR,联通到输出控制电路(也就是ODR的电平),ODR电平通过输出控制电路进入N-MOS管。
(1)-ODR输出1:
(2)-ODR输出0:
6、GPIO输出工作模式----开漏复用输出模式
开漏复用输出模式,与开漏输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。
与开漏输出模式唯一的区别在于输出控制电路电平的来源
7、GPIO输出工作模式3-推挽输出模式
与开漏输出相比较,输出控制寄存器部分相同,输出驱动器部分加入了P-MOS管部分
(1)当输出控制电路输出1时:
P-MOS管导通N-MOS管截止,被上拉到高电平,IO口输出为高电平1
(2)当输出控制电路输出0时:
8、GPIO输出工作模式4-复用推挽输出模式
与推挽输出模式唯一的区别在于输出控制电路之前电平的来源
1、GPIO用作开关