news 2026/9/30 6:02:58

基于外部中断的流水灯启停控制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于外部中断的流水灯启停控制

文章目录

  • [前言]
  • [一、开发硬件与软件环境]
  • [二、外部中断工作原理]
  • [三、Keil工程配置]
  • [四、硬件引脚与接线]
  • [五、完整程序代码]
  • [六、程序下载与运行现象]
  • [七、调试遇到的问题]
  • [八、总结]
    前言

前面已经实现了GPIO驱动流水灯,流水灯会按照固定间隔循环点亮LED。在实际使用场景中,常常需要外部信号介入,改变程序运行状态。
STM32外部中断EXTI可以检测IO引脚电平跳变,不需要CPU循环不断读取引脚电平,当电平发生变化时,CPU会暂停当前主循环,跳转执行中断服务函数,适合处理这类异步外部事件。
本次在原有流水灯工程基础上,增加外部中断,实现流水灯的暂停、继续控制。

一、开发硬件与软件环境

硬件:STM32F103C8T6最小系统板,LED发光二极管3个,杜邦线若干,面包板,ST‑LINK下载器
软件:Keil MDK5,STM32F10x标准外设库
芯片:STM32F103C8T6

二、外部中断工作原理

STM32F103支持IO口外部中断,PAPG的0‑15引脚可以映射到EXTI0EXTI15中断线。

  1. PA3配置为上拉输入模式,引脚默认高电平;当引脚接GND时为低电平。
  2. 将PA3映射到EXTI3中断线,配置为上升沿触发:当PA3由低电平跳变到高电平瞬间,产生外部中断请求。
  3. NVIC配置中断优先级,使能EXTI3中断通道。
  4. 触发中断后进入中断服务函数,翻转全局标志位run_flag。
    run_flag = 1:主循环内计时,流水灯正常切换LED。
    run_flag = 0:停止计时,LED保持当前状态,实现暂停。
  5. 中断处理完成必须清除中断挂起标志位,否则会反复进入中断。

本实验使用杜邦线模拟开关:
杜邦线插上,PA3连接GND → PA3为低电平,流水灯运行;
拔掉杜邦线,PA3变为高电平,产生上升沿,触发中断切换运行状态。

三、Keil工程配置

工程在流水灯已有工程副本基础上修改,不需要重新新建完整工程。

  1. 工程分组文件补充
    在STD_LIB分组添加两个库文件:

stm32f10x_exti.c:外部中断底层驱动
misc.c:NVIC中断优先级控制

  1. C/C++配置
    预定义宏:STM32F10X_MD,USE_STDPERIPH_DRIVER
    头文件包含路径保持标准库原有配置。
  2. 中断函数冲突处理
    打开stm32f10x_it.c,删除内部自带的空EXTI3_IRQHandler函数,避免多重定义编译报错,中断服务函数写在main.c内部。
  3. 魔术棒Debug、Utilities按照ST‑LINK下载器常规配置,选择ST‑Link Debugger。

四、硬件引脚与接线

引脚功能说明
PA0LED0输出,低电平点亮
PA1LED1输出,低电平点亮
PA2LED2输出,低电平点亮
PA3外部中断输入引脚,杜邦线连接GND模拟开关

接线说明:

  1. PA0、PA1、PA2分别接LED,LED串联限流电阻后接GND。
  2. 一根杜邦线一端固定接PA3,另一端手动接开发板GND;拔掉导线瞬间产生上升沿触发中断。
    注意:板子红色按键为RESET硬件复位按键,按下直接芯片重启,不能用作外部中断触发。

五、完整程序代码

六、程序下载与运行现象

  1. 编译工程,确认无Error警告,使用ST‑LINK下载程序至开发板,按下复位。
  2. 上电后,PA0点亮,间隔1秒依次切换PA0→PA1→PA2循环流水。
  3. 杜邦线保持PA3与GND接通,流水灯持续运行。
  4. 拔掉杜邦线断开PA3与GND,产生上升沿触发中断,流水灯立刻暂停,LED保持当前点亮状态。
  5. 再次插上、拔掉一次杜邦线,流水灯恢复运行,从暂停位置继续计时,不会直接回到PA0从头闪烁。

