pull_type 有几种类型(PullNone、PullUp、PullDown、OpenDrain)的区别和应用场景。

GPIO 上下拉类型详解

1. PullNone(无上拉/下拉 - 高阻态)

特性 说明
电气状态 引脚处于高阻态(Hi-Z),内部无驱动
电平决定 完全由外部电路决定
功耗 无额外功耗

应用场景

  • 外部已有明确驱动信号(如过零检测、钥匙卡检测)
  • 外部已有上下拉电阻,不需要内部重复配置
  • 需要高阻抗输入的模拟信号采集

代码示例

// 过零检测 - 外部硬件驱动,内部无需上下拉
gpio_irq_pull_ctrl(&zero_cross_btn, PullNone);

// 钥匙卡检测
gpio_irq_pull_ctrl(&gpio_keycard_obj, PullNone);

2. PullUp(内部上拉)

特性 说明
电气状态 内部电阻连接 VCC,默认高电平
触发方式 通常检测下降沿/低电平(按键按下)
空闲状态 高电平

应用场景

  • 按键输入(按键按下接地)
  • 开漏输出设备(如 I2C)
  • 防止浮空导致误触发

代码示例

// 模拟 UART RX - 默认拉高,检测起始位低电平
gpio_irq_pull_ctrl(&simulate_uart_rx_irq, PullUp);

典型电路

VCC ──[上拉电阻]──┬── GPIO输入
                 │
按键 ────────────┘

3. PullDown(内部下拉)

特性 说明
电气状态 内部电阻连接 GND,默认低电平
触发方式 通常检测上升沿/高电平
空闲状态 低电平

应用场景

  • 高电平触发的传感器
  • 外部上拉电阻场景(如某些干接点输入)

典型电路

GND ──[下拉电阻]──┬── GPIO输入
                 │
外部信号 ─────────┘

4. OpenDrain(开漏输出)

特性 说明
电气状态 只能输出低电平或高阻态,不能输出高电平
高电平 需要外部上拉电阻
线与能力 多个开漏可并联(如 I2C 总线)

应用场景

  • I2C 总线(SDA/SCL)
  • 需要电平转换的场合
  • 多个设备共享一条线(线与逻辑)

注意:主要用于输出模式,作为中断输入时慎用。


选型对比表

类型 默认电平 适用场景 代码中案例
PullNone 浮空/外部决定 外部有明确驱动 过零检测、钥匙卡
PullUp 高电平 按键、开漏设备 模拟 UART RX
PullDown 低电平 高电平触发信号 -
OpenDrain 高阻 I2C、线与总线 -

实际选型原则

// 1. 按键检测 → PullUp(按下接地)
gpio_irq_pull_ctrl(&key_btn, PullUp);
gpio_irq_set(&key_btn, IRQ_FALL, 1);  // 检测下降沿

// 2. 外部驱动信号 → PullNone
gpio_irq_pull_ctrl(&sensor_irq, PullNone);

// 3. 干接点输入(无源开关)→ 视外部电路
//    如果开关另一端接 VCC → PullDown
//    如果开关另一端接 GND → PullUp
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