STM32芯片GPIO内部构造

1. GPIO简介

STM32的GPIO(General Purpose Input/Output)是STM32微控制器中最基本且常用的外设之一,提供了与外部设备进行数据交换的接口。GPIO引脚具有非常高的灵活性,可以通过多种配置来适应不同的应用需求。

2. GPIO内部构造

参考STM32F103XX官方手册GPIO章节,可以看到官方的GPIO内部结构图,接下来对每个部分进行分析。

2.1 保护二极管

保护二极管通常是与输入引脚并联的,这些二极管有特定的工作电压阈值,当输入信号超过或低于这个阈值时,它们会导通以保护引脚。

2.11 正向保护二极管

工作原理:当GPIO引脚的电压大于Vdd(例如高于3.3V的情况下),保护二极管会被反向偏置并导通。此时,多余的电压通过二极管流向Vdd电源,避免了输入引脚的电压超出微控制器的额定电压范围。

2.12 反向保护二极管

工作原理:当GPIO引脚的电压低于GND(例如低于0V的情况下),保护二极管会导通,将电流引导至地线(GND),防止电压过低导致电路损坏。

2.2 上下拉电阻

在STM32和许多其他微控制器中,内部上拉/下拉电阻是常见的GPIO引脚配置选项,用于在引脚处于输入模式时稳定输入信号,防止引脚处于浮空状态(不确定的电平)。这些电阻是微控制器内部集成的,并且可以通过编程配置启用或禁用。

2.2.1 上下拉电阻的作用

GPIO引脚在配置为输入模式时,若没有连接外部电路(如按钮、开关等),会处于一种不稳定的状态,称为浮空(floating)状态。浮空状态的引脚在没有上拉或下拉电阻时,会因为电磁干扰或其他外部因素而随机波动,导致不确定的输入值。这会引起错误的输入信号,影响程序的稳定性。

为了避免这种情况,STM32提供了内部上拉电阻(Pull-up)和内部下拉电阻(Pull-down),它们的作用是强制GPIO引脚在输入模式下保持稳定的电平(高电平或低电平)。

2.2.2 上拉电阻(Pull-up Resistor)

定义:上拉电阻将GPIO引脚的电压拉到高电平(Vdd)。当GPIO配置为输入模式时,启用上拉电阻时,引脚会通过电阻连接到Vdd(电源电压),确保引脚处于高电平。

作用:上拉电阻主要用于那些需要处于默认高电平(1)状态的输入,例如连接按钮、开关等外部组件时,可以确保按钮未按下时,GPIO引脚默认读取为高电平

示例

按钮连接:当按钮未按下时,GPIO引脚通过上拉电阻连接到Vdd,因此引脚状态为高电平。当按钮按下时,GPIO引脚连接到地(GND),此时引脚状态为低电平。

2.2.3 下拉电阻(Pull-down Resistor)

定义:下拉电阻将GPIO引脚的电压拉到低电平(GND)。当GPIO配置为输入模式时,启用下拉电阻时,引脚会通过电阻连接到GND(地),确保引脚处于低电平。

作用:下拉电阻主要用于那些需要处于默认低电平(0)状态的输入。典型的应用场景包括按钮、开关等,当按钮处于未按下状态时,GPIO引脚将默认读取为低电平

示例

按钮连接:当按钮未按下时,GPIO引脚通过下拉电阻连接到GND,因此引脚状态为低电平。当按钮按下时,GPIO引脚连接到Vdd,此时引脚状态为高电平。

2.2.4 STM32中上下拉电阻的配置

由官方手册得知,上下拉电阻的启用与禁用是通过(GPIOx_ODR) (x=A..E)寄存器来控制的。这个寄存器允许开发者在每个GPIO引脚上启用或禁用上拉/下拉电阻。每个引脚的配置是独立的,因此可以灵活地选择哪个引脚启用哪种电阻。

示例

PA13引脚设置为上拉输入模式:

13引脚对应高寄存器,故应该配置GPIOA_CRH寄存器,官方的说明如下:

13引脚由MODE13[1:0]CNF13[1:0]共计4位来配置,由图知MODE13[1:0]应配置为00CNF13[1:0]应配置为10,然后由手册可知还需要配置ODR寄存器

