STM32 GPIO 多种输入输出模式详解,一篇文章让你轻松掌握!
一、GPIO 的介绍
GPIO(General-Purpose Input/Output)即通用输入输出端口,是微控制器中最基础、最常用的外设之一。对于 STM32 系列微控制器而言,GPIO 是连接芯片与外部世界的桥梁,它可以根据需求配置成不同的输入或输出模式,从而实现与各种外部设备的通信、控制或数据采集。
STM32 的 GPIO 具有以下特点:
二、输入输出模式的种类
STM32 的 GPIO 支持多种输入输出模式,主要分为输入模式和输出模式两大类,具体如下:
(一)输入模式
1.浮空输入(Floating Input)
配置为浮空输入时,GPIO 引脚不连接上拉或下拉电阻,电平状态完全由外部电路决定。此时读取引脚电平可能为高或低,取决于外部信号。
2.上拉输入(Pull-up Input)
内部集成上拉电阻,引脚默认被拉高到高电平。当外部输入为低电平时,引脚电平被拉低。
3.下拉输入(Pull-down Input)
内部集成下拉电阻,引脚默认被拉低到低电平。当外部输入为高电平时,引脚电平被拉高。
4.模拟输入(Analog Input)
用于模拟信号输入,此时 GPIO 引脚直接连接到芯片内部的 ADC(模数转换器),用于采集模拟电压信号。
(二)输出模式
1.推挽输出(Push-Pull Output)
由两个 MOS 管组成推挽结构,可输出强高电平和强低电平,驱动能力较强。
2.开漏输出(Open-Drain Output)
仅包含下拉 MOS 管,输出低电平时导通,输出高电平时处于高阻态,需要外部上拉电阻才能实现高电平输出。
3.复用推挽输出(Alternate Function Push-Pull)
用于外设功能(如 USART、SPI 等)的推挽输出模式,由外设模块控制引脚输出。
4.复用开漏输出(Alternate Function Open-Drain)
用于外设功能的开漏输出模式,同样需要外部上拉电阻。
三、各种模式的应用场景
不同的 GPIO 模式适用于不同的应用场景,合理选择模式可以提高系统的稳定性和可靠性。以下是各种模式的典型应用场景:
(一)输入模式应用场景
- 浮空输入
- 适用于外部电路已提供明确电平的场景,如按键连接到固定电压源。
- 示例:读取外部信号状态,但外部信号已具备上拉或下拉能力。
- 上拉输入
- 最常见的应用是按键输入。当按键未按下时,引脚通过上拉电阻保持高电平;按下按键时,引脚接地变为低电平。
- 示例:开发板上的用户按键通常配置为上拉输入模式。
- 下拉输入
- 与上拉输入相反,适用于外部信号常态为低电平的场景。
- 示例:某些开关电路,当开关闭合时引脚接高电平,否则保持低电平。
- 模拟输入
- 用于采集模拟信号,如温度传感器、光照传感器等输出的连续电压信号。
- 示例:使用 STM32 的 ADC 功能读取温度传感器的输出电压,转换为温度值。
(二)输出模式应用场景
- 推挽输出
- 适用于需要强驱动能力的场景,如直接驱动 LED、小型继电器等。
- 示例:控制 LED 灯的亮灭,输出高电平时 LED 点亮,输出低电平时 LED 熄灭。
- 开漏输出
- I2C 总线通信:I2C 总线要求使用开漏输出并外接上拉电阻,以实现 “线与” 逻辑和多主设备通信。
- 电平转换:通过外接上拉电阻到更高电压(如 5V),实现 3.3V MCU 控制 5V 设备。
- 示例:STM32 作为 I2C 从设备时,SDA 和 SCL 引脚通常配置为复用开漏输出模式。
- 复用推挽输出
- 外设通信接口:如 USART 的 TX 引脚、SPI 的 MOSI 引脚等,需要强驱动能力输出数据。
- 示例:配置 GPIO 为 USART 的 TX 引脚,用于发送串口数据。
- 复用开漏输出
- I2C 总线的 SDA 和 SCL 引脚,需要支持 “线与” 逻辑和高阻态。
- 示例:STM32 作为 I2C 主设备时,SDA 和 SCL 引脚配置为复用开漏输出模式。
四、应用举例

根据GPIO的基本结构,我们启用GPIO的步骤为:
1. 启用 GPIO 时钟
STM32 的外设需要先使能对应的时钟才能工作。LED 连接在 GPIOC 端口,因此需要启用 GPIOC 的时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
2. 配置 GPIO 引脚模式
使用GPIO_InitTypeDef结构体配置 LED 引脚为推挽输出模式:
GPIO_InitTypeDef GPIO_InitStructure;
// 配置Pin13为推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
3. 控制 LED 亮灭
配置完成后,可通过以下函数控制 LED:
GPIO_SetBits(GPIOC, GPIO_Pin_13); // 输出高电平(LED灭)
GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 输出低电平(LED亮)
作者:晨曦学习日记