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

【嵌入式】外部中断的学习小坑记录

如果中断使用delay函数:

中断里的HAL_Delay()要等系统时基 tick 增加;而这个 tick 往往依赖 SysTick 中断。当前中断没退出时,SysTick 可能进不来,于是HAL_Delay()一直等,程序就卡住了。

这更像是:

中断里阻塞等待,结果把给它计时的人也堵住了。


所以应该怎么办?

中断里只做短、小、快的事

不要在中断里做:

  • HAL_Delay()
  • 长时间循环
  • 复杂计算
  • 串口长打印
  • 大量业务逻辑

那业务逻辑写在哪里?

一般分两层:

1)中断里:只做“事件登记”

比如:

  • 置一个标志位
  • 记录当前时间
  • 记录哪个按键来了
  • 极简单地翻一个状态

中断里适合做的是这种“快进快出”的事。


2)主循环while(1)里:做真正业务处理

比如:

  • 消抖
  • 判断长按短按
  • 切换 LED
  • 刷界面
  • 发串口
  • 状态机处理

所以大部分情况下,真正业务逻辑更推荐写在mainwhile(1)


最推荐的模式

这种按键外部中断,标准思路是:

中断里

只告诉主循环:

“有一个按键事件来了。”

比如:

volatileuint8_tkey6_event=0;voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin){if(GPIO_Pin==GPIO_PIN_5){key6_event=1;}}

主循环里

再真正处理:

while(1){if(key6_event==1){key6_event=0;HAL_Delay(20);// 消抖放这里,不放中断里if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_5)==GPIO_PIN_RESET){HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);}}HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_9);HAL_Delay(500);}

那中断里能不能直接写业务?

可以,但要满足一个条件:

这个业务必须非常短、非常快、不阻塞

比如这种就可以:

voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin){if(GPIO_Pin==GPIO_PIN_5){HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);}}

因为它只是翻转一个引脚,动作非常快。


所以到底怎么选?

情况1:逻辑特别简单

比如:

  • 按一下翻转一个 LED

可以直接写在中断里。


情况2:逻辑稍微复杂

比如:

  • 要消抖
  • 要判断长按短按
  • 要做延时
  • 要串口输出
  • 要修改多个状态

就不要全塞中断里,应该:

  • 中断里置标志
  • 主循环里处理业务

可以记一个经验法则

中断里做:

“通知”

while(1)里做:

“处理”


为什么主循环更适合做业务?

因为主循环里:

  • 可以安全用HAL_Delay
  • 可以慢慢判断状态
  • 不会长时间占住中断
  • 不容易影响别的外设响应

而中断里如果写太多,会带来这些问题:

  • 卡住别的中断
  • 响应变差
  • 调试困难
  • 出现这次这种“看起来死锁”的现象

例子1

volatileuint8_tkey6_pressed=0;voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin){if(GPIO_Pin==GPIO_PIN_5){key6_pressed=1;}}intmain(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();while(1){if(key6_pressed==1){key6_pressed=0;HAL_Delay(20);// 消抖放主循环if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_5)==GPIO_PIN_RESET){HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);}}HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_9);HAL_Delay(500);}}

小结

中断里不做阻塞延时,不做重业务;中断里只置标志,主循环里处理业务。

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

相关文章:

  • Git误删急救:30秒拯救你的代码
  • 深度解析贪心算法
  • 【程序员转型】开发者转型成为 AI 工程师指南,大模型入门到精通,收藏这篇就足够了!
  • 分析鲨鱼速装性价比好不好,和同行比价格贵不贵 - 工业设备
  • 8.4通过延迟补偿来提高实时性
  • 选 PyQt6 还是 PySide6?这可能是 Python GUI 开发中最“纠结”的问题
  • 3分钟搞定!OpenClaw 龙虾 + Kimi 联网搜索,小白也能上手
  • PHP搭建开发环境(Windows系统)
  • 2026年无锡碳纤维废气焚烧炉选购指南,源头厂家宜业环保分析 - mypinpai
  • 工厂生产 PLC ip 的都是一样的怎么才能避免冲突进行组网呢?
  • 全栈vue/react+node.js,云服务器windows部署全流程
  • 2026年实力强的聚氨酯瓦壳源头厂家排名,哪家更靠谱 - 工业推荐榜
  • 赛博朋克2077弹窗vcruntime140_1.dll丢失怎么办?安全修复步骤详解
  • 校园外卖软件
  • 代差级突破|2026 女性经期新选择:专属特殊膳食饮品深度评测
  • 收藏!2026春招AI风口爆发:岗位暴涨12倍、月薪超6万,程序员/小白必看学习指南
  • Java 网络爬虫笔记
  • 2026盘点重庆家具采购优质公司,源点宜联购优势突出 - 工业品网
  • Axure RP 9的初使用
  • 互联网大厂Java面试实战:以智慧物流场景为例深入探讨Spring Boot、微服务与Redis缓存
  • 2026年环氧防火涂料价格多少,怎么选靠谱品牌 - 工业品牌热点
  • BG3启动报错dll缺失终极修复指南:从平台验证到运行库安装
  • 用Web Components原生技术构建可复用的UI组件
  • 拿下36K的AI产品经理offer,他是如何实现职业转型的?
  • 霍尼韦尔 40-0001-99 DC-DC 转换器:工业高压供电的核心模块
  • 性价比高的防火堵料生产企业,省钱又好用的之选 - myqiye
  • 鸿蒙DevEvo Studio运行React Native生成的bundle文件遇到的一个问题
  • AI识别外星岩石成分:测试驱动下的天体化学革命
  • AI 之Tool Calling:让大模型像程序员一样“动手”解决问题
  • 新手必看:瑞祥卡线上回收注意事项与常见问题解答 - 团团收购物卡回收