STM32F407 包含10个内核中断82个可屏蔽中断通道。
中断向量表在启动文件 startup_stm32f40_41xxx.s 中设置,定义了各中断源对应的中断服务程序入口地址。
notion image

中断和嵌套向量中断控制器 (NVIC)

NVIC 寄存器定义 (NVIC_Type)

notion image
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_RETURN0xFFFFFFFD这样在执行BX LR 程序就能识别出中断结束的标志,从而进行出栈等一系列后续操作。
  • 出栈:处理器硬件会自动从堆栈中弹出之前保存的寄存器值,恢复到中断发生前的状态。
  • 清除活跃状态:中断活跃状态被清除。
  • 返回线程模式:处理器从“处理模式”切换回“线程模式”,继续执行之前被中断的程序。
notion image

处理器模式:

  • 线程模式 (Thread Mode):处理器正常执行应用程序。处理器可处于特权访问等级,也可处于非特权访问等级,由CONTROL寄存器设置
  • 处理模式 (Handler Mode):处理器执行中断服务程序,处理器总是具有特权访问等级

NVIC 的外设中断优先级 ❗❗

可编程的中断优先级包括抢占优先级响应优先级
  • 抢占优先级:优先级高的中断可以打断正在执行的优先级低的中断。
  • 响应优先级:当多个具有相同抢占优先级的中断同时到达时,响应优先级高的中断将首先得到响应。
  • 优先级设置:编号越小,优先级越高。STM32F4xx的NVIC优先级寄存器有效位数为4位 (Bit[7:4])。
notion image
  • 4个bit中哪几个bit表示抢占优先级/响应优先级可以设置
    • 优先级分组:这4个有效位如何划分为抢占优先级位和响应优先级位,由SCB (System Control Block) 的 AIRCR 寄存器的 PRIGROUP 字段 (bit[10:8]) 定义。
    • notion image

外部中断 EXTI (External Interrupt/Event Controller)

特点:

  • STM32F407有23个中断/事件源
  • IO口中断线有16路 (EXTI0-EXTI15)
  • 每个IO口 (Px0-Px15) 均可作中断输入
  • 相同编号的引脚 (如PA0, PB0...) 共用一个EXTI线
notion image

外部中断 EXTI 编程 (库函数):

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

NVIC 中断服务程序

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