2. 按键轮询检测

任务目标

在RT-Thread主线程中轮询按键引脚电平,检测按键按下与释放动作,每次按下时翻转LED的开关状态。通过该案例理解GPIO输入模式配置、电平读取及轮询机制的基本用法。

硬件连接与依赖

  • 按键一端接PB0,另一端接GND(按下为低电平)
  • LED正极经限流电阻接PB1,负极接GND(高电平点亮)
  • 依赖RT-Thread的PIN设备驱动框架,STM32 BSP已默认开启

关键完整代码


#include <rtthread.h>
#include <rtdevice.h>

#define KEY_PIN      GET_PIN(B, 0)
#define LED_PIN      GET_PIN(B, 1)

static int key_led_sample(void)
{
    rt_uint8_t last_key = PIN_HIGH;
    rt_uint8_t cur_key;
    rt_uint8_t led_state = PIN_LOW;

    /* 配置按键为输入模式,使能内部上拉 */
    rt_pin_mode(KEY_PIN, PIN_MODE_INPUT_PULLUP);
    /* 配置LED为推挽输出 */
    rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
    rt_pin_write(LED_PIN, led_state);

    while (1)
    {
        cur_key = rt_pin_read(KEY_PIN);

        /* 检测下降沿:上次为高,本次为低,表示按下 */
        if ((last_key == PIN_HIGH) && (cur_key == PIN_LOW))
        {
            led_state = !led_state;
            rt_pin_write(LED_PIN, led_state);
            rt_kprintf("LED %s\r\n", led_state ? "ON" : "OFF");
        }

        last_key = cur_key;
        rt_thread_mdelay(10);   /* 10ms轮询间隔,兼作消抖 */
    }
}

/* 导出到MSH命令,便于动态运行 */
MSH_CMD_EXPORT(key_led_sample, key poll led sample);

/* 若需开机自动运行,取消下一行注释 */
/* INIT_APP_EXPORT(key_led_sample); */

编译与运行

  1. 将上述代码保存为 key_led_sample.c,放入工程的 applications 目录
  2. 在RT-Thread Studio中重新编译并下载固件到STM32开发板
  3. 打开串口终端(默认115200-8-N-1),复位开发板
  4. 在MSH命令行输入 key_led_sample 启动按键轮询任务

验证方法与判定标准

  • 按下按键并释放,LED状态应翻转一次(亮→灭或灭→亮)
  • 串口终端同步输出 LED ON 或 LED OFF,与LED实际状态一致
  • 快速连续按键时,每次按下只翻转一次,无抖动导致的多次翻转
  • 按住按键不放时LED不反复翻转,松开后再按下才再次翻转

若LED状态与按键动作不一致,优先检查按键是否接在PB0与GND之间、内部上拉是否生效,以及轮询间隔是否过大导致漏检。