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);
        }
    }
}

编译与烧录

  1. 使用Keil MDK或STM32CubeIDE创建工程,选择STM32F103C8/C6等具体型号
  2. 将上述代码替换工程中的main.c
  3. 编译生成HEX文件,通过ST-Link或串口ISP烧录至开发板

验证方法

烧录后观察以下现象:

  • 未按下按键时,LED保持熄灭
  • 按下按键不放,LED持续点亮
  • 松开按键,LED立即熄灭

若现象与上述一致,说明GPIO输入模式配置和轮询读取逻辑正确,任务通过。

关键说明

  • 按键接GND,因此使用上拉输入模式(GPIO_Mode_IPU),保证未按下时引脚为确定的高电平,避免悬空误读
  • 轮询方式在while循环中持续读取引脚状态,适用于单按键的简单控制场景
  • 若按键接VCC(按下为高电平),需改用下拉输入模式(GPIO_Mode_IPD),并将判断条件取反