GPIO 简介(STM32F407)

一、GPIO简介

什么是GPIO

GPIO即通用输入输出端口,全称General Purpose Input Output,是控制或者采集外部器件的信息的外设,即负责输入输出。

它按组分配存在,每组最多16个IO口,组数视芯片而定。比如STM32F407ZGT6是144脚的芯片,其IO口共分为7组,分别是GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG,其中共有112个IO口可供我们编程使用。

IO口电平兼容问题:

凡是有FT标志的,都是兼容5V电平的IO口,可以直接接5V;凡是不带FT标志的,不要接5V;

注意:如果引脚设置的是模拟输入模式,则不能接5V!具体可详见STM32F407ZG的数据手册(表5 大容量STM32F40xxx引脚定义);

GPIO的基本结构

如上图所示,可以看到右边只有I/O引脚,这个I/O引脚就是我们可以看到的芯片实物的引脚,其他部分都是GPIO的内部结构。

++++①++++ ++++保护二极管++++

保护二极管共有两个,用于保护引脚外部过高或过低的电压输入。

当引脚输入电压高于VDD时,上面的二极管导通,当引脚输入电压低于VSS时,下面的二极管导通,从而使输入芯片内部的电压处于比较稳定的值。虽然有二极管的保护,但这样的保护却很有限,大电压大电流的接入很容易烧坏芯片。所以在实际的设计中我们要考虑设计引脚的保护电路

++++②++++ ++++上拉、下拉电阻++++

它们阻值大概在30~50KΩ之间,可以通过上、下两个对应的开关控制,这两个开关由寄存器控制。

当引脚外部的器件没有干扰引脚的电压时,即没有外部的上、下拉电压,引脚的电平由引脚内部上、下拉决定,开启内部上拉电阻工作,引脚电平为高,开启内部下拉电阻工作,则引脚电平为低。同样,如果内部上、下拉电阻都不开启,这种情况就是我们所说的浮空模式。浮空模式下,引脚的电平是不可确定的。

引脚的电平可以由外部的上、下拉电平决定。需要注意的是,STM32的内部上拉是一种"弱上拉",这样的上拉电流很弱,如果有要求大电流还是得外部上拉。

++③施密特触发器++

对于标准施密特触发器,当输入电压高于正向阈值电压,输出为高;当输入电压低于负向 阈值电压,输出为低;当输入在正负向阈值电压之间,输出不改变,也就是说输出由高电准位翻转为低电准位,或是由低电准位翻转为高电准位对应的阈值电压是不同的。只有当输入电压发生足够的变化时,输出才会变化,因此将这种元件命名为触发器。这种双阈值动作被称为迟滞现象,表明施密特触发器有记忆性。

施密特触发器可作为波形整形电路,能将模拟信号波形整形为数字电路能够处理的方波波形,而且由于施密特触发器具有滞回特性,所以可用于抗干扰,其应用包括在开回路配置中用于抗扰,以及在闭回路正回授/负回授配置中用于实现多谐振荡器。

++++④P-MOS++++ ++++管和++++ ++++N-MOS++++ ++++管++++

这个结构控制GPIO的开漏输出推挽输出两种模式。

开漏输出:输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。

推挽输出:这两只对称的MOS管每次只有一只导通,所以导通损耗小、效率高。

输出既可以向负载灌电流,也可以从负载拉电流。推拉式输出既能提高电路的负载能力,又能提高开关速度。

GPIO的工作模式

1、输入浮空

输入浮空模式:上拉/下拉电阻为断开状态,施密特触发器打开,输出被禁止。

输入浮空模式下,IO口的电平完全是由外部电路决定。如果IO引脚没有连接其他的设备,那么检测其输入电平是不确定的。该模式可以用于按键检测等场景。

下图为输入浮空模式时,IO口的工作原理,

2、输入上拉

输入上拉模式:上拉电阻导通,施密特触发器打开,输出被禁止。在需要外部上拉电阻的时候,可以使用内部上拉电阻,这样可以节省一个外部电阻,但是内部上拉电阻的阻值较大,所以只是"弱上拉",不适合做电流型驱动。

下图为输入上拉模式时,IO口的工作原理,

3、输入下拉

输入下拉模式:下拉电阻导通,施密特触发器打开,输出被禁止。在需要外部下拉电阻的时候,可以使用内部下拉电阻,这样可以节省一个外部电阻,但是内部下拉电阻的阻值较大,所以不适合做电流型驱动。

下图为输入下拉模式时,IO口的工作原理,

4、模拟功能

模拟功能:上下拉电阻断开,施密特触发器关闭,双MOS管也关闭。

该模式用于ADC采集或者DAC输出,或者低功耗下省电。

下图为模拟功能时,IO口的工作原理,

5、开漏输出

