嵌入式编程中input与output引脚的功能区别是什么?
是的,GPIO 配置为 输入模式 的核心作用就是读取引脚的实时电平状态,它和输出模式的核心差异、实际用法可以参考下面的说明:
核心差异对比
- 输出模式:引脚由 MCU 内部的输出驱动电路控制,你可以通过写输出数据寄存器(如 STM32 的
ODR寄存器)主动控制引脚输出高电平或低电平。此时引脚电平由 MCU 主动决定,外部电路的信号无法轻易改变引脚电平(外部驱动能力过强甚至可能烧坏引脚)。 - 输入模式:引脚和内部输出驱动电路断开,电平完全由外接的电路决定,你可以通过读输入数据寄存器(如 STM32 的
IDR寄存器)获取引脚当前的电平状态。此时 MCU 是被动接收外部信号的角色。
输入模式常见实际用例
用例1:独立按键检测
这是最入门的输入模式使用场景,典型电路为:按键一端接 GPIO 引脚,另一端接 GND,同时开启 GPIO 内部上拉电阻,默认状态下引脚电平被上拉为高电平,按键按下时引脚被导通到 GND,电平变为低电平。
参考代码(STM32 HAL 库为例):
// 1. 配置GPIOA PIN0为上拉输入模式 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 2. 轮询读取引脚电平判断按键状态 while(1) { // 读取到低电平说明按键被按下 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) { HAL_Delay(10); // 软件消抖,滤除按键机械抖动产生的错误信号 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) { // 执行按键触发逻辑,比如翻转LED输出电平 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1); } // 等待按键松开,避免重复触发 while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET); } }
用例2:数字传感器信号读取
比如常用的 DHT11 温湿度传感器、DS18B20 温度传感器都使用单总线通信,除了少数 MCU 主动发指令的阶段需要将引脚配置为输出,其余时间都需要配置为输入模式,读取传感器返回的高低电平时序信号,解析得到对应的测量数值。
注意事项
- 输入模式下不要让引脚长期处于悬空状态,否则容易被环境电磁干扰导致电平随机跳变,一般需要根据电路需求配置内部上拉/下拉电阻,固定引脚的默认电平。
- 输入模式还有多个子类:浮空输入、上拉/下拉输入、模拟输入等,其中模拟输入是专门给 ADC(模数转换器)读取引脚模拟电压用的,不会经过数字电平转换电路,不能直接读取高低电平状态。
内容的提问来源于stack exchange,提问作者yujidev
相关产品推荐
相关产品推荐

