单片机的GPIO配置
引言
我在学习STM32芯片的GPIO模块时,对一些细节感到困惑,Demystifying Microcontroller GPIO Settings这篇文章几乎解答了我所有的疑问。因此将它翻译出来,希望对大家有帮助。
写单片机软件的人都会配置和管理GPIO引脚。表面上看,GPIO配置非常简单:引脚是输入或输出,是高电平或低电平。但是,你不可避免地会碰到配置选项很多的芯片,或者电子工程师会问一些你不懂的引脚配置(比如将某条线设置成高阻态)。本文会帮助你理解现代单片机上不同的引脚配置。
背景知识
在学习引脚配置之前,先要弄懂一些和GPIO、IO信号有关的描述和名词。
大多数现代GPIO线路都实现成一个三态缓冲器(tri-state buffer)。这表明这些GPIO线路可以有三个状态:
- 逻辑低电平(和GND相连)
- 逻辑高电平(和VCC相连)
- 高阻抗,也称为悬空(floating)、高阻(Hi-Z)和三态(tri-stated)
如果某条线路是高阻抗(High-impedance)状态,那么它实际上就从电路中移除了。这使得多个电路或设备能够共用输出线路,就能实现通信总线(communication buses)。在需要高阻抗的场合但没能使用高阻态会导致I/O争用(I/O contention)和短路(short-circuit)。
如果信号的状态不确定,则称为悬空(Floating),表示它没有连接到VCC或GND。该信号的电压会悬空,和残余电压匹配。「悬空」这个名词还可以用来描述引脚是高阻抗状态。
上拉(Pull-Up)是指将信号通过电阻连接到VCC,上拉电阻用于将悬空的信号设置成一个默认状态。当输入引脚处于高阻抗模式且没有外部源驱动它时,引脚就处于悬空状态,电压值是残余电压。没有主动驱动引脚时,上拉电阻强行将信号电压变成VCC,避免引脚悬空。当其他的源将信号拉低(连接到GND),就忽略上拉电阻,输入引脚会读到低电平。很多单片机提供内置的上拉配置选项。有时候,需要在芯片外部上拉一个特定阻值的电阻,而非使用内部的上拉电阻。
下拉(Pull-Down)是将信号通过一个电阻连接到GND。下拉电阻用于将悬空的信号设置到某个默认状态。如果其他的源将信号拉高(连接到VCC),就忽略下拉电阻,输入引脚会读到高电平。很多单片机提供内置的下拉配置选项。有时候,需要在芯片外部下拉一个特定阻值的电阻,而非使用内部的下拉电阻。
电流阱(Current Sink)表示电流流入引脚、结点或信号。对于数字I/O口,电流阱为负载提供了GND连接端。电流源(Current Source)和电流阱相反,表示电流流出引脚、结点或信号。对于数字I/O口,电流阱为负载提供了电压源。电流阱和电流源都有电流流动,但方向相反。
输入输出模式
输入模式
如果配置GPIO为输入,就可以读取电子信号的状态。配置GPIO为输入,引脚就是高阻抗状态。总体来说,GPIO输入主要配置成下面三种方式:
- 高阻抗(默认,没有驱动则是悬空状态)
- 上拉(内部连接到VCC的电阻)
- 下拉(内部连接到GND的电阻)
大多数GPIO输入引脚内部有可以防止引脚状态虚假变化的迟滞模块。迟滞模块是内置特性,而不是配置选项。
输出模式
如果GPIO配置成输出,可以驱动一个信号为高电平或低电平。GPIO输出主要有两个选项:推拉(push-pull)和开漏(open-drain)。
推拉输出
推拉(也有翻译成「推挽」)输出是大多数场景下GPIO输出的默认配置。推拉输出的GPIO既能灌电流(source)也能拉(sink)电流。推拉输出的GPIO中,有一个连接到VCC或GND的三极管来驱动信号为高电平或低电平。当输出是低电平,信号就被主动地拉(pull)到GND,如果输出是高电平,信号就被主动地推(push)到VCC。
开漏输出
和推拉模式不同的是,开漏输出(Open Drain Output)只能拉电流。输出有两种状态:低电平和高阻抗。想在线路上输出一个高电平,需用上拉电阻将开漏输出连接到想要的输出电平。你可以将开漏输出GPIO想象成一个接地或断开的开关。
开漏GPIO可以典型地配置成两种模式:开漏或内部上拉的开漏。大多数使用开漏电路的应用在开漏输出上使用外部上拉电阻。一般来说,内部上拉电阻的阻值对目标电路是不够的。
当多个门或引脚连接到一起时,开漏输出会很有用,比如I2C总线。当设备没有在使用总线时,开漏输出处于高阻抗模式,电压被上拉电阻拉高。当设备将输出拉低时,所有连接到一起的线路都是低电平。
开漏输出的另一个用途是在单片机上用多个外部设备驱动一个主动拉低的中断引脚。
集电极开路
集电极开路(Open-Collector)和漏极开路的功能一样。集电极开路指的是从BJT输出拉电流,漏极开路指的是从FET输出拉电流。我在元器件数据手册上比在单片机数据手册上碰到集电极开路更多一些。
GPIO速度
GPIO速度控制转换速度(slew rate),也就是信号在高低电平直接转换的速度(上升速度和下降速度)。速度控制选项描述为「速度」、「转换速度」、「频率」和「高频模式」。提高GPIO速度可以提高输出电压(减小上升时间)改变的速度,但功耗和发射到电路中的噪声也会随之升高。一般来讲,没有特殊原因的话,应该降低GPIO速度。