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);
|
应用场景
浮空输入模式
浮空输入模式下,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; // 按键未按下
}
|