一、 GPIO定义
GPIO(General-purpose input/output),通用型输入输出的简称,功能类似8051的P0~P3,其接脚可以供使用者由程控自由使用,PIN按工程需求可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO)。既然一个引脚可以用于输入、输出或其他特殊功能,那么一定有寄存器用来选择这些功能。对于输入,一定可以通过读取某个寄存器来确定引脚电位的高低;对于输出,一定可以通过写入某个寄存器来让这个引脚输出高电位或者低电位;对于其他特殊功能,则有另外的寄存器来控制它们。
二、 GPIO结构
STM32的GPIO基本结构如图1所示,按输入输出方向可以分为两个区域,分别是输入区和输出区,详细地分为9个部分,包括二极管保护电路、推挽输出控制电路、输出数据寄存器、复用功能输出、输入数据寄存器、复用功能输入、模拟输入、施密特(肖特基)触发器和上/下拉电路。
图1 GPIO基本结构
各部分具体功能如下:
① 二极管保护电路:由两个保护二极管组成,芯片的引脚电平0~3.3V,部分引脚可以5V,引脚的两个保护二级管可以防止引脚外部过高或过低的电压输入;
② 推挽输出控制电路:由一个PMOS和一个NMOS共同组成,通过控制两个管子的工作状态可以将单片机设置为推挽、开漏或关闭;
③ 输出数据寄存器:双 MOS 管结构电路的输入信号,是由 GPIO“输出数据寄存器GPIOx_ODR”提供的,因此我们通过修改输出数据寄存器的值就可以修改 GPIO 引脚的输出电平。而“置位/复位寄存器 GPIOx_BSRR”可以通过修改输出数据寄存器的值从而影响电路的输出;
④ 复用功能输出:由于 STM32 的 GPIO 引脚具有第二功能,因此当使用复用功能的时候,也就是通过其他外设复用功能输出信号与 GPIO 数据寄存器一起连接到双 MOS 管电路的输入,其中梯形结构是用来选择使用复用功能还是普通 IO 口功能;
⑤ 输入数据寄存器:输入数据寄存器是由 IO 口经过上下拉电阻、施密特触发器引入。当信号经过触发器,模拟信号将变为数字信号 0 或 1,然后存储在输入数据寄存器中,通过读取输入数据寄存器 GPIOx_IDR 就可以知道 IO口的电平状态;
⑥ 复用功能输入:此模式与复用功能输出类似。在复用功能输入模式时,GPIO引脚的信号传输到 STM32其他片上外设,由该外设读取引脚的状态;
⑦ 模拟输入:当 GPIO 引脚用于 ADC 采集电压的输入通道时,用作“模拟输入”功能,此时信号是不经过施密特触发器的,因为经过施密特触发器后信号只有 0、1 两种状态,ADC 外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前;
⑧ 施密特(肖特基)触发器:施密特触发器(Schmitt Trigger)是一种具有两个阈值的比较器电路,其作用是将输入信号转换为稳定的数字输出信号。主要作用有以下几个方面:
a. 噪声滤除:施密特触发器具有滞后特性,当输入信号的幅度超过某个高阈值时,输出状态会翻转,而在输入信号的幅度低于某个低阈值时,输出状态再次翻转。这种滞后特性可以抑制输入信号中的瞬态噪声,使输出信号对噪声更加稳定和可靠。
b. 输入信号调整:施密特触发器可以调整输入信号的幅度范围。通过设置合适的高阈值和低阈值,可以将输入信号的波形范围限定在一个特定的范围内,并将较小的波动或幅度变化转换为稳定的数字输出。
c. 信号整形和判断:施密特触发器可以将不规则的输入信号转换为方波或脉冲信号。它可以在输入信号的上升或下降沿产生稳定的输出状态转换,用于触发其他数字逻辑电路的操作或判断条件。
d. 电压转换:施密特触发器可以将输入信号从一种电平转换为另一种电平。例如,将一个变化的模拟信号转换为二进制的高低电平表示,或者将一个非标准的输入信号转换为标准的逻辑电平。
总的来说,施密特触发器在数字电路中起到信号整形、噪声滤除和电平转换的作用;
⑨ 上/下拉电路:由一个上拉电阻和一个下拉电阻组成,上拉和下拉电阻上都有一个开关,通过配置上下拉电阻开关,可以控制引脚的默认状态电平。当开启上拉时引脚默认电压为高电平;开启下拉时,引脚默认电压为低电平,这样就可以消除引脚不定状态的影响;将上拉和下拉的开关都关断,这种状态称为浮空模式,该模式下引脚的电压是不确定的。STM32 上下拉及浮空模式的配置是通过GPIOx_CRL 和 GPIOx_CRH 寄存器控制的。STM32 内部的上拉其实是一个弱上拉,也就是说通过此上拉电阻输出的电流很小ÿ