每日一言
正在加载...

GPIO输入模式配置详解

上拉、下拉与浮空输入的区别

GPIO输入模式概述

STM32的GPIO引脚可以配置为多种输入模式,主要包括:

  • GPIO_Mode_IPU:上拉输入
  • GPIO_Mode_IPD:下拉输入
  • GPIO_Mode_IN_FLOATING:浮空输入
  • GPIO_Mode_AIN:模拟输入

上拉输入模式

上拉输入模式下,GPIO引脚内部连接一个上拉电阻(通常为30-50kΩ)到VCC。

配置示例

1
2
3
4
5
6
7
8
9
10
GPIO_InitTypeDef GPIO_InitStructure;

// 使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

// 配置PA0为上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

应用场景

  • 按键检测(按键接地)
  • 开关量输入
  • 需要默认高电平的场景

下拉输入模式

下拉输入模式下,GPIO引脚内部连接一个下拉电阻到GND。

配置示例

1
2
3
4
5
// 配置PA1为下拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

应用场景

  • 按键检测(按键接VCC)
  • 需要默认低电平的场景

浮空输入模式

浮空输入模式下,GPIO引脚不连接任何内部电阻,处于高阻态。

配置示例

1
2
3
4
5
// 配置PA2为浮空输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

应用场景

  • 外设信号输入
  • I2C、SPI等通信接口
  • 需要外部上拉/下拉的场景

三种模式对比

模式 内部电阻 默认电平 适用场景
IPU 上拉电阻 高电平 按键接地
IPD 下拉电阻 低电平 按键接VCC
IN_FLOATING 不确定 外设信号

实际应用案例

按键检测电路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 按键接PA0,按键按下时接地
void Key_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  // 上拉输入
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

uint8_t Key_Scan(void) {
    if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) {
        delay_ms(10);  // 消抖
        if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) {
            return 1;  // 按键按下
        }
    }
    return 0;  // 按键未按下
}