Skip to main content

GPIO

GPIO简介

GPIO(General Purpose Input/Output)通用输入输出口

可配置为8种输入输出模式。引脚电平0-3.3V,部分引脚可容忍5V,输出模式下可控制端口输出高低电平,用来驱动LED、控制蜂鸣器、模拟通信协议输出时序等。

输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据。

如果需要接入功率比较大的设备,需要接入驱动电路。

GPIO基本结构

微信截图_20241025155054

APB2是外设总线。在STM32中,所有的GPIO都挂载在APB2外设总线上。

每个GPIO外设有16个引脚,顺序是第0-15号引脚。每个GPIO模块内,主要包含了寄存器和驱动器,寄存器是一段特殊的存储器,内核可以通过APB2总线对寄存器进行读写。

输入寄存器读取为1,证明目前端口是高电平,为0则是低电平。

STM32是32位的单片机,所以STM32内部的寄存器都是32位的。驱动器增加信号的驱动能力,寄存器只负责存储数据。

如果需要点灯,还是需要驱动器增大信号的驱动能力。

GPIO位结构

微信截图_20241025160331

由图可见,左边三个寄存器,右边则是驱动器,最右边则是引脚。上半部分是输入部分,下半部分是输出部分。

输入

输入部分由IO引脚和两个保护二极管组成,上面的二极管接VDD(3.3V),下面的二极管接VSS(0V),输入电压如果比3.3V高,那么上方二极管将导通,输入电压产生的电流将不会流入主电路;如果输入电压低于VSS(负电压),那么下方二极管将导通。

来到左边,上拉电阻至VDD,下拉电阻至VSS,开关通过程序进行配置。上面导通,下面断开,就是上拉输入模式;下面导通,上面断开,就是下拉输入模式。两个都断开,就是浮空。输入引脚如果什么都不接,输入就是浮空,它的位置不确定,极易受到外界影响,所以要避免引脚悬空,就要加上上拉或者下拉电阻。

tip

上拉输入可以称作默认为高电平的输入模式,下拉则相反,是低电平的输入模式。

由于翻译问题,TTL肖特基触发器应为施密特触发器。它负责为输入电压进行整形。如果输入电压大于某一个阈值,就会升为高电平。如果小于某值就会降为低电平(参考数电)。

最左边的模拟输入线,连接到ADC(需要接收模拟量)。另一个是复用功能输入(接收数字量),连接到其他需要读取端口的外设上,比如串口的输入引脚等。

输出

数字部分可以由输出数据寄存器或片上外设控制,通过数据选择器接到了输出控制部分。

选择输出数据寄存器进行控制,就是普通IO口输出,写该寄存器的某一位即可操作对应端口;位设置/清除寄存器可以用来单独操作输出数据寄存器的某一位,不影响其他位,如果想单独控制其中某个端口,需要几种方式:

  1. 读出寄存器,按位与(&=)和按位或(|=)的方式更改某一位,再将更改后的数据写回。(效率不高)
  2. 设置位设置/清除寄存器,对某一位进行置1,在位设置寄存器的对应位写1,不需操作的写0。清除则在位清除寄存器对应位写1。(主要使用)
  3. 读写STM32的位带区域(映射了RAM和外设寄存器的所有的位)。读写这段地址中的数据,相当于读写所映射位置的某一位。

右边的MOS管控制开关的导通和关闭,开关负责将IO口接到VDD或者VSS,可以选择推挽、开漏或关闭三种输出方式。

在推挽输出模式下,P-MOS和N-MOS均有效。数据寄存器为1时,上管导通,下管断开,输出直接接到VDD,即输出高电平。这样高低电平均有较强的驱动能力,因此也称为强推输出模式。这种模式下,STM32对IO口的控制权极大。

在开漏输出模式下,P-MOS是无效的,只有N-MOS在工作。数据寄存器为1时,下管断开,输出相当于断开,即高阻模式。数据寄存器为0时,下管导通,输出直接接到VSS,即输出低电平。该模式下,仅有低电平有驱动能力,高电平则没有。乍一看没有什么用,但它可以作为通信协议的驱动方式(I2C),可以在多机输入的情况下减小干扰。此外,还可以用于输出5V的电平信号。

在关闭输出模式下,两个MOS管都无效,即输出关闭,端口的电平由外部信号来控制。

GPIO输入模式

模式性质特征
浮空输入数字输入可读取引脚电平,若引脚悬空,则电平不确定
上拉输入数字输入可读取引脚电平,内部连接上拉电阻,悬空时默认高电平
下拉输入数字输入可读取引脚电平,内部连接下拉电阻,悬空时默认低电平
模拟输入模拟输入GPIO无效,引脚直接接入内部ADC
开漏输出数字输出可输出引脚电平,高电平为高阻态,低电平接VSS
推挽输出数字输出可输出引脚电平,高电平为VDD,低电平接VSS
复用开漏输出数字输出由片上外设控制,高电平为高阻态,低电平接VSS
复用推挽输出数字输出由片上外设控制,高电平为VDD,低电平接VSS

前三个模式的电路结构基本一样(刚刚也讲过),都属于数字输入口,都可以读取端口的高低电平。使用浮空输入时,端口一定要接一个连续的驱动源。

模拟输入:基本上是ADC模数转换器的专属,使用ADC的时候,将引脚配置为模拟输入。其他时候基本用不到。

开漏和推挽:结构也基本一样。区别刚刚讲过。

Reference

[1]. 江协科技.STM32入门教程-2023版 细致讲解 中文字幕[M/OL](2021-07-29)[2024-10-25].【STM32入门教程-2023版 细致讲解 中文字幕】 https://www.bilibili.com/video/BV1th411z7sn/?p=5&share_source=copy_web&vd_source=8b2bc57e71349607b55c9fde6b078ebd