
文章目录[前言][一、开发硬件与软件环境][二、外部中断工作原理][三、Keil工程配置][四、硬件引脚与接线][五、完整程序代码][六、程序下载与运行现象][七、调试遇到的问题][八、总结]前言前面已经实现了GPIO驱动流水灯流水灯会按照固定间隔循环点亮LED。在实际使用场景中常常需要外部信号介入改变程序运行状态。STM32外部中断EXTI可以检测IO引脚电平跳变不需要CPU循环不断读取引脚电平当电平发生变化时CPU会暂停当前主循环跳转执行中断服务函数适合处理这类异步外部事件。本次在原有流水灯工程基础上增加外部中断实现流水灯的暂停、继续控制。一、开发硬件与软件环境硬件STM32F103C8T6最小系统板LED发光二极管3个杜邦线若干面包板ST‑LINK下载器软件Keil MDK5STM32F10x标准外设库芯片STM32F103C8T6二、外部中断工作原理STM32F103支持IO口外部中断PAPG的0‑15引脚可以映射到EXTI0EXTI15中断线。PA3配置为上拉输入模式引脚默认高电平当引脚接GND时为低电平。将PA3映射到EXTI3中断线配置为上升沿触发当PA3由低电平跳变到高电平瞬间产生外部中断请求。NVIC配置中断优先级使能EXTI3中断通道。触发中断后进入中断服务函数翻转全局标志位run_flag。run_flag 1主循环内计时流水灯正常切换LED。run_flag 0停止计时LED保持当前状态实现暂停。中断处理完成必须清除中断挂起标志位否则会反复进入中断。本实验使用杜邦线模拟开关杜邦线插上PA3连接GND → PA3为低电平流水灯运行拔掉杜邦线PA3变为高电平产生上升沿触发中断切换运行状态。三、Keil工程配置工程在流水灯已有工程副本基础上修改不需要重新新建完整工程。工程分组文件补充在STD_LIB分组添加两个库文件stm32f10x_exti.c外部中断底层驱动misc.cNVIC中断优先级控制C/C配置预定义宏STM32F10X_MD,USE_STDPERIPH_DRIVER头文件包含路径保持标准库原有配置。中断函数冲突处理打开stm32f10x_it.c删除内部自带的空EXTI3_IRQHandler函数避免多重定义编译报错中断服务函数写在main.c内部。魔术棒Debug、Utilities按照ST‑LINK下载器常规配置选择ST‑Link Debugger。四、硬件引脚与接线引脚功能说明PA0LED0输出低电平点亮PA1LED1输出低电平点亮PA2LED2输出低电平点亮PA3外部中断输入引脚杜邦线连接GND模拟开关接线说明PA0、PA1、PA2分别接LEDLED串联限流电阻后接GND。一根杜邦线一端固定接PA3另一端手动接开发板GND拔掉导线瞬间产生上升沿触发中断。注意板子红色按键为RESET硬件复位按键按下直接芯片重启不能用作外部中断触发。五、完整程序代码六、程序下载与运行现象编译工程确认无Error警告使用ST‑LINK下载程序至开发板按下复位。上电后PA0点亮间隔1秒依次切换PA0→PA1→PA2循环流水。杜邦线保持PA3与GND接通流水灯持续运行。拔掉杜邦线断开PA3与GND产生上升沿触发中断流水灯立刻暂停LED保持当前点亮状态。再次插上、拔掉一次杜邦线流水灯恢复运行从暂停位置继续计时不会直接回到PA0从头闪烁。七、调试遇到的问题误按开发板红色RESET按键芯片硬件复位所有全局变量清零流水灯每次回到PA0。解决RESET属于硬件复位不能作为外部触发信号使用PA3引脚杜邦线模拟开关。编译报EXTI3_IRQHandler重复定义。解决stm32f10x_it.c文件内部自带空的中断服务函数删除该函数只保留main.c中的中断函数。八、总结外部中断可以响应引脚电平跳变事件不需要CPU持续轮询IO口节省CPU资源。本实验在原有流水灯代码基础上配置GPIO为上拉输入配置EXTI外部中断与NVIC中断优先级在中断服务函数修改全局状态标志位。主循环读取标志位控制计时是否继续实现流水灯在任意时刻暂停恢复后接续之前状态运行。同时调试过程也体会到中断开发两个关键点中断标志必须手动清除外部信号存在抖动需要做消抖处理。