STM32推挽输出和开漏输出

基本概念

1、推挽输出(Push-Pull Output)
由互补的N-MOS和P-MOS管构成推挽结构:

高电平输出:P-MOS导通,输出直接连接VDD
低电平输出:N-MOS导通,输出直接接地
典型应用:LED控制、继电器驱动等需要强驱动能力的场景
2、开漏输出(Open-Drain Output)
仅包含N-MOS管结构:

低电平输出:N-MOS导通
高电平状态:MOS管断开,需外接上拉电阻
典型应用:I2C总线、电平转换等需要”线与”功能的场景

核心差异对比

特性 推挽输出 开漏输出
输出结构 双MOS推挽结构 单MOS+外部上拉
驱动能力 强(直接驱动高低电平) 弱(高电平依赖外接电阻)
电平类型 固定电源电压 高电平由外部上拉电压决定
总线冲突防护 支持多设备”线与”
功耗 静态电流较大 静态功耗较低
电平转换能力 不支持 支持跨电压域通信

配置方法

在gpio初始化的时候配置

  • 推挽输出配置流程
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /* 时钟使能 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    /* 结构体初始化 */
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 指定引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 输出速率

    /* 应用配置 */
    GPIO_Init(GPIOA, &GPIO_InitStructure);

  • 开漏输出配置实现
    1
    2
    3
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;    // 开漏输出模式
    GPIO_Init(GPIOB, &GPIO_InitStructure);

应用场景

必须使用推挽输出的情况

  • LED直接驱动(无需外接三极管)
  • 电机PWM控制
  • 需要快速电平切换的通信协议(如SPI)

必须使用开漏输出的情况

  • I2C总线通信(SDA/SCL)
  • 5V与3.3V电平转换
  • 多主设备总线仲裁
  • 需要防止电源反灌的场合