news 2026/6/25 14:10:09

EXTI+定时器消抖:按键中断的正确姿势

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
EXTI+定时器消抖:按键中断的正确姿势

短文标题: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→EXTI0

3. 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 @ 1MHz

TIM6->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); // ❌ 大忌!

}

  1. 阻塞其他中断:高优先级中断进不来
  2. 浪费CPU:20ms空转
  3. 按键响应变慢:中断处理时间太长

中断线共享(教程5.12节),EXTI0连接PA0、PB0、PC0……多个引脚共享同一中断线。需要多个中断引脚时,分散到不同编号(PA0、PA1、PA2)。如果只能同编号,在中断里读各引脚电平判断。优先级配置建议(教程5.6节)按键中断的抢占优先级设中低(如3~5),不要设太高(0留给紧急任务如过流保护)。优先级太高会阻塞其他关键中断。

这个故事的启示,EXTI中断不是“检测到边沿就处理按键”,而是“检测到边沿启动消抖流程”。中断只做标记,定时器负责确认。别在中断里做耗时的事。

写在最后,按键中断的正确姿势:EXTI触发→清挂起→启动定时器→定时器确认→处理按键。三步走,抖动去无踪。


(本文灵感源于于振南《新概念ARM32单片机》教程第5.6节、第5.12节、第6.1节。)

觉得有用?点赞、转发,让更多人学会EXTI+定时器消抖的标准流程。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 14:08:13

如何用Ice彻底解决macOS菜单栏杂乱问题:5步打造高效工作空间

如何用Ice彻底解决macOS菜单栏杂乱问题&#xff1a;5步打造高效工作空间 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice 还在为macOS顶部菜单栏拥挤不堪而烦恼吗&#xff1f;每次找图标都要眯着眼睛…

作者头像 李华
网站建设 2026/6/25 14:07:50

RLAIF实战指南:用AI反馈替代人工标注的三大技术路径

1. 项目概述&#xff1a;当AI开始给AI打分&#xff0c;人类标注员真的要下岗了吗&#xff1f;最近在复现几个大模型对齐&#xff08;Alignment&#xff09;方向的前沿方案时&#xff0c;我重新翻出了去年底那篇被不少团队内部传阅的《The 3 RLAIF Approaches》。标题里那个“RL…

作者头像 李华
网站建设 2026/6/25 14:02:54

LangChain和LangGraph是什么

&#x1f9e0; 1. LangChain 是什么&#xff1f; LangChain 是一个大模型应用开发框架&#xff0c;核心作用是帮你把 LLM&#xff08;如 GPT&#xff09;和外部能力“拼装起来”。 它主要提供&#xff1a; Prompt 管理 RAG&#xff08;检索增强生成&#xff09; 工具调用&a…

作者头像 李华
网站建设 2026/6/25 14:02:42

100VIN,0.2A,耐高压LDO,XZ6203H

产品概述这款芯片采用CMOS工艺制造的低功耗、高压稳压芯片&#xff0c;支持输入80V&#xff0c;最高耐压100V。输出电流可达200mA。输出电压有3.3V,5.0V以及输出电压范围2.1V-12V的电压。固定电压输出的芯片&#xff0c;也可以结合外部元件&#xff0c;获得可变的电压和电流。产…

作者头像 李华
网站建设 2026/6/25 14:00:55

MCU引脚电压恒定原理、钳位机制与烧毁原因完整总结 MCU正常使用的IO口输出高电平永远稳定3.3V、低电平永远稳定0V

MCU引脚电压恒定原理、钳位机制与烧毁原因完整总结MCU的IO口之所以输出高电平永远稳定3.3V、低电平永远稳定0V&#xff0c;根本原因是IO推挽输出结构内部自带两颗MOS管硬钳位&#xff0c;并非软件设定电压&#xff0c;而是硬件物理连接决定。一、MCU推挽输出内部真实结构MCU每个…

作者头像 李华