GPIOA_ODR寄存器第13位(对应PA13)设置为1 ,完成所有配置。

配置上/下拉电阻总结

1.确认引脚编号,以及要配置的模式

2.查数据手册,确认要操作的寄存器

3.配置GPIOx_CRH/GPIOx_CHL中的MODEy[1:0]CNFy[1:0]来选择输入、输出模式

4.配置GPIOx_ODR的第y位为0/1来选择下拉还是上拉

2.3 斯密特触发器

斯密特触发器(Schmitt Trigger)是一种基于正反馈的输入信号处理电路,常用于将噪声信号或不稳定的输入信号转换为稳定的数字信号。它的核心特点是具有滞回特性(Hysteresis),即它对上升沿和下降沿信号的响应不同,从而有效地消除输入信号的小幅度噪声或抖动。

2.3.1 斯密特触发器的工作原理

斯密特触发器的工作原理是利用正反馈来产生滞回效应,使得它对输入信号的变化不那么敏感,尤其是在输入信号接近阈值时。通过这种方式,它能够可靠地将一个模拟信号转换为清晰的数字信号

  • 输入信号:通常是一个连续变化的模拟信号(例如一个噪声较大的方波或正弦波信号)。
  • 输出信号:一个稳定的数字信号(高电平或低电平)。

2.3.2 滞回效应(Hysteresis)

斯密特触发器的核心优势在于它引入了滞回效应,这意味着输入信号需要跨越两个不同的阈值电压(上升和下降阈值)才能使输出电平发生变化。这两个阈值通常称为上阈值下阈值,分别决定信号从低电平切换到高电平,或从高电平切换到低电平的条件。

  • 上阈值(Vth+):当输入信号的电压超过这个阈值时,输出会跳变到高电平
  • 下阈值(Vth-):当输入信号的电压低于这个阈值时,输出会跳变到低电平

2.3.3 阈值的滞回特点

当输入信号逐渐变化时,斯密特触发器不会在接近上阈值或下阈值时立即改变输出电平,而是根据输入信号是否超过了这些阈值来确定输出状态。这种设计避免了输入信号在接近阈值时的频繁切换,特别是在存在噪声或抖动的情况下。

2.3.3 斯密特触发器的特点

  • 消除噪声:斯密特触发器特别适合处理噪声较大的信号。它通过滞回效应忽略了输入信号的微小变化,使得最终的输出信号更加稳定。
  • 滞回特性:斯密特触发器具有不同的上升和下降阈值,避免了信号在噪声影响下频繁切换。
  • 输入信号去噪:即使输入信号接近电平切换点,并且信号上有噪声,斯密特触发器仍能提供稳定的输出。
  • 简单易用:由于其简单的结构和广泛的应用,斯密特触发器常常被用作数字电路中的信号清洁器。

2.4 P-MOS和N-MOS

在GPIO引脚的设计中,P-MOS和N-MOS晶体管被用来控制引脚的电平状态,通常通过组成推挽输出电路(Push-Pull Circuit)。这种电路可以让GPIO引脚既能驱动高电平,也能驱动低电平,提供更强的驱动能力。

2.4.1 GPIO输出高电平(1)

  • P-MOS晶体管导通,将GPIO引脚拉高到Vcc。
  • N-MOS晶体管关闭,不导通。

2.4.2 GPIO输出低电平(0)

  • N-MOS晶体管导通,将GPIO引脚拉低到GND。
  • P-MOS晶体管关闭,不导通。

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

2.5 输出数据寄存器

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

2.6 输入数据寄存器

输入数据寄存器是由 IO 口经过上下拉电阻、施密特触发器引入。当信号经过触发器,模拟信号将变为数字信号 0 或 1,然后存储在输入数据寄存器中,通过读取输入数据寄存器 GPIOx_IDR 就可以知道 IO 口的电平状态。

3. GPIO工作模式

GPIO引脚的工作模式通常可以分为以下几种:

  • 输入模式
  • 输出模式
  • 复用功能模式
  • 模拟输入模式

每种模式下,GPIO引脚的行为不同,因此可以根据具体应用场景选择合适的模式。

