中断的分类:从来源到优先级的维度划分
扫描二维码
随时随地手机看文章
嵌入式系统中的中断类型多样,按 “事件来源”“可屏蔽性”“处理机制” 等维度可分为不同类别,不同类型的中断在硬件实现、软件配置与应用场景上存在显著差异,理解这些差异是中断选型与配置的基础。
(一)按事件来源:外部中断与内部中断
外部中断的事件来源是 MCU 外部的外设或引脚,通常与 “外部输入信号” 相关,需要通过 GPIO 引脚或专用接口接收外部事件触发。最典型的外部中断是 “GPIO 外部中断”—— 当 GPIO 引脚的电平发生预设变化(高电平触发、低电平触发、上升沿触发、下降沿触发、双边沿触发)时,触发中断,如按键按下(引脚电平从高变低,下降沿触发)、传感器检测到目标(引脚从低变高,上升沿触发)。GPIO 外部中断的优势是灵活,可通过配置不同引脚与触发方式,适配多种外部设备;缺点是需要占用 GPIO 资源,且多个外部设备可能共享同一中断线(如 STM32 的 GPIO 端口按组共享中断,PA0-PG0 共享 EXTI0 中断),需在 ISR 中判断具体是哪个引脚触发的中断。
除了 GPIO 外部中断,还有 “专用外部设备中断”—— 由外部专用芯片(如触摸屏控制器、ADC 芯片)通过特定总线(如 SPI、I2C、中断线)向 MCU 发送中断请求,例如触摸屏检测到触摸时,通过中断线通知 MCU 读取触摸坐标;ADC 芯片完成一次采样时,通过中断线通知 MCU 读取采样结果。这类中断的优势是无需 MCU 持续轮询外部芯片状态,降低功耗与算力消耗。
内部中断的事件来源是 MCU 内部的模块,无需外部信号触发,通常与 “内部状态变化” 相关,如定时器中断、外设中断、异常中断。定时器中断是最常用的内部中断 —— 当定时器的计数达到设定值(如定时 1ms)或计数溢出时,触发中断,用于实现精准定时(如 LED 闪烁、电机 PWM 控制、数据采样周期控制)。例如,STM32 的 TIM2 定时器可配置为定时 1ms 中断,每 1ms 触发一次 ISR,在 ISR 中更新系统时间或检查传感器状态。
外设中断是内部中断的另一重要类别,由 MCU 内部的通信或功能外设(如串口 USART、SPI、I2C、DMA、USB)触发,用于处理外设的状态变化,如串口接收数据就绪、SPI 发送完成、DMA 传输完成、USB 设备连接。例如,串口 USART 的接收中断(RXNE)在接收缓冲区有数据时触发,确保 MCU 及时读取数据,避免缓冲区溢出导致数据丢失;DMA 传输完成中断在 DMA 将数据从内存传输到外设(如 SPI 发送)后触发,通知 MCU 进行后续处理(如更新发送缓冲区)。
异常中断(Exception)是一类特殊的内部中断,通常与 “系统故障” 或 “特殊指令” 相关,优先级高于普通中断,部分异常甚至不可屏蔽。例如,ARM Cortex-M 系列的 “HardFault” 异常(硬件故障)在发生内存访问错误(如空指针访问)、未定义指令、总线错误时触发,用于故障诊断与系统保护;“SysTick” 异常(系统滴答定时器)是内核自带的定时器中断,常用于生成操作系统的时间片,实现任务调度;“SWI” 异常(软件中断)由执行 SWI 指令触发,用于用户程序调用内核函数或操作系统服务。
(二)按可屏蔽性:可屏蔽中断与不可屏蔽中断
可屏蔽中断(Maskable Interrupt) 是指可通过软件配置(如中断使能位、全局中断使能位)禁止或允许的中断,占嵌入式中断的绝大多数,如 GPIO 中断、定时器中断、串口中断。可屏蔽中断的核心特点是 “灵活性”—— 用户可根据需求开启或关闭特定中断,例如在处理重要数据(如传感器校准参数写入 Flash)时,关闭所有可屏蔽中断,避免中断打断写入过程导致数据损坏;在数据处理完成后,重新开启中断,恢复正常响应。
不可屏蔽中断(NMI, Non-Maskable Interrupt) 是指无论全局中断使能位是否置位,都能强制触发的中断,优先级最高,仅用于处理 “危及系统安全” 的紧急事件,如电源欠压、硬件故障、外部紧急复位。NMI 的硬件设计通常具有 “不可屏蔽性”—— 中断请求信号直接连接到 MCU 内核,绕过常规的中断屏蔽逻辑;软件上也无法通过常规指令禁止 NMI(部分芯片支持 NMI 屏蔽,但需特殊权限且不推荐使用)。例如,工业控制系统中,当检测到电源电压低于阈值时,触发 NMI,在 NMI 的 ISR 中紧急保存关键数据(如生产进度、设备状态)到 Flash,避免数据丢失;汽车电子中,当检测到安全气囊触发信号时,触发 NMI,立即执行安全气囊展开控制,无需等待其他中断处理。
(三)按处理机制:向量中断与非向量中断
向量中断(Vectored Interrupt) 是指每个中断都有独立的 “中断向量”(即 ISR 入口地址),中断控制器可直接根据中断类型找到对应的 ISR 地址,无需 MCU 查询判断,响应速度快,是现代嵌入式 MCU 的主流中断机制。向量中断的核心是 “中断向量表”—— 在 MCU 的存储空间中,有一块专门的区域存储所有中断的 ISR 入口地址,每个中断对应一个固定的向量地址(如 STM32 的中断向量表中,EXTI0 中断对应 0x00000010 地址,TIM2 中断对应 0x0000002C 地址)。当中断触发时,中断控制器会自动根据中断类型,从向量表中读取对应的 ISR 地址,直接跳转执行,无需额外的查询代码,响应延迟可控制在微秒级。
非向量中断(Non-Vectored Interrupt) 是指多个中断共享一个 ISR 入口地址,中断触发后,MCU 需要在 ISR 中通过查询 “中断状态寄存器”,判断具体是哪个中断事件触发,再执行对应的处理逻辑。非向量中断的优势是硬件实现简单(无需独立向量表),但响应速度慢 —— 查询过程会增加中断延迟,且中断数量越多,查询时间越长,仅在早期 8 位 MCU(如 Intel 8051)或简单控制场景中使用。例如,8051 单片机的外部中断 0 与外部中断 1 共享部分查询逻辑,ISR 中需通过查询 TCON 寄存器的 IT0、IE0 位,判断是否为外部中断 0 触发。