开漏输出模式:STM32的开漏输出模式是数字电路输出的一种,从结果上看它只能输出低电平Vss或者高阻态(非高非低)。

在开漏输出模式下,施密特触发器是打开的,所以IO口引脚的电平状态会被采集到输入数据寄存器中,如果对输入数据寄存器进行读访问可以得到IO口的状态。也就是说开漏输出模式下,我们可以对IO口进行读数据。用于IIC的SDA和SCL。

下图为开漏输出时,IO口的工作原理,

6、推挽输出

推挽输出模式:STM32的推挽输出模式,从结果上看它会输出低电平VSS或者高电平VDD。推挽输出跟开漏输出不同的是,推挽输出模式P-MOS管和N-MOS管都用上。推挽输出模式下,P-MOS管和N-MOS管同一时间只能有一个MOS管是导通的。当引脚高低电平切换时,两个管子轮流导通,一个负责灌电流,一个负责拉电流,使其负载能力和开关速度都有很大的提高。

在推挽输出模式下,施密特触发器也是打开的,我们可以读取IO口的电平状态。

由于推挽输出模式输出高电平时,是直接连接VDD,所以驱动能力较强,可以做电流型驱动,驱动电流最大可达25mA。该模式也是最常用的输出模式。

下图为推挽输出时,IO口的工作原理,

7、开漏式复用功能

开漏式复用功能:一个IO口可以是通用的IO口功能,也可以是其他外设的特殊功能引脚,这就是IO口的复用功能。

一个IO口还可以是多个外设的功能引脚,我们需要选择其中一个外设的功能引脚时,便用到此功能。当选择复用功能时,引脚的状态是由对应的外设控制,而不是输出数据寄存器。

在开漏式复用功能模式下,施密特触发器也是打开的,我们可以读取IO口的电平状态,同时外设可以读取IO口的信息。

下图为开漏式复用功能时,IO口的工作原理,

8、推挽式复用功能

推挽式复用功能:与开漏式复用功能类似,结构分析请参考推挽输出模式,这里不再赘述。

下图为推挽式复用功能时,IO口的工作原理,

二、GPIO相关寄存器

STM32F4每组(A~I)通用GPIO口有7个32位寄存器(9*7),包括:

4 个 32 位++++配置寄存器++++(MODER、OTYPER、OSPEEDR 和 PUPDR)

2 个 32 位++++数据寄存器++++(IDR 和 ODR)

1 个 32 位++++置位/复位寄存器++++ (BSRR)

1 个 32 位++++锁定寄存器++++ (LCKR)

2 个 32 位++++复用功能选择寄存器++++(AFRH 和 AFRL)

上述关于寄存器的描述在STM32F4xx的参考手册中有详细叙述,本文不再叙述。

三、相关函数

1、HAL_GPIO_Init()

void HAL_GPIO_Init(++GPIO_TypeDef *GPIOx++ , ++GPIO_InitTypeDef *GPIO_Init++);

⚫ 函数描述

该函数用于配置 GPIO 功能模式,还可以设置 EXTI 功能。

⚫ 函数形参

**形参 1 (++GPIO_TypeDef *GPIOx++)**是端口号,可选 GPIOA~GPIOK。

**形参 2 (++GPIO_InitTypeDef *GPIO_Init++)**是 GPIO_InitTypeDef 类型的结构体变量,其定义如下

typedef struct

{

uint32_t Pin; /* 引脚号 */

uint32_t Mode; /* 模式设置 */

uint32_t Pull; /* 上拉下拉设置 */

uint32_t Speed; /* 速度设置 */

uint32_t Alternate; /* 复用功能 */

} GPIO_InitTypeDef;

++成员 Pin++ 表示引脚号,可选:GPIO_PIN_0 到 GPIO_PIN_15,另外还有 GPIO_PIN_All 和 GPIO_PIN_MASK 可选;

++成员 Mode++ 是 GPIO 的模式选择,有以下选择,

#define GPIO_MODE_INPUT (0x00000000U) /* 输入模式 */

#define GPIO_MODE_OUTPUT_PP (0x00000001U) /* 推挽输出 */

#define GPIO_MODE_OUTPUT_OD (0x00000011U) /* 开漏输出 */

#define GPIO_MODE_AF_PP (0x00000002U) /* 推挽式复用 */

#define GPIO_MODE_AF_OD (0x00000012U) /* 开漏式复用 */

#define GPIO_MODE_AF_INPUT GPIO_MODE_INPUT

#define GPIO_MODE_ANALOG (0x00000003U) /* 模拟模式 */

#define GPIO_MODE_IT_RISING (0x11110000U) /* 外部中断,上升沿触发检测 */

#define GPIO_MODE_IT_FALLING (0x11210000U) /* 外部中断,下降沿触发检测 */

