GPIO的八种工作模式


前言

GPIO 是通用输入输出端口(General Purpose Input Output)的简称,可以通过把GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。
最基本的输出功能是控制引脚输出高、低电平,实现开关控制等
最基本的输入功能是检测外部输入电平等。
其中有八种输入输出模式,下面将会对八种模式逐一解释。
GPIO控制框图


一、输入模式

在输入模式下,施密特触发器打开,输出模式被禁用,此时可通过输入数据寄存器读取I/O 状态。其中输入模式又可细分为上拉输入、下拉输入、浮空输入和模拟输入四种模式。
输入模式

小知识
(1) TTL肖特基触发器(施密特触发器)
作用:用于稳定电平,防止高低电平来回波动
工作原理:施密特触发器会设置两条参考电压,高参考电压和低参考电压。
当高于高参考电压时,输出高电平;低于低参考电压时,输出低电平;位于两条参考电压之间时,保持之前的电平状态。
(2) 保护二极管
作用:防止过大的电压进入单片机内部,造成损坏
工作原理:输入时,IO引脚输入的电压如果大于3.3V,则连接VDD的二极管导通;IO引脚输入的电压如果小于0V,则连接VSS的二极管导通,只有当IO引脚输入的电压在0到3.3V之间的时候,才会进入内部电路,这样防止过大的电压进入单片机内部,造成损坏

1.上拉输入

VDD侧的开关闭合,内部上拉电阻导通,使其GPIO的默认状态为高电平。
应用场景:需要默认高电平的场合,如按键检测。

2.下拉输入

VSS侧的开关闭合,内部下拉电阻导通,使其GPIO的默认状态为低电平。
应用场景:需要默认低电平的场合,如检测低电平信号的变化。

3.浮空输入

VSS和VDD侧的开关都断开,此时GPIO的电平状态不确定,由外设决定。
应用场景:常用于按键检测,接收高低电平信号。

4.模拟输入

引脚直接接入片上外设,如用于ADC采集,不需要施密特触发器整形
应用场景:用于检测外部的模拟电压,如温度、压力传感器的输出。

二、输出模式

在输出模式下,推挽模式时双MOS 管以轮流方式工作,输出数据寄存器可控制I/O输出高低电平。开漏模式时,只有N-MOS 管工作,输出数据寄存器可控制I/O 输出高阻态或低电平。

1.推挽输出

通过输出驱动器控制P-MOS和N-MOS开关来输出高低电平的。
推挽输出英文为Push-Pull mode,可以理解为对电流进行推拉操作
当P-MOS闭合,N-MOS断开时,输出高电平,此时可理解为将电流推出去
当P-MOS断开,N-MOS闭合时,输出低电平,此时可理解为将电流拉(挽)进来
该模式下具有驱动能力,可以通过单片机内部电压驱动外设
应用场景:高速切换和高负载能力的场合,如驱动LED指示灯、继电器。

推挽输出

2.开漏输出

只有N-MOS工作,P-MOS一直处于断开状态。通过控制N-MOS的开合来控制电路。
该模式下无驱动能力,需要外部电压驱动外设
应用场景:需要外部上拉电阻定义高电平的场合,如I2C通信。

开漏输出

3. 两种模式区别

推挽输出开漏输出
优点可以直接输出3.3V配合外部电路 更加灵活
缺点只能输出3.3V高电平实际是高阻态 无法输出电流

三、复用模式

在复用功能模式下,输出使能,输出速度可配置,可工作在开漏及推挽模式,但是输出信号源于其它外设,输出数据寄存器无效;输入可用,通过输入数据寄存器可获取I/O 实际状态,但一般直接用外设的寄存器来获取该数据信号。
复用模式

1.复用推挽输出

GPIO输出控制的来源来自片上外设,如串口模块,PWM波等,其原理和普通的推挽输出一样。

2.复用开漏输出

GPIO输出控制的来源来自片上外设,如I2C模块等,其原理和普通的开漏输出一样。

四、代码实现

/* 定义一个GPIO_InitTypeDef类型的结构体 */
GPIO_InitTypeDef GPIO_InitStruct = {0};

/* 开启相关的GPIO外设时钟 */
__HAL_RCC_GPIOC_CLK_ENABLE();

