STM32 (三)GPIO的八种模式及其原理

本文详细介绍了STM32的GPIO(通用输入/输出)端口,包括浮空输入、上拉输入、下拉输入、模拟输入等四种输入模式,以及开漏输出、推挽输出、复用开漏输出、复用推挽输出等四种输出模式。GPIO的工作原理涉及保护二极管、上拉和下拉电阻、TTL肖特基触发器和MOS管。STM32的GPIO模式选择与应用场景,如按键检测、ADC模拟输入、I2C通信等。此外,还对比了F4系列和F1系列GPIO的区别,以及如何在Cubemx中配置GPIO。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、GPIO简介

GPIO就是通用I/O(输入/输出)端口,是STM32可控制的引脚。
STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。


二、GPIO工作模式.


1. 四种输入模式

    GPIO_Mode_IN_FLOATING 浮空输入模式
    GPIO_Mode_IPU 上拉输入模式
    GPIO_Mode_IPD 下拉输入模式
    GPIO_Mode_AIN 模拟输入模式

2. 四种输出模式

    GPIO_Mode_Out_OD 开漏输出模式
    GPIO_Mode_Out_PP 推挽输出模式
    GPIO_Mode_AF_OD 复用开漏输出模式
    GPIO_Mode_AF_PP 复用推挽输出模式

三、GPIO工作原理解析

1. I/O端口的基本结构框图

 

保护二极管

作用: 防止引脚外部输入过高和过低的电压,防止不正常电压引入芯片,导致芯片烧毁。
当引脚电压高于VDD时,上方的二极管导通。
当引脚电压低于VSS时,下方的二极管导通。
上拉电阻和下拉电阻

作用: 控制引脚默认状态的电压。
开启上拉的时候,引脚默认电压为高电平。
开启下拉的时候,引脚默认电压为低电平。
TTL肖特基触发器

TTL肖特基触发器其实可以理解为用肖特基管构成的施密特触发器。
作用: 将相对缓慢变化的模拟信号变成矩形信号。
当输入电压高于正向阈值电压,输出为高。
当输入电压低于负向阈值电压,输出为低。
P-MOS管和N-MOS管

作用: 使得GPIO具有“推挽输出”和“开漏输出”的模式。
P-MOS管: MCU输出为 1 导通,低电平关闭。
N-MOS管: MCU输出为 0 导通,高电平关闭。
 

3. GPIO工作模式解析

浮空输入模式

浮空输入模式下,I/O端口的电平信号直接进入到输入数据寄存器
MCU直接读取I/O口电平,I/O的电平状态是不确定的,完全由外部输入决定。

 

 如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。 (接用电压表测量其引脚电压为1点几伏,这是个不确定值) 以用来做KEY识别

上拉输入模式

上拉输入模式下, I/O端口的电平信号经过上拉电阻进入到输入数据寄存器。

 

IO内部接上拉电阻,此时如果IO口外部没有信号输入或者引脚悬空,IO口默认为高电平  如果I/O口输入低电平,那么引脚就为低电平,MCU读取到的就是低电平

STM32的内部上拉是"弱上拉",即通过此上拉输出的电流是很弱的,如要求大电流还是需要外部上拉。

下拉输入模式

下拉输入模式下, I/O端口的电平信号经过下拉电阻进入到输入数据寄存器。

 

  IO内部接下拉电阻,此时如果IO口外部没有信号输入或者引脚悬空,IO口默认为低电平  如果I/O口输入高电平,那么引脚就为高电平,MCU读取到的就是高电平。

模拟输入模式

模拟输入模式下, I/O端口的电平信号不经过TTL肖特基触发器,直接进入ADC模块,并且输入数据寄存器为空 ,MCU不能在输入数据寄存器上读到引脚状态。
在模拟输入模式下,上拉电阻和下拉电阻是不起作用的,即使配置上拉和下拉模式,也不会有作用。

当GPIO引脚用于ADC采集电压的输入通道时,用作"模拟输入"功能,此时信号不经过施密特触发器,直接直接进入ADC模块,并且输入数据寄存器为空 ,CPU不能在输入数据寄存器上读到引脚状态

当GPIO用于模拟功能时,引脚的上、下拉电阻是不起作用的,这个时候即使配置了上拉或下拉模式,也不会影响到模拟信号的输入输出

除了 ADC 和 DAC 要将 IO 配置为模拟通道之外其他外设功能一律 要配置为复用功能模式,
 

开漏输出模式(带上拉或者下拉)

开漏输出模式下, P-MOS管不工作,只有N-MOS管工作,MCU只能控制输出低电平。
MCU输出低电平的时候,N-MOS管导通,I/O引脚输出低电平。
MCU输出高电平的时候,N-MOS管关闭,I/O引脚悬空状态。

 

推挽输出模式

推挽输出模式下, P-MOS管和N-MOS管都工作,MCU可以控制输出高电平和低电平。
MCU输出为 0 的时候,N-MOS管导通,I/O引脚输出低电平。
MCU输出为 1 的时候,P-MOS管导通,I/O引脚输出高电平。

 

复用开漏输出模式

复用开漏输出模式下, GPIO复用为其他外设,输出数据寄存器GPIOx_ODR无效, 输出的高低电平的来源于其它外设。

 

复用推挽输出模式

复用推挽输出模式下, GPIO复用为其他外设,输出数据寄存器GPIOx_ODR无效, 输出的高低电平的来源于其它外设。

 

