一、中断系统
中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行
中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源
中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回

中断优先级有响应优先级和抢占优先级,响应优先级就是按照优先级来一个个的排队。抢占优先级的话就是按照优先级直接把正在执行的中断暂停,执行抢占优先级高的中断。另外中断不需要调用,当达到中断的条件时硬件会自动执行。
二、NVIC
STM32中断
STM32 的中断系统是其实时性与高可靠性的基石,它为开发者提供了 68 个可屏蔽中断通道,覆盖了 EXTI 外部中断、TIM 定时器、ADC 模数转换、USART 串口、SPI/I2C 通信、RTC 实时时钟等几乎所有常用外设,能满足各类场景下的中断触发需求。
为了高效管理这些中断,STM32 采用了 NVIC(嵌套向量中断控制器)统一调度机制。每个中断通道都支持 16 个可编程的优先等级,开发者还可以对优先级进行分组,进一步配置抢占优先级和响应优先级。这一设计确保了高优先级的任务能及时抢占低优先级任务执行,在复杂的多中断场景下也能保证系统的响应效率与执行秩序。

NVIC的基本结构

在图的左侧,是 EXTI、TIM、ADC、USART 等外设模块。当外设触发中断事件时(比如按键按下、定时器溢出),并不会直接请求 CPU,而是先把中断信号发送给 NVIC。
图里外设和 NVIC 之间的 "n" 形开关,代表的是外设中断使能位。只有当这个开关 "闭合" 时,中断信号才能进入 NVIC。
NVIC 内部划分了优先级 0 到 15共 16 个等级(数值越小,优先级越高)。当多个外设的中断信号同时到达时,NVIC 会根据中断的优先级配置,决定谁先被转发给 CPU。
NVIC 会把最终的中断请求转发给 CPU。当 CPU 响应中断时,NVIC 会自动提供中断服务程序的入口地址,让 CPU 能精准跳转到对应的函数执行。执行完成后,NVIC 会协助 CPU 恢复现场,回到被中断的主程序继续执行。
NVIC优先级分组
NVIC 用 4 位二进制(0~15)来表示中断优先级,这 4 位可以切分成 抢占优先级 和 响应优先级 两部分。

分组号越大,抢占优先级的位数就越多,能支持的抢占嵌套层级也越多;反之,响应优先级的位数就越多,能支持的排队优先级就越细。
三、EXTI
EXTI简介
EXTI(Extern Interrupt)外部中断
EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序
支持的触发方式:上升沿/下降沿/双边沿/软件触发
支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断,如A0、B0不能同时触发中断,A0、B1能同时触发中断。
通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒
触发响应方式:中断响应/事件响应
EXTI的基本结构

输入层: GPIO 与外设信号
GPIOA、GPIOB、GPIOC 等端口的 16 个引脚信号,以及 PVD、RTC、USB、ETH 等片上外设的事件信号,是中断的源头。
选择层: AFIO (复用功能 IO )
它的核心作用是中断引脚选择,通过内部的多路选择器,从所有 GPIO 端口的同号引脚中,选出一个连接到 EXTI 线上。
重映射部分外设的引脚
例如,要让 GPIOB Pin 5 触发中断,就需要通过 AFIO 配置,将它映射到 EXTI5 线上。
检测层: EXTI (外部中断 / 事件控制器)
负责对输入信号做边沿检测及控制,可以配置为上升沿、下降沿或双边沿触发。
检测到有效边沿后,会生成中断请求,发送给 NVIC;也可以生成事件信号,直接触发其他外设的操作(无需 CPU 干预)。
最终输出 20 条中断线,包括独立的 EXTI0~EXTI4、共享的****EXTI9_5/EXTI15_10 ,以及外设专属中断线。
仲裁层: NVIC (嵌套向量中断控制器)
接收 EXTI 等外设的中断请求,根据你配置的抢占优先级 和响应优先级进行仲裁,决定哪个中断先被 CPU 响应。
EXTI的框架

1、信号入口:输入线
框图最右侧的 "输入线",就是来自 AFIO 的 20 条信号(GPIO 或外设信号)。
每条输入线对应独立的处理通道,支持并行处理。
2、边沿检测与触发选择
这是 EXTI 感知外部信号变化的核心环节:
上升沿 / 下降沿触发选择寄存器
你可以通过配置这两个寄存器,为每条输入线设置触发方式(上升沿、下降沿、双边沿)。
边沿检测电路
负责检测输入信号是否符合你设定的边沿条件,检测到有效边沿后,会输出一个触发信号。
3、中断与事件的分支处理
EXTI 最巧妙的设计,就是把同一个触发信号分成了 中断 和 事件 两条独立的处理路径。
中断路径(需要 CPU 响应)
请求挂起寄存器 :检测到有效触发后,对应位置 1,记录中断请求。
中断屏蔽寄存器 :如果对应位为 1(允许中断),则中断请求会通过 "或门" 发送给 NVIC。
至 NVIC 中断控制器 :这就是最终的中断请求信号,CPU 会根据优先级响应并执行中断服务函数。
事件路径(无需 CPU 干预)
事件屏蔽寄存器 :如果对应位为 1(允许事件),触发信号会进入 "脉冲发生器"。
脉冲发生器 :生成一个短脉冲,直接触发其他外设(如定时器、DMA)的操作,全程不需要 CPU 参与,效率极高。
4、软件触发与寄存器接口
软件中断 / 事件寄存器:可以通过软件直接置位,来触发中断或事件,常用于调试和测试。
外设接口:通过 AMBA APB 总线与 CPU 相连,让你可以通过读写寄存器来配置和控制 EXTI。
5、关键理解
中断是 "通知 CPU 干活":需要 CPU 响应并执行中断服务函数,有软件开销。
事件是 "硬件自动联动":不需要 CPU 介入,直接触发外设操作,是实现低功耗、高实时性的关键。
20 条线并行处理:每条输入线的触发检测、挂起、屏蔽都是独立的,互不影响。