GPIO口的八种工作状态

一直对GPIO的工作状态不是很熟悉,导致在设置IO状态时,经常会设置成推挽上拉,或者推挽下拉,开漏上拉等问题,虽然看起来没有影响MCU工作,但感觉这是一种无知的表现。

现在总结下GPIO口的八种工作状态,其中四种输入状态,四种输出状态。

一、输入状态

1、浮空输入

2、上拉输入

3、下拉输入

4、模拟输入

二、输出状态

1、推挽输出

2、开漏输出

3、复用推挽输出

4、复用开漏输出

三、八种状态详解

1、浮空输入:IO口的内部既不解上拉电阻也不接下拉电阻,这样IO口的状态是一种不确定性。

2、上拉输入:IO口的内部接上拉电阻

3、下拉输入:IO口的内部接下拉电阻

4、模拟输入:一般用于AD检测

5、推挽输出:相当于两个三极管互补工作,不管输出寄存器给高还是低,总有一个三极管导通

6、开漏输出:

 

### GPIO八种工作模式及其用途 #### 1. **浮空输入 (IN_FLOATING)** 浮空输入模式是指GPIO引脚被配置为高阻态,既不上拉也不下拉。这种模式适用于不需要任何内部电阻干预的情况,比如连接到外部开关或其他设备时。然而,由于没有上拉或下拉电阻,引脚可能处于不确定的状态(即中间电平),这可能导致误触发或不稳定的行为[^1]。 ```c // 配置GPIO为浮空输入模式 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` --- #### 2. **带上拉输入 (IPU)** 在这种模式下,GPIO引脚通过内部上拉电阻连接到电源电压。它常用于按键检测等场景,当按钮未按下时,默认读取的是高电平;按下后接地,则读取低电平信号[^2]。 ```c // 配置GPIO为带上拉输入模式 GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` --- #### 3. **带下拉输入 (IPD)** 与带上拉输入相反,此模式下的GPIO引脚通过内部下拉电阻连接到地。适合需要默认低电平的应用场合,例如某些传感器接[^2]。 ```c // 配置GPIO为带下拉输入模式 GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLDOWN; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` --- #### 4. **模拟输入 (AIN)** 在此模式下,GPIO引脚被禁用数字功能并切换至模拟输入路径,允许其接收连续变化的电压值。这是实现模数转换器(ADC)的关键设置之一[^3]。 ```c // 配置GPIO为模拟输入模式 GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` --- #### 5. **开漏输出 (OUT_OD)** 开漏输出是一种半双工通信方式,其中只有NPN晶体管导通来拉低电位。为了获得完整的高低电平控制,通常需要在外围增加一个上拉电阻。这种方式广泛应用于I²C总线和其他类似的协议中[^4]。 ```c // 配置GPIO为开漏输出模式 GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` --- #### 6. **推挽输出 (OUT_PP)** 推挽输出利用两个互补的MOSFET分别负责拉高和拉低电平,从而提供更强的驱动能力和更快的响应速度。它是大多数通用数字输出的标准形式[^5]。 ```c // 配置GPIO为推挽输出模式 GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` --- #### 7. **开漏复用输出 (AF_OD)** 类似于普通的开漏输出,但在这种情况下,GPIO还可以执行其他外设功能(如UART、SPI等)。这意味着开发者可以通过软件选择不同的外设功能而不改变硬件连线[^3]。 ```c // 配置GPIO为开漏复用输出模式 GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` --- #### 8. **推挽复用输出 (AF_PP)** 这是一种结合了推挽输出特性和多功能性的模式。除了能够快速切换高低电平之外,还支持多种外设功能的选择,非常适合复杂的嵌入式应用环境[^5]。 ```c // 配置GPIO为推挽复用输出模式 GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值