2. 按键输入与轮询
任务目标
使用STM32的GPIO输入功能,通过按键控制LED的亮灭状态。按下按键时LED点亮,松开时LED熄灭,以此掌握GPIO输入模式配置与轮询读取方法。
硬件连接
- 按键一端接PA0,另一端接GND(按下为低电平)
- LED正极经限流电阻接PC13,负极接GND(高电平点亮)
- STM32F103系列开发板(如最小系统板或战舰/精英板)
完整代码
// main.c - 按键轮询控制LED
#include "stm32f10x.h"
void GPIO_Config(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIOA和GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
// PA0配置为输入模式(上拉,默认高电平)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
// PC13配置为推挽输出,50MHz
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
int main(void) {
GPIO_Config();
while (1) {
// 轮询读取PA0电平
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET) {
// 按键按下(低电平),点亮LED
GPIO_SetBits(GPIOC, GPIO_Pin_13);
} else {
// 按键松开(高电平),熄灭LED
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
}
}
}
编译与烧录
- 使用Keil MDK或STM32CubeIDE创建工程,选择STM32F103C8/C6等具体型号
- 将上述代码替换工程中的main.c
- 编译生成HEX文件,通过ST-Link或串口ISP烧录至开发板
验证方法
烧录后观察以下现象:
- 未按下按键时,LED保持熄灭
- 按下按键不放,LED持续点亮
- 松开按键,LED立即熄灭
若现象与上述一致,说明GPIO输入模式配置和轮询读取逻辑正确,任务通过。
关键说明
- 按键接GND,因此使用上拉输入模式(
GPIO_Mode_IPU),保证未按下时引脚为确定的高电平,避免悬空误读 - 轮询方式在while循环中持续读取引脚状态,适用于单按键的简单控制场景
- 若按键接VCC(按下为高电平),需改用下拉输入模式(
GPIO_Mode_IPD),并将判断条件取反