🔬 实验05:GPIO 口——按键输入

📌 实验目标
  • 掌握 GPIO 输入模式的配置方法
  • 理解按键抖动原理及消抖方法
  • 实现按键控制 LED 开关
  • 掌握上拉/下拉输入的区别

一、实验内容

  1. 将独立按键连接到 STM32 GPIO 引脚
  2. 配置 GPIO 为上拉输入模式
  3. 编写按键扫描程序(含消抖处理)
  4. 实现按键控制 LED 的亮灭切换

二、按键消抖原理

机械按键在按下和释放时会产生抖动(通常 5-10ms)。消抖有两种方法:

  • 硬件消抖:RC 滤波电路(电阻+电容)
  • 软件消抖:检测到电平变化后延时 10-20ms,再次确认电平状态

三、示例程序

按键控制 LED(库函数)
#include "stm32f10x.h"

void Delay_ms(uint32_t ms)
{
    uint32_t i, j;
    for (i = 0; i < ms; i++)
        for (j = 0; j < 7200; j++);   // 约 1ms
}

int main(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能 GPIO 时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE, ENABLE);

    // PB0 LED 推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    // PE4 按键 上拉输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  // 上拉输入
    GPIO_Init(GPIOE, &GPIO_InitStructure);

    while (1)
    {
        if (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == 0)  // 按键按下
        {
            Delay_ms(20);  // 消抖
            if (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == 0)
            {
                GPIO_ToggleBits(GPIOB, GPIO_Pin_0);   // LED 翻转
                while (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == 0);  // 等待松手
            }
        }
    }
}
💡 这段代码怎么用?
  1. 按键接法:KEY 一端接 PE4、另一端接地(低有效),所以配上拉输入、按下读到 0
  2. 消抖流程:读到低 → 延时 20ms → 再确认低 → 才算按下,再等松手防连击
  3. 进阶写法可封装成 KEY_Scan(mode),用 static 变量记录状态——那就是实验 05 指导书里的「不支持连续按」版本

四、参考资料

资料文件
按键实验 PPT实验2 GPIO口——KEY.pptx
实验指导文档实验2GPIO-按键输入.docx
LED 模板工程LED Template.zip