STM32 GPIO:一个详细解析
GPIO – 详解
文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
1、GPIO 是什么
GPIO(General-Purpose input/output):通用输入输出端口的简称。是 外设 与 微控制器 (STM32等单片机)通信的通道,俗称 常用引脚。
2、STM32 引脚分类
STM32 芯片引脚可分为六种引脚: 电源管脚、晶振管脚、复位管脚、下载管脚、BOOT 管脚 和 GPIO 管脚 。
3、GPIO 内部结构
下图为 GPIO 的基本结构图:
接下来,就是对结构图各个模块进行分析了,Go
3.1 保护二极管
模块 1 :为 保护二极管。防止引脚外部 过高 或 过低 的电压输入。
3.2 上下拉电阻
模块 2:为带有电阻开关的上下拉电阻。通过配置上下拉电阻开关,控制引脚的默认状态电平。
STM32 内部的上拉起始就是一个 弱上拉,即通过此上拉电阻输出的电流很小,如果想要输出一个大电流,那么就需要外接 上拉电阻 了。
浮空模式:将上拉和下拉的开关都关断。此模式下,引脚的电压是不确定的。
GPIOx_CRL
和 GPIOx_CRH
寄存器控制的。因此 我们就可以明白 GPIO 八种工作模式的其中三种:



3.3 P-MOS 和 N-MOS
输出模式下,线路经过由 P-MOS 和 N-MOS管组成的单元电路。这让 GPIO 引脚具有了 推挽 和 开漏 两种输出模式。
-
推挽 输出模式
推挽输出模式,是根据 P-MOS 和 N-MOS 管的 工作方式命名 的。
-
在该结构单元 输入一个高电平时,P-MOS 管导通,N-MOS 管截止,对外输出高电平(3.3V)。
-
在该结构单元 输入一个低电平时,P-MOS 管截止,N-MOS 管导通,对外输出低电平(0V)。
当引脚高低电平切换时,两个 MOS 管将轮流导通。一个负责灌电流(电流输出到负载),一个负责拉电流(负载电流流向芯片),使其 负载能力 和 开关速度 都比普通方式由很大的提高。下图为 推挽输出模式 的等效电路:
GPIOx_CRL
和 GPIOx_CRH
寄存器控制。-
开漏 输出模式
开漏输出模式 时,不论输入是 高电平 还是 低电平,P-MOS 管总处于关闭状态。
-
当输入 低电平 时,N-MOS 管导通,输出即为 低电平。
-
当输入 高电平 时,N-MOS 管截止,这个时候引脚状态既不是高电平,也不是低电平,我们称之为 高阻态。
-
如果想让引脚输出 高电平,那么引脚必须外接一个上拉电阻,由上拉电阻提供高电平。
开漏输出模式 等效电路,如下图所示:
开漏输出模式 一般应用在 I2C、SMBUS 通信等需要 ”线与“ 功能的总线电路中。还可以用在电平不匹配的场合中,就如上面说的输出 5V 一样。
因此 我们就可以明白 GPIO 八种工作模式的其中两种:
注:此处为什么在输出模式下,输入路上的 TTL 施密特触发器是处于开启状态呢 ?
GPIOx_IDR
来读取 I/O 的实际状态。3.4 输出数据寄存器
双 MOS 管结构电路的输入信号,是由 GPIO“输出数据寄存器 GPIOx_ODR
”提供的。因此我们通过修改输出数据寄存器的值就可以修改 GPIO 引脚的输出电平。而**“(位设置/清除寄存器)置位/复位寄存器 GPIOx_BSRR
”**可以通过修改输出数据寄存器的值从而影响电路的输出。
3.5 复用输出功能
由于 STM32 的 GPIO 引脚具有第二引脚。因此当使用复用功能的时候,也就是通过其它外设复用功能输出信号与 GPIO 输出数据寄存器 一起通过梯形结构连接到双 MOS 管电路的输入,其中梯形结构是用来选择使用 复用功能 还是 普通 I/O 口功能。
例如:当使用 USART 串口通信时,需要用到某个 GPIO 引脚作为 通信发送引脚(此时为发送数据)。此时,就可以把这个 GPIO 引脚配置成 USART 串口复用功能,由串口外设控制该引脚 发送数据。
由于输出模式分为 开漏输出 和 推挽输出。 我们就可以明白 GPIO 八种工作模式的其中两种:


3.6 输入数据寄存器
输入数据寄存器 是由 I/O 口经过上下拉电阻、TTL 施密特触发器引入。当信号经过 TTL 施密特触发器,模拟信号将变为数字信号“0”或“1”,然后存储在 输入数据寄存器 中。通过读取 输入数据寄存器 GPIOx_IDR
就可以知道 I/O 口的电平状态。
3.7 复用功能输入
此模式与 复用功能输出 类似。在 复用功能输入 模式时,GPIO 引脚的信号传输到 STM32 其它片上外设,由该外设读取引脚的状态。
同样例如,我们使用 USART 串口通信时,需要用到某个 GPIO 引脚作为 通信接收引脚,此时就可把该 GPIO 引脚配置成 USART 串口复用功能。从而使得 USART 可以通过该通信引脚接收远端数据。
3.3.5 复用功能输出
对应,有输出也有输入。3.8 模拟输入输出
当 GPIO 引脚设置为**“模拟输入”**时, 用于 ADC 采集电压的输入通道 。并且,此时信号时不经过 TTL 施密特触发器的。因为 经过 TTL 施密特触发器后信号只有 “0”和“1”两种状态,所以 ADC 作为外设要采集到原始的模拟信号时,其信号源输入必须在 TTL 施密特触发器之前。
当 GPIO 引脚设置为**”模拟输出“**时,用于 DAC 作为模拟电压输出通道。DAC 的模拟信号输出就不经过双 MOS 管结构了,模拟信号直接通过管脚输出。
我们就可以明白 GPIO 八种工作模式的其中一种:

