当前位置: 首页 > news >正文

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+定时器消抖的标准流程。

http://www.jsqmd.com/news/1075303/

相关文章:

  • 终极指南:如何用Blender插件实现Unreal PSK/PSA文件导入导出
  • 三步掌握BilibiliDown:你的B站视频离线宝库
  • Ryujinx:终极Nintendo Switch模拟器完整指南与快速上手教程
  • Hadoop 序列化与 HDFS 连接:从入门到踩坑全记录
  • RLAIF实战指南:用AI反馈替代人工标注的三大技术路径
  • 先引入一个简单的例子,给定一个 4 个节点 4 条边的有向带权图:
  • 临床数据难转化成果?打通临床统计与医工协同的数字化方案
  • ERNIE-Image-Turbo轻量化图像生成与OpenMementos记忆压缩实战
  • WebKitGTK架构下的高效浏览器实现:Midori的模块化设计与性能优化
  • 8 年前的老代码 + 20 刀 AI token = 我的第一款独立产品
  • 应急响应web2
  • Fresco:Facebook 出品的 Android 图片加载库,1.7 万 Star 不是白来的
  • 家用录歌人声降噪美化音乐编辑器工具盘点
  • OBS背景移除插件深度解析:基于ONNX Runtime的实时人像分割技术实战指南
  • 我们是如何管理多环境(开发、测试、生产)配置的?
  • 从规则引擎到大语言模型:NLP范式迁移的工程本质
  • 3分钟搞定Mac NTFS读写难题:Free-NTFS-for-Mac免费终极解决方案
  • 3步掌握League Toolkit:英雄联盟智能助手的完整实践指南
  • 直播切片批量投流:用易元AI规避暗水印同源检测风险
  • 10分钟掌握AI驱动测试自动化:Testsigma完整实践指南
  • 【OpenClaw】通过 Nanobot 源码学习架构---(10)Heartbeat
  • 为什么Free-NTFS-for-Mac是Mac用户解决NTFS读写的最佳方案?
  • Java反序列化漏洞实战:从JNDI注入到恶意服务器搭建
  • 必火AI数字人视频制作从零到一:平台选型、形象定制与批量生产全攻略
  • Bebas Neue字体完全指南:免费开源标题字体的5大核心优势与实战应用
  • 企业官方网站翻译:全球化沟通的专业基石
  • 3分钟快速配置:基于YOLOv5的智能象棋AI辅助系统终极指南
  • FModel实战宝典:3大核心场景解锁虚幻引擎游戏资源逆向分析
  • 采购数据战略不是项目,而是持续演进的生命周期
  • 3步搞定AI转PSD:矢量图层完整保留的终极方案