中断是嵌入式开发中最重要的基础概念之一,也是 STM32 从入门到进阶必须掌握的核心能力。本文面向 STM32 初学者,从零开始系统讲解中断的完整知识体系:先介绍中断的基础概念与作用,再深入 STM32 中断系统架构(NVIC、中断向量表、处理流程),接着讲解中断优先级的配置方法,最后通过外部中断(EXTI)实战带你完整走通标准库和 HAL 库的配置流程,并给出按键控制 LED 的完整工程示例。
建议阅读顺序:如果你是第一次接触中断,请按章节顺序依次阅读,先理解「什么是中断」和「中断执行过程」,再进入架构与优先级部分;如果你已有一定基础,可以直接跳到「五、中断配置完整步骤」和「七、常见问题与注意事项」对照实践。文中所有代码示例基于 STM32F103 、STM32F411系列,建议边读边在开发板上动手验证,遇到问题可随时回看对应章节的排查清单。
1.1 什么是中断
中断(Interrupt)是指 CPU 在正常执行程序的过程中,由于内部或外部事件的触发,暂时中止当前程序的执行,转而去处理该事件对应的服务程序,处理完毕后再回到原程序被打断的位置继续执行的过程。
类比理解:你正在看书(主程序),电话铃响了(中断触发),你在书页上夹个书签(保存现场),去接电话(中断服务函数),接完电话后回到书签位置继续看书(恢复现场、返回主程序)。

1.2 中断的作用
-
提高 CPU 效率:避免 CPU 不断轮询外设状态,让 CPU 在等待时处理其他任务。
-
实时响应:紧急事件可以立即得到处理,满足实时系统的要求。
-
实现多任务调度:操作系统利用 SysTick 等定时器中断实现任务切换。
-
低功耗支持:CPU 可进入休眠模式,由中断唤醒。
1.3 中断 vs 轮询
| 对比项 |
中断方式 |
轮询方式 |
|---|---|---|
| CPU 占用 |
低,事件到来时才响应 |
高,持续查询状态 |
| 响应速度 |
快,实时性好 |
取决于轮询周期 |
| 实现复杂度 |
较高,需配置中断和服务函数 |
简单,循环判断即可 |
| 适用场景 |
实时性要求高、事件频率低 |
事件频繁、实时性要求低 |
1.4 中断执行过程

二、STM32 中断系统架构




EXTI 中断线一共 23 个,其中外部 GPIO 的中断有 16 个。

EXTI流程
EXTI 可分为两大部分功能,一个是产生中断,另一个是产生事件,这两个功能从硬件上就有所不同。
首先我们来看图中红色虚线指示的电路流程。它是一个产生中断的线路,最终信号流入到 NVIC 控制器内。
输入线,EXTI 控制器有 23个中断/事件输入线,这些输入线可以通过寄存器设置为任意一个 GPIO,也可以是一些外设的事件。输入线一般是存在电平变化的信号。
边沿检测电路,它会根据上升沿触发选择寄存(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTSR)对应位的设置来控制信号触发。边沿检测电路以输入线作为信号输入端,如果检测到有边沿跳变就输出有效信号 1 给或门电路,否则输出无效信号0。而 EXTI_RTSR 和 EXTI_FTSR 两个寄存器可以控制器需要检测哪些类型的电平跳变过程,可以是只有上升沿触发、只有下降沿触发或者上升沿和下降沿都触发。
或门电路,它一个输入来自边沿检测电路,另外一个输入来自软件中断事件寄存器(EXTI_SWIER)。EXTI_SWIER允许我们通过程序控制就可以启动中断/事件线,这在某些地方非常有用。我们知道或门的作用就是有 1 就为 1,所以这两个输入随便一个有有效信号 1就可以输出 1 给下方的两个与门电路。
与门电路,它一个输入是前边的或门电路,另外一个输入来自中断屏蔽寄存器(EXTI_IMR)。与门电路要求输入都为 1 才输出 1,导致的结果是如果 EXTI_IMR 设置为 0 时,那不管或门电路的输出信号是 1 还是 0,最终与门电路输出的信号都为 0;
如果EXTI_IMR设置为1时,最终与门电路输出的信号才由或门电路的输出信号决定,这样我们可以简单的控制 EXTI_IMR 来实现是否产生中断的目的。与门 电路输出的信号会被保存到挂起寄存器(EXTI_PR)内,如果确定与门 电路输出为 1 就会把 EXTI_PR 对应位置 1。
上边的与门电路是将 EXTI_PR 寄存器内容输出到 NVIC 内,从而实现系统中断事件控制。
接下来我们来看看蓝色线指示的电路流程。它是一个产生事件的线路,最终输出一个脉冲信号。
产生事件线路是在或门电路之后与中断线路有所不同,之前电路都是共用的。
蓝线上方的与门电路,它一个输入来自前方或门 电路,另外一个输入来自事件屏蔽寄存器(EXTI_EMR)。如果 EXTI_EMR设置为 0时,那不管或门电路的输出信号是 1还是 0,最终编号 6 电路输出的信号都为 0;如果 EXTI_EMR 设置为 1 时,最终与门电路输出的信号才由或门 电路的输出信号决定,这样我们可以简单的控制 EXTI_EMR 来实现是否产生事件的目的。
脉冲发生器电路,当它的输入端,即蓝线与门电路的输出端,是一个有效信号 1 时就会产生一个脉冲;如果输入端是无效信号就不会输出脉冲。
蓝色线上下起伏的是一个脉冲信号,就是产生事件的线路最终的产物,这个脉冲信号可以给其他外设电路使用,比如定时器 TIM、模拟数字转换器 ADC 等等,这样的脉冲信号一般用来触发 TIM 或者 ADC开始转换。
产生中断线路目的是把输入信号输入到 NVIC,进一步会运行中断服务函数,实现功能,这样是软件级的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传输,属于硬件级的。
另外,EXTI是在 APB2总线上的,在编程时候需要注意到这点。
2.1 NVIC 嵌套向量中断控制器
STM32(基于 Cortex-M 内核)的中断管理由 NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)负责。NVIC 是内核的一部分,与 CPU 紧密耦合,支持:
-
可嵌套中断(高优先级中断可打断低优先级中断)
-
向量中断(自动定位中断服务函数入口,无需软件查询)
-
动态优先级调整
-
中断屏蔽(除 HardFault 外,所有中断均可被屏蔽)
2.2 中断向量表
中断向量表是一个存放中断服务函数入口地址的数组,位于存储器起始地址(默认 0x08000000)。每个中断源对应一个固定的向量编号和偏移地址。
以 STM32F103 为例,向量表前几项如下:
| 向量编号 |
中断源 |
说明 |
|---|---|---|
| 0 |
— |
初始栈顶地址(MSP) |
| 1 |
Reset |
复位中断,程序入口 |
| 2 |
NMI |

9904



被折叠的 条评论
为什么被折叠?



