STM32 怎么读取按键的长按和短按?

STM32 · 1 浏览
STM32 怎么读取按键的长按和短按?

回答(4)

如果按键要支持长按重复触发(比如按住加速),可以在长按后每隔100ms再触发一次,用状态机管理更清晰。
硬件工程师李工 · 2026-08-17
建议加个消抖标志,比如连续读5次都是低电平才算按下,不然机械按键抖动会误判时间。
码农小王 · 2026-08-17
我用的是外部中断+定时器,按下时启动定时器,释放时读计数值,比轮询省CPU,但注意中断里别做耗时操作。
嵌入式老张 · 2026-08-17
在STM32中区分长按和短按,核心是记录按键按下到释放的时间差。推荐用定时器或系统节拍(如HAL_GetTick())实现非阻塞检测。 **基础思路**: 1. 在GPIO中断或轮询中检测下降沿(按下),记录时间戳t_press。 2. 检测上升沿(释放),计算t_release - t_press。 3. 若差值 > 阈值(如1000ms)判为长按,否则为短按。 **示例代码(轮询+状态机)**: ```c uint32_t press_time = 0; bool is_pressed = false; void Key_Scan(void) { if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET) { if (!is_pressed) { is_pressed = true; press_time = HAL_GetTick(); } } else { if (is_pressed) { is_pressed = false; uint32_t duration = HAL_GetTick() - press_time; if (duration > 1000) { // 长按处理 } else { // 短按处理 } } } } ``` **实操建议**: - 使用定时器中断(如1ms)定期调用Key_Scan,避免主循环阻塞。 - 增加消抖(延时10-20ms)防止误触发。 - 若需区分长按后释放还是长按持续,可增加状态机(按下、等待释放、长按触发)。 注意:长按阈值需根据应用调整,并考虑按键硬件特性(如机械抖动)。
mcuku 阿沐 · 2026-08-17