GPIO输入与输出设置

GPIO输入与输出设置

GPIO(也称为通用输入/输出)是控制器中最简单也是最重要的配置。但即便如此,IO也有各种各样的类型和配置选项,有输入,输出,上拉,下拉,推挽等。虽然我们天天都和它打交道,但是你真的了解其中的配置吗?

输入模式

通常,GPIO输入主要通过以下三种方式之一进行配置:

● 高阻抗(Hi-Z,也称为浮动floating)

● 上拉(Pull-up,内部电阻连接到VCC)

● 下拉(Pull-down,内部电阻连接到地)

当Input port被处在高阻抗的模式下,若没有外部讯号源进来的话,此时是无法确定port的状态(不能确定现在处在高电位或低电位),除非有外部讯号来驱动电路。换句话说,Input floating,这个Input电位状态完全是由外部讯号来决定,没有讯号驱动的话,就会呈现高阻抗状态。

如果我们需要这个port有一个明确的预设状态时,必须借助pull-up(pull-down)resistor来做调整,在pull-up resistor(pull-up外接高电压,pull-down通常会接地)的作用之下,让port的维持在明确的高电压状态(pull-down则是让port维持在低电压状态)。

至于具体电阻的大小,一般在芯片手册中都有详细的描述。在实际配置中,除了要考虑port口内的上下拉电阻大小,还需要考虑MCU外围电路所带来的影响。

输出模式

GPIO的输出模式,常见的有开漏输出(Open-Drain)、推挽输出(Push-Pull)与开集输出(Open-Collector)。其中开漏输出和开集输出,这两种输出的原理和特性基本是类似的,区别在于一个是使用MOS管,其中的"漏"指的就是MOS管的漏极;另一个使用三极管,其中的"集"指的就是三极管的集电极。这两者其实都是和推挽输出相对应的输出模式,由于使用MOS管的情况较多,很多时候就用"开漏输出"这个词代替了开漏输出和开集输出。

推挽输出:一般是指两个MOSFET分别受两互补信号的控制,总是在一个MOS管导通时另一个MOS管截止。(推挽输出的最大特点是可以真正的输出高电平和低电平,且两种电平下都有驱动能力)。

推挽输出的简化原理图

Push - 当连接到晶体管栅极的内部信号(见上图)设置为低逻辑电平(逻辑0)时,PMOS晶体管被激活,电流从VDD流到输出引脚。NMOS晶体管无效(开路)且不导通。

Pull - 当连接到晶体管栅极的内部信号被设置为高逻辑电平(逻辑1)时,NMOS晶体管被激活(闭合)并且电流开始从输出引脚流到GND。同时,PMOS晶体管无效(开路)且不导通电流。看起来推挽输出十分完美,对高低电平都有相当不错的输出能力。但推挽输出的一个缺点是,如果当两个推挽输出结构相连在一起,一个输出高电平,即上面的MOS导通,下面的MOS闭合时;同时另一个输出低电平,即上面的MOS闭合,下面的MOS导通时。电流会从第一个引脚的VCC通过上端MOS再经过第二个引脚的下端MOS直接流向GND。整个通路上电阻很小,会发生短路,进而可能造成端口的损害。这也是为什么推挽输出不能实现" 线与"的原因。

开漏输出:顾名思义,就是从MOSFET的漏极输出的电路,要得到高电平状态需要加上拉电阻才行。适合做电流型的驱动,其吸收电流的能力比较强(开漏输出最主要的特性就是高电平没有驱动能力,需要借助外部上拉电阻才能真正输出高电平)。

开漏输出的这一特性一个明显的优势就是可以很方便的调节输出的电平,因为输出电平完全由上拉电阻连接的电源电平决定。所以在需要进行电平转换的地方,非常适合使用开漏输出。

开漏输出最常用于通信接口,其中多个器件连接在同一线路上(例如I2C等)。当连接到线路的器件的所有输出都处于Hi-Z状态时,通过上拉将线路驱动到默认逻辑1电平。任何器件都可以使用其开漏输出将线路拉至逻辑0,并且所有器件都可以看到此电平。


参考文献:

揭开微控制器GPIO设置的神秘面纱(embeddedartistry)

Understanding Microcontroller Pin Input/Output Modes(Stratify Labs)

GPIO输入输出各种模式(推挽、开漏、准双向端口)详解(techexchangeischeap)

Open Drain Output vs. Push-Pull Output(Open4Tech)

公众号:汽车ECU设计

发布于 2019-09-20

文章被以下专栏收录