/* 外部中断,上升和下降双沿触发检测 */

#define GPIO_MODE_IT_RISING_FALLING (0x11310000U)

#define GPIO_MODE_EVT_RISING (0x11120000U) /* 外部事件,上升沿触发检测 */

#define GPIO_MODE_EVT_FALLING (0x11220000U) /* 外部事件,下降沿触发检测 */

/* 外部事件,上升和下降双沿触发检测 */

#define GPIO_MODE_EVT_RISING_FALLING (0x11320000U)

++成员 Pull++ 用于配置上下拉电阻,有以下选择,

#define GPIO_NOPULL (0x00000000U) /* 无上下拉 */

#define GPIO_PULLUP (0x00000001U) /* 上拉 */

#define GPIO_PULLDOWN (0x00000002U) /* 下拉 */

++++成员 Speed++++ 用于配置GPIO的速度,有以下选择,

#define GPIO_SPEED_FREQ_LOW (0x00000002U) /* 低速 */

#define GPIO_SPEED_FREQ_MEDIUM (0x00000001U) /* 中速 */

#define GPIO_SPEED_FREQ_HIGH (0x00000003U) /* 高速 */

++++成员 Alternate++++ 用于配置具体的复用功能。不同的 GPIO 口可以复用的功能不同,具体可参考数据手册《STM32F407ZGT6.pdf》。复用功能的选择在 stm32f4xx_hal_gpio_ex.h 文件里进行了定义,后面具体用到,再进行介绍。

2、HAL_GPIO_WritePin()

void HAL_GPIO_WritePin(++GPIO_TypeDef *GPIOx++ , ++uint16_t GPIO_Pin++,

++GPIO_PinState PinState++);

⚫ 函数描述

该函数用于配置引脚输出高电平或低电平。

⚫ 函数形参

**形参 1 (++GPIO_TypeDef *GPIOx++)**是端口号,可选 GPIOA~GPIOG。

**形参 2 (++uint16_t GPIO_Pin++)**是引脚号,可选 GPIO_PIN_0 到 GPIO_PIN_15。

**形参 3 (++GPIO_PinState PinState++)**是要设置输出的状态,可选:GPIO_PIN_SET 表示高电平, GPIO_PIN_RESET 表示低电平。

3、HAL_GPIO_TogglePin()

void HAL_GPIO_TogglePin(++GPIO_TypeDef *GPIOx++ , ++uint16_t GPIO_Pin++);

⚫ 函数描述

该函数用于设置引脚的电平翻转。

⚫ 函数形参

**形参 1 (++GPIO_TypeDef *GPIOx++)**是端口号,可选 GPIOA~GPIOG。

**形参 2 (++uint16_t GPIO_Pin++)**是引脚号,可选 GPIO_PIN_0 到 GPIO_PIN_15。

#注意:

实际上,GPIO根据所需功能不同,有不同的函数与之对应,本文中只介绍了三个(其他函数的介绍可详见STM32F4xx参考手册)。对于其他GPIO相关的函数将在其他文章中结合具体应用介绍。

四、总结

本文重点叙述了GPIO的相关知识,包括GPIO的基本结构、工作模式、相关寄存器、相关函数。本文旨在呈现GPIO的基本概念,GPIO的具体应用将在其他文章重点叙述。

相关推荐
SundayBear3 小时前
零基础入门MQTT协议
c语言·单片机
嗯嗯=3 小时前
STM32单片机学习篇9
stm32·单片机·学习
小范馆8 小时前
ESP各模组的引脚图-小智接线图
stm32
松涛和鸣8 小时前
DAY63 IMX6ULL ADC Driver Development
linux·运维·arm开发·单片机·嵌入式硬件·ubuntu
想放学的刺客11 小时前
单片机嵌入式试题(第23期)嵌入式系统电源管理策略设计、嵌入式系统通信协议栈实现要点两个全新主题。
c语言·stm32·单片机·嵌入式硬件·物联网
猫猫的小茶馆11 小时前
【Linux 驱动开发】五. 设备树
linux·arm开发·驱动开发·stm32·嵌入式硬件·mcu·硬件工程
YouEmbedded12 小时前
解码内部集成电路(IIC)与OLED屏
stm32·0.96寸oled·硬件iic·软件模拟iic·图片取模·汉字取模
jghhh0113 小时前
基于上海钜泉科技HT7017单相计量芯片的参考例程实现
科技·单片机·嵌入式硬件
恶魔泡泡糖13 小时前
51单片机外部中断
c语言·单片机·嵌入式硬件·51单片机
意法半导体STM3213 小时前
【官方原创】如何基于DevelopPackage开启安全启动(MP15x) LAT6036
javascript·stm32·单片机·嵌入式硬件·mcu·安全·stm32开发