6-1-GPIO结构和模式

1 概念

  • GPIO 是通用输入输出端口的简称,STM32 可控制的引脚,STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能;
  • STM32 芯片的 GPIO被分成很多组,每组有 16 个引脚,所有的 GPIO 引脚都有基本的输入输出功能;
  • 在输出模式下可控制端口输出高低电平,用以驱动 LED、控制分频器、模拟通信协议输出时序等。如果控制功率较大的设备,需加入驱动电路;
  • 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据(接受通信线上的数据 )等。

2 结构图

2.1 保护二极管

  • IO 引脚上的保护二极管,主要用于对电压进行限幅,上方二极管接VDD(+3.3V电源),下方二极管接VSS(0V或地)。
  • 输入电压超过3.3V时,上方的二极管会导通。此时,输入电压产生的电流会通过二极管流向VDD,而不流入内部电路。这种情况可以有效防止过高的电压对内部电路造成损害。
  • 输入电压低于0V时,下方的二极管会导通。这意味着输入信号产生的电流会通过下方二极管流向VSS(地),而不会流入内部电路。
  • 输入电压在0V到3.3V之间时,两个二极管都不会导通。此时,电压在安全范围内,电流可以正常流入内部电路,而不会受到二极管的影响。

2.2 上拉/下拉电阻

  • 上拉电阻:连接到引脚与VDD(高电平)之间,用于在引脚未连接其他设备时,将引脚的默认状态拉高至高电平;
  • 下拉电阻:连接到引脚与VSS(地)之间,用于在引脚未连接其他设备时,将引脚的默认状态拉低至低电平;
  • 上拉输入模式:当上拉电阻导通、下拉电阻断开时,引脚被拉高,默认为高电平;
  • 下拉输入模式:当下拉电阻导通、上拉电阻断开时,引脚被拉低,默认为低电平;
  • 两者都断开:如果上拉和下拉电阻都断开,引脚将处于浮空状态,无法确定是高电平还是低电平,容易受到外界干扰;

2.3 MOS 管输出控制

  • MOS管:金属氧化物半导体场效应管,作为电子开关控制电流流动。
  • PMOS(正型MOS管):在高电平下导通,低电平下关闭。
  • NMOS(负型MOS管):在高电平下关闭,低电平下导通。
  • MOS管的输出控制可以选择三种模式:推挽输出开漏输出关闭模式

2.3.1 推挽输出

  • 当数据寄存器为1时,PMOS导通,NMOS断开,输出连接到VDD(高电平);
  • 当数据寄存器为0时,PMOS断开,NMOS导通,输出连接到VSS(低电平);
  • 具备强驱动能力,高低电平都能有效输出;
  • 常用于需要高速切换和强驱动能力的场合,适合一般的数字输出。

2.3.2 开漏输出

  • PMOS不工作,只有NMOS在控制;
  • 数据寄存器为1时,NMOS断开,输出处于高阻态(不输出电平);
  • 数据寄存器为0时,NMOS导通,输出连接到VSS(低电平);
  • 能输出低电平,无法直接输出高电平;
  • 需要外接上拉电阻来实现高电平输出(如接到5V电源);
  • 广泛应用于需要“线与”特性的总线协议(如I2C、SMBus)及电平不匹配的场合(如需要输出5V信号时)。

2.3.3  高阻态和上拉电阻

高阻态:是一种电路状态,表示该电路的输出端口不提供任何电流或电压信号。在这种状态下,输出端口的电流几乎为零,等同于断开或没有连接。所以,在开漏输出模式下,PMOS 是无效的,只有 NMOS 在工作,数据寄存器为 1 时NMOS管断开,这时输出相当于断开,也就是高阻模式。

开漏模式下,多个引脚可以连接在一起,只有在所有引脚均处于高阻态时,上拉电阻才会将线路拉高至电源电压。如果其中一个引脚输出低电平,整个线路都会被拉低至0V。

2.4 输出数据寄存器

前面提到的双 MOS 管结构电路的输入信号,是由 GPIO“输出数据寄存器 GPIOx_ODR”提供的,因此我们通过修改输出数据寄存器的值就可以修改 GPIO 引脚的输出电平。而“置位/复位寄存器GPIOx_BSRR”可以通过修改输出数据寄存器的值从而影响电路的输出。

2.5 复用功能输出

  • 复用功能输出:是指STM32微控制器中的某些GPIO引脚可以被配置为除了普通输入输出功能之外的其他功能。这意味着这些GPIO引脚不仅可以直接由微控制器的输出数据寄存器(GPIOx_ODR)控制,还可以作为其他片上外设(如USART、SPI、I2C等)的功能引脚。
  • 复用功能:当GPIO引脚被配置为某个外设的功能时,这个引脚的主要用途转变为该外设的一部分。例如,当我们使用USART串口通讯时,我们可以将某个GPIO引脚设置为USART的发送引脚。
  • 信号连接:在复用状态下,从外设(如USART)发出的信号会连接到GPIO引脚的双MOS管结构的输入端。这意味着外设可以直接控制该引脚的输出,而不是依赖于微控制器的数据寄存器。
  • 切换控制:通过图中的梯形结构,可以在GPIO引脚的普通功能与外设功能之间切换。

