机械按键闭合或释放并不是理想的0→1单次跳变。触点会在很短时间内多次接触和分离,所以GPIO可能看到一串边沿。面试官问消抖,通常是在判断你有没有把真实波形、IRQ处理和状态机设计联系起来。
示波器实测能看到一次按键动作包含多个高低跳变。抖动持续时间不是一个固定常数,会随开关结构、老化、按压力度和电气条件变化。

软件消抖不是“固定延时”
外部中断不要直接把每个边沿都当成一次按键
中断可以只记录“发生了变化”并启动后续定时判断,避免在ISR里阻塞延时。
时间滤波要验证,不要背固定20ms
可以周期采样并要求连续若干次状态一致,或采用状态机判断稳定按下/稳定释放;阈值应通过器件规格和实测确定。
按下和释放都可能抖
如果应用既关心按下又关心松开,就要对两个方向分别验证,而不是只过滤一个边沿。
高可靠场景可硬件+软件一起做
RC、施密特输入能降低毛刺敏感度,软件再完成稳定状态判定,但硬件时间常数也不能大到让合法快速操作丢失。
面试参考回答
我会先确认输入脚是否有合适的上拉/下拉和施密特特性,再用示波器看实际按键波形。软件上不会在外部中断里直接delay消抖,而是把中断当成事件入口,通过定时器或周期任务判断输入是否连续稳定。消抖时间不使用固定经验值硬套,而是结合开关实测和产品允许的响应时间确定。对于需要长按、双击等功能,还会把“物理稳定状态”和“用户事件识别”分成两层。
可能继续问
为什么在中断服务函数里直接延时不是好办法?
连续采样法和“一段时间后再读一次”各有什么边界?
长按、短按、双击功能应该和消抖逻辑放在同一层吗?
不要这样答
回答只有“延时20ms再读一次”。
忽略释放过程也会出现抖动。
把抖动、多击识别和长按计时混在一个不可维护的if/else里。

扫码关注






