/* 选择要控制的GPIO引脚*/
GPIO_InitStruct.Pin = GPIO_PIN_13;
/* 设置引脚模式为通用推挽输出*/
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
/* 指定引脚的上下拉配置 */
GPIO_InitStruct.Pull = GPIO_NOPULL;
/* 设置引脚速率 */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
/* 初始化GPIOC*/
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

/*配置GPIO的输出电平状态 */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
### GPIO八种工作模式及其应用场景 #### 1. 浮空输入(Floating Input) 浮空输入模式下,GPIO引脚没有内部上拉或下拉电阻,因此在没有外部信号驱动时,引脚的电平是不确定的。这种模式适用于需要外部控制电平的情况,例如连接外部传感器或开关[^1]。 #### 2. 上拉输入(Pull-up Input) 上拉输入模式下,GPIO引脚内部连接了一个上拉电阻,使得在没有外部信号驱动时,引脚默认为高电平。这种模式常用于按键检测,当按键未按下时,引脚保持高电平;按键按下时,引脚接地变为低电平[^1]。 #### 3. 下拉输入(Pull-down Input) 下拉输入模式下,GPIO引脚内部连接了一个下拉电阻,使得在没有外部信号驱动时,引脚默认为低电平。这种模式同样适用于按键检测,但逻辑相反,即按键未按下时引脚保持低电平;按键按下时,引脚接高电平变为高电平[^1]。 #### 4. 模拟输入(Analog Input) 模拟输入模式下,GPIO引脚直接连接到ADC(模数转换器),用于读取模拟信号。这种模式常用于传感器数据采集,如温度传感器、光敏传感器等[^2]。 #### 5. 开漏输出(Open-drain Output) 开漏输出模式下,GPIO引脚只能输出低电平或高阻态。要输出高电平,需要外部上拉电阻。这种模式适用于需要多个设备共享同一总线的情况,如I²C总线通信。开漏输出允许多个设备同时连接到同一根线上,而不会造成短路[^3]。 #### 6. 开漏复用输出(Open-drain Alternate Function Output) 开漏复用输出模式下,GPIO引脚不仅支持开漏输出,还可以通过复用功能连接到片内外设,如SPI、I²C等。这种模式常用于需要复用功能且需要开漏输出的应用场景[^3]。 #### 7. 推挽输出(Push-pull Output) 推挽输出模式下,GPIO引脚可以输出高电平和低电平,具有较强的驱动能力。这种模式适用于需要高速切换和较强驱动能力的应用,如LED驱动、继电器控制等。 #### 8. 推挽复用输出(Push-pull Alternate Function Output) 推挽复用输出模式下,GPIO引脚不仅支持推挽输出,还可以通过复用功能连接到片内外设,如UART、SPI、I²C等。这种模式常用于需要复用功能且需要推挽输出的应用场景,如I²C的SCL、SDA线。 ### 应用场景总结 - **浮空输入**:适用于外部信号源已经具有明确电平的场合,如外部传感器。 - **上拉输入/下拉输入**:适用于按键检测、开关检测等需要确定默认电平的场合。 - **模拟输入**:适用于ADC采集,如温度、湿度、电压等模拟信号的测量。 - **开漏输出**:适用于多设备共享总线的通信协议,如I²C。 - **开漏复用输出**:适用于需要复用功能且需要开漏输出的场合,如SPI的MOSI、MISO、SCK、CS线。 - **推挽输出**:适用于需要高速切换和较强驱动能力的场合,如LED、继电器等。 - **推挽复用输出**:适用于需要复用功能且需要推挽输出的场合,如UART、SPI、I²C等通信接口。 ### 示例代码:配置GPIO为推挽输出模式 ```c #include "stm32f4xx.h" void GPIO_Init(void) { // 使能GPIOA时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 配置GPIOA的PA5为推挽输出模式 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 推挽输出 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 设置最大翻转速度为50MHz GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // 不使用上拉或下拉 GPIO_Init(GPIOA, &GPIO_InitStruct); } int main(void) { // 初始化GPIO GPIO_Init(); while (1) { // 点亮PA5对应的LED GPIO_SetBits(GPIOA, GPIO_Pin_5); // 延时 for (volatile int i = 0; i < 1000000; i++); // 熄灭PA5对应的LED GPIO_ResetBits(GPIOA, GPIO_Pin_5); // 延时 for (volatile int i = 0; i < 1000000; i++); } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只争朝夕的奈斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值