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 上下拉电阻
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]应配置为00
,CNF13[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引脚,可以实现丰富的外设控制和信号采集功能。