三、在STM32中选用IO模式:

     上拉输入、下拉输入可以用来检测外部信号;例如,按键等;
    模拟输入 ——应用ADC模拟输入,或者低功耗下省电
    开漏输出一般应用在I2C、SMBUS通讯等需要"线与"功能的总线电路中。
     推挽输出模式一般应用在输出电平为0和3.3伏而且需要高速切换开关状态的场合。在STM32的应用中,除了必须用开漏模式的场合,我们都习惯使用推挽输出模式。
    复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)
    复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)
 

F4系列与F1系列区别:

本质上的区别是F4系列采用了Cortex-M4内核  而F1系列采用Cortex-M3内核

F1系列(M3)IO口基本结构:

 

F4系列(M4)IO口基本结构:

 

F4系列设计的更加高级与人性化,他将外部上下拉电阻转移到了输出/输入驱动器外部,使得输出模式下也可以实现内部上拉与下拉,方便了用户的使用,增加了灵活性
 

四、GPIO的配置方法(cubemx)

1,打开cubrmx ,点击ACCESS TO MCU SELECTCR.

 

2,会进入这个界面,在 part number 处输入单片机的型号,并选取相应的型号

 

3,先点击syssterm core ,再点击sys,参照图上配置

 

4,在右侧的芯片上,寻找所要设置的GPIO,在单击该GPIO后会显示能配置的模式 

 5,在选定模式后点击GPIO进行详细的配置

 

 在这可进行输入\输出的初始电平,输入的开漏,推挽等的设置。

6,进入clock configuration进行时钟树的配置(上一章讲过了)

### STM32 GPIO八种输入输出模式详解 STM32 微控制器中的 GPIO 是一组通用输入/输出端口,能够灵活配置为多种工作模式以适应不同的应用场景。以下是 STM32 GPIO八种常见模式及其特点: #### 1. 推挽输出 (Push-Pull Output) 推挽输出是一种常见的输出模式,适用于驱动 LED 或其他低功耗负载。在这种模式下,GPIO 能够主动提供高电平和低电平信号。 - **特点**: 高速切换能力,适合驱动小型负载。 - **应用**: 控制 LED、继电器或其他数字电路。 - **示例代码**: ```c // 设置 PA5 为推挽输出模式 GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` #### 2. 开漏输出 (Open-Drain Output) 开漏输出模式允许 GPIO 只能拉低电压而无法主动提供高电平。通常需要外接上拉电阻来实现完整的逻辑电平转换。 - **特点**: 支持多路共享总线通信(如 I²C),兼容不同电源电压的设备。 - **应用**: 实现 I²C 总线接口或与其他设备共享同一根信号线。 - **示例代码**: ```c // 设置 PA5 为开漏输出模式 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; // 开漏输出 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` #### 3. 复用推挽输出 (Alternate Function Push-Pull)模式用于将 GPIO 引脚分配给特定的外设功能(如 USART、SPI 等)。它支持高速数据传输并具有较强的驱动能力。 - **特点**: 提供专用硬件功能的支持。 - **应用**: UART/TTL 数据收发、PWM 输出等。 - **示例代码**: ```c // 将 PA9 配置为 USART1_TX 功能 GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出 GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` #### 4. 复用开漏输出 (Alternate Function Open-Drain) 类似于复用推挽输出,但采用开漏方式操作。这种模式常用于某些特殊协议中。 - **特点**: 更高的灵活性,尤其在混合电压环境下表现良好。 - **应用**: 特殊通信协议(如 SMBus)。 - **示例代码**: ```c // 将 PA8 配置为复用开漏输出模式 GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; // 复用开漏输出 GPIO_InitStruct.Alternate = GPIO_AF0_MCO; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` #### 5. 浮空输入 (Floating Input) 浮空输入模式不带任何内部上下拉电阻,默认情况下引脚状态不确定,容易受到噪声干扰。 - **特点**: 不推荐单独使用,除非外部已经具备稳定的上下拉机制。 - **应用**: 连接到开关或按钮时需注意抗抖动设计。 - **示例代码**: ```c // 设置 PA0 为浮空输入模式 GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; // 浮空输入 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` #### 6. 上拉输入 (Pull-Up Input) 在此模式下,GPIO 内部会自动启用一个弱上拉电阻,使未连接到 GND 的引脚默认保持高电平。 - **特点**: 增强了稳定性,减少了误触发的可能性。 - **应用**: 按键检测、中断触发源。 - **示例代码**: ```c // 设置 PA1 为上拉输入模式 GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; // 启用上拉 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` #### 7. 下拉输入 (Pull-Down Input) 与上拉输入相反,在该模式GPIO 使用的是内部弱下拉电阻,使得未接地的引脚维持在一个固定的低电平状态。 - **特点**: 类似于上拉输入的作用原理,只是方向反转。 - **应用**: 当需要反向逻辑判断时非常有用。 - **示例代码**: ```c // 设置 PA2 为下拉输入模式 GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLDOWN; // 启用下拉 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` #### 8. 模拟输入 (Analog Input)GPIO 工作于此模式时,它可以作为 ADC 输入通道的一部分参与模数转换过程。 - **特点**: 主要服务于模拟量采集场景。 - **应用**: 温度传感器读取、光敏元件监测等。 - **示例代码**: ```c // 设置 PA3 为模拟输入模式 GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; // 模拟输入 GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` 以上便是 STM32GPIO八种主要模式以及它们各自的应用领域[^1][^2][^3]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值