
本文概述
按键检测是嵌入式入门必考,但面试官想听的不是“加个延时”,而是你懂不懂机械按键的抖动本质、外部中断的配置流程(EXTI/中断线/回调)、以及软件消抖的几种方案和各自的适用场景。本文从“按键抖动是机械接触产生的毛刺”讲起,讲STM32外部中断(EXTI)的配置、边沿触发选择、中断回调与标志清除,再对比延时消抖、状态机消抖、定时器扫描消抖,讲清为什么延时会阻塞、状态机为什么更优,强调消抖时长是经验量级、要以按键实际抖动波形为准。
核心要点
按键抖动是机械接触产生的多个毛刺,消抖要识别稳定的按下/释放,而不是直接采一次电平
STM32外部中断EXTI:GPIO复用→触发边沿配置→NVIC使能→中断回调,注意标志清除
边沿选择:上拉输入+下降沿、下拉输入+上升沿,取决于按键接法,需与硬件匹配
延时消抖简单但阻塞CPU;状态机消抖不阻塞、可扩展多按键,更工程化
消抖时长(如十几到几十毫秒量级)是经验值,最好按实际按键波形确认
长按/短按/双击等高级按键需要基于状态机或定时器扩展,不止是消抖
面试官考察点
考察点拆解
面试官问按键与外部中断,重点考察:第一,你懂不懂抖动为什么存在、消抖的本质是识别稳定状态;第二,你会不会配置STM32的外部中断(EXTI、触发边沿、NVIC、回调),这是很多新手会卡的地方;第三,你懂不懂软件消抖几种方案的取舍,能不能说出延时消抖的缺点和状态机的优点;第四,你会不会把按键扩展成长按、短按等实际功能。
追问方向:为什么不能直接读GPIO、边沿怎么选、中断里为什么不能延时、状态机消抖怎么实现、长按短按怎么做。
回答思路
答题主线
建议按“抖动本质 → 硬件接法 → EXTI配置 → 消抖方案 → 扩展应用”来答,先讲原理再落到代码级配置。
先讲抖动:机械接触产生的毛刺,直接采样不可靠。
讲硬件接法:上拉/下拉、按键接法决定触发边沿。
讲EXTI配置:GPIO复用、边沿、NVIC、回调、清标志。
讲消抖:延时 vs 状态机 vs 定时器,选型。
讲扩展:长按、短按、双击。
参考回答
我先讲按键消抖的本质,再讲STM32外部中断怎么配。
第一,抖动是什么。机械按键在按下或释放的瞬间,金属触点会多次接触分离,产生一串毛刺(抖动),持续几毫秒到几十毫秒。如果直接读GPIO电平,可能在抖动区误判多次,所以必须消抖——识别的是稳定的按下/释放状态,不是单次采样。
第二,硬件接法。常见接法:按键一端接GND,另一端接GPIO并上拉到VCC。按键未按下时GPIO读高,按下时读低。这种接法下,检测按下用下降沿触发(GPIO从高变低)。也可以按键接VCC、GPIO下拉,检测用上升沿。边沿选择必须和硬件接法匹配。
第三,STM32外部中断(EXTI)配置。大致流程:
GPIO配置:把按键引脚配置为输入(上拉或下拉),并使能时钟;
EXTI线连接:把GPIO连接到对应的EXTI线,配置触发边沿(上升沿/下降沿/双边沿);
NVIC使能:使能对应的EXTI中断;
中断回调:在回调函数里处理(HAL库是EXTI回调,标准库是中断函数),记得清除中断标志。
在中断回调里不要做耗时操作(比如大延时),只置标志或做快速处理,具体逻辑放到主循环。
第四,消抖方案。
延时消抖:检测到边沿后延时十几毫秒再读一次,确认电平稳定。简单但会阻塞CPU(尤其在主循环里),不适合实时性要求高的系统;
状态机消抖:用状态机跟踪按键状态(未按/按下确认/释放确认),定时扫描,只有状态稳定才输出有效事件。不阻塞、可扩展多按键、能区分长按短按,是工程上更推荐的方案;
定时器扫描:用定时器周期性扫描按键(如每几毫秒扫一次),结合状态机消抖,兼顾实时性与不阻塞。
消抖时长没有固定值,是经验量级(如10~30ms),最好用示波器看实际按键波形确认。
第五,扩展应用。基于状态机可以进一步实现长按、短按、双击:按下的持续时间决定长按/短按,双击需要检测两次稳定按下之间的间隔。这些都是状态机的自然扩展。

扫码关注





























