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); */
编译与运行
- 将上述代码保存为
key_led_sample.c,放入工程的applications目录 - 在RT-Thread Studio中重新编译并下载固件到STM32开发板
- 打开串口终端(默认115200-8-N-1),复位开发板
- 在MSH命令行输入
key_led_sample启动按键轮询任务
验证方法与判定标准
- 按下按键并释放,LED状态应翻转一次(亮→灭或灭→亮)
- 串口终端同步输出
LED ON或LED OFF,与LED实际状态一致 - 快速连续按键时,每次按下只翻转一次,无抖动导致的多次翻转
- 按住按键不放时LED不反复翻转,松开后再按下才再次翻转
若LED状态与按键动作不一致,优先检查按键是否接在PB0与GND之间、内部上拉是否生效,以及轮询间隔是否过大导致漏检。