1. 中断向量表(Interrupt Vector Table)

  • 物理位置:位于 Flash 起始地址(0x00000000),存储各中断服务函数(ISR)的入口地址。
  • 组成
    • 前两个条目为栈顶指针(MSP)和复位向量(Reset Handler)。
    • 后续条目对应各类中断源(如 TIM2、USART1 等)的 ISR 地址。
  • 重定位:可通过SCB->VTOR寄存器将向量表移至 SRAM(如调试时)。

示例结构

地址       中断类型
----------------------
0x00000000 MSP
0x00000004 Reset Handler
0x00000008 NMI
0x0000000C HardFault
...
0x00000040 EXTI0_IRQHandler
0x00000044 EXTI1_IRQHandler
...

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

NVIC 是 Cortex-M 内核的一部分,负责管理中断的优先级和使能。核心寄存器包括:

  • ISER(中断使能寄存器):每个位对应一个中断源,置 1 使能中断。
  • ICER(中断清除寄存器):置 1 禁用中断。
  • IPR(中断优先级寄存器):每个中断对应 8 位,实际使用位数由芯片决定(如 STM32 通常用 4 位)。
  • STIR(软件触发中断寄存器):通过写值触发指定中断。

3. 优先级分组与抢占机制

  • 优先级位分配
    • STM32 将 4 位优先级分为抢占优先级子优先级
    • 通过NVIC_PriorityGroupConfig()配置分组方式(如NVIC_PriorityGroup_2表示 2 位抢占 + 2 位子优先级)。

  • 抢占规则
    • 高抢占优先级的中断可打断低抢占优先级的 ISR(嵌套)。
    • 相同抢占优先级的中断按相应优先级先级排队
    • 抢占优先级和响应优先级都相同,按照自然优先级进行排队

4. 中断处理流程(硬件级)

  1. 中断发生:外设(如 USART)置位对应中断标志位。
  2. NVIC 判断:检查中断是否使能且优先级高于当前执行的代码。
  3. 上下文保存
    • CPU 自动保存 8 个寄存器(R0-R3、R12、LR、PC、PSR)到当前栈(MSP 或 PSP)。
    • 压栈后 PC 指向向量表中对应中断的 ISR 地址。
  4. 执行 ISR:跳转到中断服务函数。
  5. 上下文恢复
    • ISR 执行完毕后,通过BX LR指令触发硬件从栈中恢复寄存器。
    • LR 寄存器的特殊值(如 0xFFFFFFF9)指示 CPU 执行中断返回流程。

5. 特殊寄存器详解

SCB->AIRCR(应用中断和复位控制寄存器)
  • 位 [10:8]:配置中断优先级分组(PRIGROUP 位段)。
  • 位 [31:16]:写入密钥(0x05FA)以修改寄存器。
NVIC->IPRx(中断优先级寄存器)
  • 每个寄存器管理 4 个中断的优先级。
  • 例如NVIC->IPR[0]管理中断 0~3 的优先级,每个中断占 8 位。
EXTI 控制器(外部中断)
  • IMR(中断屏蔽寄存器):使能 / 屏蔽 EXTI 线,某一位置一对应的那条线就被屏蔽
  • EMR(事件屏蔽寄存器):使能 / 屏蔽事件触发,使用较少
  • RTSR/FTSR(上升 / 下降沿触发选择寄存器):配置触发条件。1允许上升沿触发/下降沿触发,0禁止触发。
  • PR(挂起寄存器):中断发生后置位,需软件清零。检测到中断对应的位置一。清除位,在该位写1即可清除。

位19只适用于互联型产品,对于其他产品为保留位

6. 中断与异常的区别

  • 中断:由外部设备或外设触发(如 GPIO、定时器)。
  • 异常:由内核内部事件触发(如复位、错误、系统调用)。
  • 异常同样通过向量表处理,但优先级固定(如复位最高,为 - 3;NMI 为 - 2)。

7. 性能考量

  • 中断延迟:从外设产生中断到 ISR 执行的时间,主要由上下文保存和压栈操作决定。
  • 临界区:使用__asm("CPSID I")__asm("CPSIE I")指令关闭 / 开启全局中断,需谨慎使用以避免死锁。

8. 图片参考

9. 代码实验

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