七、调试遇到的问题

  1. 误按开发板红色RESET按键,芯片硬件复位,所有全局变量清零,流水灯每次回到PA0。
    解决:RESET属于硬件复位,不能作为外部触发信号,使用PA3引脚杜邦线模拟开关。
  2. 编译报EXTI3_IRQHandler重复定义。
    解决:stm32f10x_it.c文件内部自带空的中断服务函数,删除该函数,只保留main.c中的中断函数。

八、总结

外部中断可以响应引脚电平跳变事件,不需要CPU持续轮询IO口,节省CPU资源。
本实验在原有流水灯代码基础上,配置GPIO为上拉输入,配置EXTI外部中断与NVIC中断优先级,在中断服务函数修改全局状态标志位。主循环读取标志位控制计时是否继续,实现流水灯在任意时刻暂停,恢复后接续之前状态运行。
同时调试过程也体会到中断开发两个关键点:中断标志必须手动清除;外部信号存在抖动,需要做消抖处理。

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

龙兴商务酒店入住哪个好,资质齐全的服务商筛选名录

想要找龙兴商务酒店,不少人都会先搜索龙兴商务酒店配套哪家全、推荐餐饮好的龙兴商务酒店、推荐位置好的龙兴商务酒店,想要选到资质齐全、体验靠谱的入住选择,并不是一件容易的事。随着龙盛新城产业布局逐步完善,越来越多的企业落…

作者头像 李华
网站建设 2026/9/30 6:01:30

Linux下CUDA安装与排错指南:从gzip报错到多版本切换

折腾过Linux装CUDA的朋友应该都体会过那种感觉:官网的安装步骤写得清清楚楚,就四五个命令,可自己执行起来不是缺这个依赖就是碰到报错,最后还得靠搜索引擎翻半天。我这些年在这上面踩过的坑加起来可以写一本小型故障手册了&#x…

作者头像 李华
网站建设 2026/9/30 5:59:41

WeKnora开源AI知识库部署实战:从RAG原理到本地调优

先说我最近在做的一件比较折腾的事:把手里几万字的内部材料、技术文档和会议纪要统一丢进一个能自己问答的知识库里。市面上方案翻了一圈,最后留在生产环境里的是腾讯微信团队开源的 AI 知识库 WeKnora。这项目不算新,但它把 RAG 从“论文里的…

作者头像 李华
网站建设 2026/9/30 5:59:39

用LLM批量生成个性化外贸开发信:提示词工程与实操避坑指南

刚帮一个做工业阀门出口的朋友整理开发信素材时,发现一个很有意思的对比:他花了两天人工打磨了三十封个性化邮件,效果一般;我拿其中一封作为样本,用 LLM 按他的客户清单批量扩写,半小时出稿上百封&#xff…

作者头像 李华
网站建设 2026/9/30 5:59:12

SAP SD销售凭证全解析:从订单到发票的完整链路

刚接触 SAP SD 模块的时候,我最容易犯的错就是把“销售凭证”四个字理解成一张销售订单。实际上,在 SAP 系统里,销售凭证是一个覆盖面非常大的概念,它既包括询价、报价,也包括销售订单、合同、交货单,甚至退…

作者头像 李华
网站建设 2026/9/30 5:59:07

用Trae和AGENTS.md搭建AI自维护知识库,告别手动整理

知识库这东西,几乎每个折腾过笔记软件的人都搭过。Notion、Obsidian、Logseq、飞书文档,工具换了一茬又一茬,最后真正能坚持用下去的没几个。问题不在于工具不好,而在于维护成本太高了——你今天记了十条笔记,过两周回…

作者头像 李华