在 STM32 微控制器的中断系统中,外部中断 / 事件控制器(EXTI)与嵌套向量中断控制器(NVIC)是支撑中断响应与调度的核心组件,二者分工明确又紧密协同 ——EXTI 负责感知外部信号触发并向 NVIC 传递中断请求,NVIC 则承担中断优先级管理与 CPU 中断响应的调度,共同构建起 STM32 高效、灵活的中断处理体系。无论是外部设备的状态变化响应(如按键触发、传感器数据就绪),还是内部外设的事件通知(如定时器溢出、DMA 传输完成),都依赖这两个组件的协同工作,其底层逻辑的合理性直接决定了 STM32 系统的实时性与可靠性,是嵌入式开发者必须深入掌握的核心技术。
EXTI 作为 STM32 中断系统的 “信号感知前端”,其核心功能是检测外部引脚或内部外设的特定事件(如电平变化、脉冲信号),并将符合条件的事件转换为中断请求信号传递给 NVIC。从硬件架构来看,EXTI 主要由事件请求线路、边沿检测电路、中断屏蔽寄存器、挂起寄存器等模块组成,支持多达 23 个中断 / 事件请求通道,涵盖 16 个外部 GPIO 引脚对应的通道(EXTI0~EXTI15)以及 7 个内部外设事件通道(如 LVD、RTC 闹钟、USB 唤醒等)。对于外部 GPIO 引脚触发的中断,EXTI 通过 GPIO 与 EXTI 的映射关系实现信号接入 ——STM32 的每个 GPIO 引脚可通过 SYSCFG_EXTICR 寄存器配置映射到对应的 EXTI 通道,例如 PA0、PB0、PC0 等引脚均可映射到 EXTI0 通道,但同一时刻仅能有一个 GPIO 引脚与该通道绑定,避免信号冲突。边沿检测电路是 EXTI 的核心检测单元,支持上升沿触发、下降沿触发或双边沿触发三种模式,开发者可通过 EXTI_RTSR(上升沿触发选择寄存器)和 EXTI_FTSR(下降沿触发选择寄存器)灵活配置,例如在按键检测场景中,为避免机械抖动导致的误触发,可配置为双边沿触发并配合软件延时消抖逻辑。当 EXTI 检测到符合配置的触发信号后,会在挂起寄存器(EXTI_PR)中对应位置 1 标记中断请求,若该通道未被中断屏蔽寄存器(EXTI_IMR)屏蔽,则中断请求会被发送至 NVIC 等待响应。此外,EXTI 还支持事件模式,与中断模式的区别在于事件模式仅触发内部硬件操作(如启动 ADC 采样、激活 DMA 传输),不会向 NVIC 发送中断请求,无需 CPU 干预,适用于需要硬件级快速响应的场景。
NVIC 作为 STM32 中断系统的 “调度核心”,遵循 ARM Cortex-M 内核的中断控制架构,负责接收来自 EXTI 及其他外设的中断请求,根据预设的优先级规则决定中断的响应顺序,并管理 CPU 的中断进入与退出。其核心特性体现在优先级管理与中断嵌套机制上 ——NVIC 支持多达 256 个中断通道(实际可用数量取决于具体 STM32 型号,如 STM32F1 系列支持 60 个可屏蔽中断),每个中断通道都可配置优先级,优先级由抢占优先级和响应优先级组成,通过 NVIC_IPRx 寄存器设置。抢占优先级决定了中断的抢占能力,高抢占优先级的中断可在低抢占优先级中断的执行过程中强制打断,实现中断嵌套;响应优先级则用于当多个中断具有相同抢占优先级时,决定中断的响应顺序,响应优先级数值越小,优先级越高。例如,若串口接收中断的抢占优先级为 1,定时器溢出中断的抢占优先级为 2,那么当定时器中断正在执行时,串口接收中断可抢占 CPU 资源优先执行;若两者抢占优先级相同,响应优先级数值更小的中断会优先被响应。NVIC 还提供中断使能 / 失能控制、中断挂起 / 解挂等功能,开发者可通过 NVIC_ISERx(中断使能寄存器)和 NVIC_ICERx(中断失能寄存器)控制特定中断的开启与关闭,通过 NVIC_ISPRx(中断挂起寄存器)和 NVIC_ICPRx(中断解挂寄存器)手动挂起或清除中断请求,适用于复杂系统中中断资源的动态管理。当 NVIC 决定响应某个中断请求时,会暂停当前正在执行的程序,保存程序计数器、寄存器等上下文信息,然后跳转到该中断对应的中断服务函数(ISR)执行,执行完成后恢复上下文并返回原程序,整个过程由硬件自动完成,确保中断响应的高效性。