3.1 GPIO工作模式详细介绍

3.1.1 输入模式(Input Mode)

输入模式用于从外部设备或传感器接收信号。在此模式下,P-MOS和N-MOS均关闭,相当于极大值电阻,输出功能关闭,斯密特触发器打开,GPIO引脚仅用于接收外部信号,并将其传递给内部电路。

  • 浮空输入(Floating Input):此时GPIO引脚不连接任何电压源,处于浮空状态,易受外界电磁干扰,因此通常配合上拉电阻下拉电阻使用。
  • 上拉输入(Input with Pull-up):输入引脚连接一个内部上拉电阻,当没有外部信号时,GPIO会保持在高电平(Vcc),外部信号拉低时,GPIO引脚电平为低(0V)。
  • 下拉输入(Input with Pull-down):输入引脚连接一个内部下拉电阻,当没有外部信号时,GPIO会保持在低电平(GND),外部信号拉高时,GPIO引脚电平为高(Vcc)。

应用场景

  • 按钮输入
  • 传感器数据读取

3.1.2 输出模式(Output Mode)

输出模式用于向外部设备发送信号,此时上下拉电阻被禁用,输出模式由P-MOS管和N-MOS管的激活状态控制。STM32的GPIO可以配置为以下几种输出模式:

  • 推挽输出(Push-Pull Output):GPIO引脚可以提供两种状态:高电平(Vcc)和低电平(GND),并且能够驱动外部负载。该模式适用于需要高电流驱动的应用,如LED控制、电机驱动等。
  • 开漏输出(Open-Drain Output):GPIO引脚只能输出低电平,若需要输出高电平,必须通过外部上拉电阻将电平拉高。开漏输出通常用于I2C总线等需要共享数据总线的通信协议。

应用场景

  • 驱动LED、蜂鸣器等外设
  • 控制继电器等开关设备

3.1.3 复用功能模式(Alternate Function Mode)

GPIO引脚不仅可以用作普通的输入或输出,还可以配置为各种复用功能模式。这些复用功能可以包括串行通信接口(如USART、SPI、I2C等)和定时器输出等。

  • 串行通信接口(USART、SPI、I2C):许多GPIO引脚可以配置为这些协议的信号传输引脚。例如,USART的TX(发送)和RX(接收)引脚,SPI的MOSI、MISO、SCK等引脚。
  • 定时器功能:GPIO引脚可以配置为定时器的输出引脚,产生PWM波形等。
  • 外部中断:GPIO引脚也可以作为外部中断输入,触发中断服务程序(ISR)进行处理。

应用场景

  • 串行通信(USART、SPI、I2C)
  • 定时器输出(PWM波形生成)
  • 外部中断检测

3.1.4 模拟输入模式(Analog Mode)

在模拟模式下,GPIO引脚的输入是完全模拟的,施密特触发器关闭,即不进行数字化处理。该模式用于需要连续信号的应用,例如模拟传感器读取等。

输入模式下的模拟功能:GPIO引脚用于读取外部模拟信号(如传感器输出的电压),并通过ADC(模拟-数字转换器)进行采样。

应用场景

  • 模拟传感器信号采集

3.1.5 GPIO的中断功能

STM32还支持通过GPIO引脚触发外部中断。当GPIO引脚配置为输入模式时,它可以通过外部信号的变化(如电平变化或上升/下降沿)触发中断。在中断发生时,处理器可以执行一个特定的中断服务程序(ISR)。

应用场景

  • 按钮按下检测
  • 外部设备状态变化监控

4. 总结

GPIO引脚在微控制器中非常灵活,可以配置为不同的工作模式来满足不同应用的需求。STM32等微控制器提供了丰富的GPIO配置选项,通过不同的模式选择,可以使GPIO引脚适应多种输入、输出及复用功能的应用场景。常见的模式包括:

  • 输入模式:读取外部信号。
  • 输出模式:驱动外部设备。
  • 复用功能模式:用于串行通信、定时器等。
  • 模拟模式:读取模拟信号。

通过合理配置GPIO引脚,可以实现丰富的外设控制和信号采集功能。

上一篇
下一篇