STM32F407 包含10个内核中断和82个可屏蔽中断通道。❗
中断向量表在启动文件
startup_stm32f40_41xxx.s
中设置,定义了各中断源对应的中断服务程序入口地址。
中断和嵌套向量中断控制器 (NVIC)
NVIC 寄存器定义 (NVIC_Type
)
NVIC_Type
)
NVIC 的寄存器通过
NVIC_Type
结构体访问。主要寄存器包括:ISER[]
: 中断置位使能寄存器 (Interrupt Set Enable Register)。置1允许中断。
ICER[]
: 中断清除使能寄存器 (Interrupt Clear Enable Register)。写1禁止中断。
ISPR[]
: 中断置位挂起寄存器 (Interrupt Set Pending Register)。置1挂起中断。
ICPR[]
: 中断清除挂起寄存器 (Interrupt Clear Pending Register)。写1清除挂起。
IABR[]
: 中断活动位寄存器 (Interrupt Active bit Register)。只读,某位置1表示中断正在执行或等待执行。
IP[]
: 中断优先级寄存器 (Interrupt Priority Register)。每个中断占1字节,STM32F4xx通常用高4位。
STIR
: 软件触发中断寄存器 (Software Trigger Interrupt Register)。
中断的挂起和激活 ❗
中断响应过程❗
中断响应过程是微控制器处理外部或内部事件的关键机制,它使得处理器能够暂停当前正在执行的程序,转而去处理更紧急或优先级更高的任务。
中断请求的产生与挂起(Pending)状态置位:
- 中断请求:当某个外设(如定时器、串口、GPIO 等)发生了一个需要处理器处理的事件时,它会产生一个中断请求信号
- 挂起状态置位:一旦中断请求产生,它就会导致对应的“中断挂起状态 X”被置位。这表示该中断已经发出请求,正在等待处理器的响应。此时,处理器可能仍在执行线程模式下的代码。
处理器对中断请求的查询与条件判断:
- NVIC (Nested Vectored Interrupt Controller) 会持续查询是否有中断挂起(Pending)以及其优先级是否足够高。
- 处理器在每个机器周期(或特定周期)的某个时间点会进行中断查询。
- 如果当前没有更高优先级的中断正在处理,并且中断满足响应条件(例如:该中断被使能、总中断开放、当前指令执行完毕等),处理器将准备响应此中断。
进入中断处理程序:压栈与取向量:
一旦中断被响应,处理器会停止当前正在执行的“线程模式”下的操作。
- 自动压栈:为了保存当前程序的状态以便中断服务程序执行完毕后能正确返回,处理器硬件会自动将一些重要的寄存器(如程序计数器 PC、链接寄存器 LR、程序状态寄存器 PSR 等,通常是 8 个寄存器,如果开启浮点功能会更多)的值压入堆栈。这个过程被称为“压栈”。
- 进入处理模式:处理器从“线程模式”切换到“处理模式(Handler Mode)”。在处理模式下,处理器总是具有特权访问等级。
- 取向量:处理器根据中断源的编号,从中断向量表中获取对应中断服务程序的入口地址。
- 激活状态置位:在进入中断处理程序的同时,“中断活跃状态 X”会被置位。这表示该中断当前正在被处理器执行。
- 清除挂起状态:一旦进入中断处理程序,对应的“中断挂起状态 X”会被硬件自动清除。
执行中断服务程序:
- 处理器跳转到从向量表中获取的中断服务程序入口地址,开始执行中断服务程序(Interrupt Service Routine, ISR)。
- 在中断服务程序内部,通常需要通过软件清除产生中断的外设的中断请求标志位,防止在中断服务程序执行完毕后,由于中断请求标志仍然存在而再次触发相同的中断。
中断服务程序结束与返回:
- 中断服务程序执行完毕后,会遇到一条中断返回指令,通常是
RETI
(对于 8051) 或BX LR
(LR是链接寄存器)。 - ❗一般而言,LR会保存函数/子程序返回的地址
- ❗但是在响应中断/异常的时候,为了和上面两种情况区分,LR被保存为特殊的
EXC_RETURN
,0xFFFFFFFD
,这样在执行BX LR
程序就能识别出中断结束的标志,从而进行出栈等一系列后续操作。
- 出栈:处理器硬件会自动从堆栈中弹出之前保存的寄存器值,恢复到中断发生前的状态。
- 清除活跃状态:中断活跃状态被清除。
- 返回线程模式:处理器从“处理模式”切换回“线程模式”,继续执行之前被中断的程序。

处理器模式:
- 线程模式 (Thread Mode):处理器正常执行应用程序。处理器可处于特权访问等级,也可处于非特权访问等级,由CONTROL寄存器设置
- 处理模式 (Handler Mode):处理器执行中断服务程序,处理器总是具有特权访问等级
NVIC 的外设中断优先级 ❗❗
可编程的中断优先级包括抢占优先级和响应优先级❗
- 抢占优先级:优先级高的中断可以打断正在执行的优先级低的中断。
- 响应优先级:当多个具有相同抢占优先级的中断同时到达时,响应优先级高的中断将首先得到响应。
- 优先级设置:编号越小,优先级越高。STM32F4xx的NVIC优先级寄存器有效位数为4位 (Bit[7:4])。

- 4个bit中哪几个bit表示抢占优先级/响应优先级可以设置
- 优先级分组:这4个有效位如何划分为抢占优先级位和响应优先级位,由SCB (System Control Block) 的
AIRCR
寄存器的PRIGROUP
字段 (bit[10:8]) 定义。

外部中断 EXTI (External Interrupt/Event Controller)
特点:
- STM32F407有23个中断/事件源
- IO口中断线有16路 (EXTI0-EXTI15)
- 每个IO口 (Px0-Px15) 均可作中断输入
- 相同编号的引脚 (如PA0, PB0...) 共用一个EXTI线

外部中断 EXTI 编程 (库函数):
- GPIO 初始化:配置中断引脚为输入模式。
- 选择 EXTI 线与 GPIO 引脚连接:
SYSCFG_EXTILineConfig()
。
- EXTI 初始化:
EXTI_InitTypeDef
配置模式、触发方式、使能状态,调用EXTI_Init()
。
- NVIC 初始化:
NVIC_InitTypeDef
配置中断通道、优先级、使能状态,调用NVIC_Init()
。

NVIC 中断服务程序
- 函数命名在启动文件中预定义,如
EXTI15_10_IRQHandler
。
- 程序中需判断具体中断线,处理后清除中断挂起标志位 (
EXTI_ClearITPendingBit()
)。