4、GPIO 工作模式总结
通过 3. GPIO 内部结构 了解了 GPIO 内部的结构关系,决定了 GPIO 可以配置成以下几种模式:
4.1 输入模式(浮空、上拉、下拉、模拟)
GPIO 的输入工作模式 1 – 输入浮空模式:浮空输入的电平是不确定的,完全由外部的输入决定,一般接按键的时候可以使用这个模式。
(上拉下拉很好理解,默认的电平由上拉或者下拉决定)
GPIO 的输入工作模式 2 – 输入上拉模式
GPIO 的输入工作模式 3 – 输入下拉模式
GPIO 的输出工作模式 8 – 模拟模式:模拟输入则用于 ADC 采集。
GPIOx_IDR
读取 I/O 状态。4.2 输出模式(推挽、开漏)
GPIO 的输出工作模式 4 – 推挽输出模式
GPIO 的输出工作模式 5 – 开漏输出模式
GPIOx_ODR
可控制 I/O 输出高低电平。GPIOx_IDR
可读取 I/O 的实际状态。4.3 复用功能(推挽、开漏)
GPIO 的输出工作模式 6 – 推挽复用输出模式
GPIO 的输出工作模式 7 – 开漏复用输出模式
GPIOx_ODR
无效。GPIOx_IDR
可获取 I/O 实际状态,但一般直接用 外设的寄存器 来获取该数据信号。4.4 模拟输入输出(上下拉无影响)
GPIO 的输出工作模式 8 – 模拟模式
GPIOx_CRL
和 GPIOx_CRH
”可配置 GPIO 的工作模式和输出速度。CRH 控制端口高八位,CRL 控制端口的低八位。5、GPIO 工作模式代码配置
GPIO_Mode_AIN // 模拟输入
GPIO_Mode_IN_FLOATING // 浮空输入
GPIO_Mode_IPD // 下拉输入
GPIO_Mode_IPU // 上拉输入
GPIO_Mode_Out_OD // 开漏输出
GPIO_Mode_Out_PP // 推挽输出
GPIO_Mode_AF_OD // 复用开漏输出
GPIO_Mode_AF_PP // 复用推挽输出
typedef enum
{
GPIO_Mode_AIN = 0x0, // 模拟输入
GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入
GPIO_Mode_IPD = 0x28, // 下拉输入
GPIO_Mode_IPU = 0x48, // 上拉输入
GPIO_Mode_Out_OD = 0x14, // 开漏输出
GPIO_Mode_Out_PP = 0x10, // 推挽输出
GPIO_Mode_AF_OD = 0x1C, // 复用开漏输出
GPIO_Mode_AF_PP = 0x18 // 复用推挽输出
} GPIOMode_TypeDef;
6、GPIO 寄存器
GPIO 共有 10 个寄存器,分别为:
4 个 32 位配置寄存器 2 个 32 位数据寄存器 1 个 32 位置位/复位寄存器 1 个 32 位锁存寄存器 2 个 32 位复用功能寄存器
如下图:
-
GPIOx_MODER 端口模式寄存器
- MODER:(Mode Register)
-
GPIOx_OTYPER 端口输出类型寄存器
- OTYPER:(Output Type Register)
-
GPIOx_OSPEEDR 输出速度寄存器
- OSPEEDR:(Output Speed Register)
-
GPIOx_PUPDR 端口上拉/下拉寄存器
- PUPDR:(Pull Up & Pull Down Register)
-
GPIOx_IDR 端口输入数据寄存器
- IDR:(Input Data Register)
-
GPIOx_ODR 端口输出数据寄存器
- ODR:(Output Data Register)
-
GPIOx_BSRR 端口置位/复位寄存器
- BSRR:(Bit Set Reset Register)
-
GPIOx_LCKR 端口配置锁存寄存器
– LCKR:(Lock Register)
-
GPIOx_AFRL、AFRH 复用功能寄存器
- AFRL:(Alternate Function Register Low)
- AFRH:(Alternate Function Register High)
- 高位 AFRH 和 地位 AFRL 分别控制 8 个 I/O 口,共 16 个 I/O 口。即如果一个 64 位数据会分配到这 16 个 I/O 口,那么 每个 I/O 口控制 4 个位。
7、总结
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
8、参考
【2】嵌入式单片机基础篇(一)之stm32F1GPIO详解_lostlll的博客-CSDN博客
【3】RCC_APB2Periph_AFIO的理解。。。重映射的一点心得 – Cold_water – 博客园 (cnblogs.com)
【5】STM32学习——GPIO_m0_65734791的博客-CSDN博客_stm32引脚分类
【6】(1条消息) STM32外设之GPIO的推挽输出和开漏输出模式详解_SlowIsFastLemon的博客-CSDN博客_stm32 开漏输出