EXTI+定时器消抖:按键中断的正确姿势 📅 2026/6/25 14:10:11 短文标题EXTI定时器消抖按键中断的正确姿势你有没有想过一个问题按键一按中断触发了。但按下瞬间触点弹跳中断进了好几次——怎么办EXTI检测边沿 定时器延时消抖。这才是按键中断的标准姿势。EXTI配置三步骤1. GPIO配置输入模式上拉/下拉确保不浮空GPIOA-CRL ~(0x0F 0);GPIOA-CRL | (0x08 0); // 上拉/下拉输入模式GPIOA-ODR | (1 0); // 使能内部上拉2. AFIO配置选择GPIO端口连接到EXTI线AFIO-EXTICR[0] ~(0x0F 0);AFIO-EXTICR[0] | (0x00 0); // PA0→EXTI03. EXTI配置边沿触发 中断使EXTI-FTSR | (1 0); // 下降沿触发按键按下EXTI-IMR | (1 0); // 中断使能NVIC_EnableIRQ(EXTI0_IRQn); // NVIC使能按键中断 定时器消抖标准流程中断服务函数里只做一件事启动定时器延时20ms不清除挂起位会反复触发。void EXTI0_IRQHandler(void){if (EXTI-PR (1 0)) {EXTI-PR (1 0); // 清挂起位TIM6-ARR 20000; // 20ms 1MHzTIM6-CR1 | TIM_CR1_CEN; // 启动定时器}}定时器中断里确认按键状态void TIM6_IRQHandler(void){if (TIM6-SR TIM_SR_UIF) {TIM6-SR ~TIM_SR_UIF;if (GPIO_ReadInputPin(GPIOA, GPIO_PIN_0) 0) {// 按键真的按下了执行动作}}}原理中断触发后等20ms躲过抖动期再读引脚电平确认。真按下了才处理抖动被滤除。为什么不能直接在EXTI中断里延时void EXTI0_IRQHandler(void){HAL_Delay(20); // ❌ 大忌}阻塞其他中断高优先级中断进不来浪费CPU20ms空转按键响应变慢中断处理时间太长中断线共享教程5.12节EXTI0连接PA0、PB0、PC0……多个引脚共享同一中断线。需要多个中断引脚时分散到不同编号PA0、PA1、PA2。如果只能同编号在中断里读各引脚电平判断。优先级配置建议教程5.6节按键中断的抢占优先级设中低如3~5不要设太高0留给紧急任务如过流保护。优先级太高会阻塞其他关键中断。这个故事的启示EXTI中断不是“检测到边沿就处理按键”而是“检测到边沿启动消抖流程”。中断只做标记定时器负责确认。别在中断里做耗时的事。写在最后按键中断的正确姿势EXTI触发→清挂起→启动定时器→定时器确认→处理按键。三步走抖动去无踪。本文灵感源于于振南《新概念ARM32单片机》教程第5.6节、第5.12节、第6.1节。觉得有用点赞、转发让更多人学会EXTI定时器消抖的标准流程。