2.6 斯密特触发器

  • 是一个对输入电压进行整形的器件,具有滞回特性的逻辑电路,用于将不稳定或波动的输入信号转换为明确的高电平或低电平输出;
  • 施密特触发器设定了两个阈值:上限阈值下限阈值
  • 当输入电压超过上限阈值时,输出瞬间变为高电平;
  • 当输入电压低于下限阈值时,输出瞬间变为低电平;
  • 在没有施密特触发器的情况下,输入信号可能因为噪声或电压波动而导致误判(即输出不稳定),施密特触发器通过设定的阈值,确保只有在信号稳定且超出设定范围时才改变输出状态,从而避免因信号波动引起的输出抖动。

2.7 输入数据寄存器

它是 GPIO 引脚经过上、下拉电阻后引入的,它连接到施密特 触发器,信号经过触发器后,模拟信号转化为 0、1 的数字信号,然后存储在“输入数据寄存器 GPIOx_IDR”中,通过读取该寄存器就可以了解 GPIO 引脚的电平状态。

2.8 复用功能输入

  • 在这种模式下,GPIO引脚被配置为特定外设的输入功能,而不是作为普通的GPIO输入;
  • 这意味着GPIO引脚的信号可以直接传递给外设(如USART、SPI等),使其能够读取引脚的电平状态。
  • 当我们使用USART进行串口通讯时,通常需要一个GPIO引脚作为数据接收引脚。通过将该GPIO引脚配置为USART的复用功能,外设USART就可以通过这个引脚接收远端发送的数据。在这种情况下,USART外设直接控制引脚的输入,能够实时获取数据,而不需要通过微控制器的普通输入数据寄存器读取。

2.9 模拟输入输出

2.9.1 模拟输入功能(ADC)

  • 当GPIO引脚用于ADC(模数转换器)采集电压时,它被配置为“模拟输入”功能;
  • 在这种情况下,输入信号并不经过施密特触发器,因为施密特触发器只会输出0和1的数字信号,而ADC需要采集原始的模拟信号。

2.9.2 模拟输出功能(DAC)

  • 当GPIO引脚被配置为DAC(数模转换器)的输出通道时,它用作“模拟输出”功能;
  • 在这种情况下,DAC生成的模拟信号直接输出到GPIO引脚,而不会经过双MOS管结构,这样可以确保DAC输出的模拟电压信号能够准确地传递到外部设备。

2.9.3 上下拉电阻的作用

  • 当GPIO引脚用于模拟输入或输出时,配置的上下拉电阻将不再起作用。
  • 即使在寄存器中设置了上拉或下拉模式,这些设置也不会影响模拟信号的输入或输出。

3 GPIO 的八种工作模式

3.1 浮空输入

  • 引脚未连接任何电源或电阻,处于浮空状态;
  • 易受外界干扰,可能导致输入电平不稳定;
  • 在使用时应避免浮空状态,最好连接一个连续的驱动源。

3.2 上拉输入

  • 引脚通过上拉电阻连接到VDD(正电源);
  • 当引脚悬空时,上拉电阻确保引脚为高电平(逻辑1);
  • 上拉电阻通常为较大值(弱上拉),以减少对正常输入操作的影响。

3.3 下拉输入

  • 引脚通过下拉电阻连接到VSS(地);
  • 当引脚悬空时,下拉电阻使引脚为低电平(逻辑0);
  • 下拉电阻同样为弱下拉,确保不干扰正常输入。

3.4 模拟输入

  • 用于连接ADC,接收模拟信号;
  • 引脚信号直接接到施密特触发器之前,确保ADC可以获取原始模拟电压;
  • 此模式下关闭数字输入功能。

3.5 推挽输出

  • 由PMOS和NMOS管组成;
  • 数据为1时,PMOS导通,输出高电平(连接VDD);
  • 数据为0时,NMOS导通,输出低电平(连接VSS);
  • 高低电平均有强驱动能力,适合需要快速切换的应用。

3.6 开漏输出

  • 只有NMOS工作,PMOS无效;
  • 数据为1时,NMOS处于高阻态(不输出);
  • 数据为0时,NMOS导通,输出低电平(连接VSS);
  • 常用于I2C通信等场合,可以外接上拉电阻以输出高电平信号。

3.7 复用推挽输出

  • 与普通推挽输出类似,但引脚电平由片上外设控制;
  • 用于需要与外设交互的场合,保持推挽模式的特点。

3.8 复用开漏输出

  • 与普通开漏输出类似,但引脚电平由片上外设控制;
  • 适合需要与外设交互且使用开漏输出的场合。

发表评论