NVIC中的不可屏蔽中断NMI(Non-Maskable Interrupt)是什么?
NVIC中的不可屏蔽中断NMI(Non-Maskable Interrupt)是什么?
在ARM Cortex-M系列处理器(如STM32、GD32等常用的微控制器)的嵌套向量中断控制器(NVIC)中,NMI 的全称是 不可屏蔽中断。
简单来说,NMI是一种具有最高优先级、无法通过软件(通常指在CPU中设置PRIMASK寄存器)被屏蔽或关闭的特殊类型中断。当NMI事件发生时,处理器必须立即响应它。
NMI的核心特点:
-
不可屏蔽
- 这是NMI最根本的特性。普通的可屏蔽中断可以通过设置CPU的全局中断使能位(如Cortex-M中的
PRIMASK
)来禁用,以防止中断打断关键代码的执行。 - 但NMI不受
PRIMASK
位的影响。即使你关闭了所有普通中断,NMI依然可以触发并被处理器响应。这确保了系统在最关键的错误或事件发生时,总能得到处理。
- 这是NMI最根本的特性。普通的可屏蔽中断可以通过设置CPU的全局中断使能位(如Cortex-M中的
-
固定高优先级
- 在NVIC的优先级中,NMI拥有仅次于硬件复位(Reset) 的优先级,并且高于任何可配置的异常和中断。
- 它的优先级是硬件固定的,数值上通常为**-2**(在Cortex-M中,数值越小,优先级越高),而复位(Reset)的优先级是-3。用户无法通过软件修改NMI的优先级。
-
独立的中断向量
- NMI在中断向量表中有自己固定的入口地址(通常是偏移量为8的位置)。当NMI发生时,CPU会自动跳转到这个固定的地址去执行对应的NMI服务函数。
NMI的典型应用场景:
由于NMI的不可屏蔽和高优先级特性,它通常被预留给那些最严重、最需要立即处理的系统级事件,以防止系统完全锁死或发生灾难性故障。常见来源包括:
-
时钟安全系统(CSS - Clock Security System)
- 当外部高速时钟(HSE)失效时,许多微控制器会触发NMI,并自动切换到内部RC时钟(HSI),以保证系统不会因为“心跳”停止而宕机。
-
存储器错误
- 某些芯片可能将Flash存储器操作错误或ECC校验错误连接到NMI,因为这些错误可能直接导致程序无法继续正确执行。
-
窗口看门狗(WWDG)
- 窗口看门狗超时通常意味着程序运行流程出现了严重偏差,需要最紧急的处理,因此它常常被连接到NMI。
-
外部硬件故障引脚(NMI Pin)
- 许多微控制器会有一个专用的外部NMI引脚。你可以将一个关键的硬件故障信号(如电源监控芯片的掉电警告)连接到此引脚。当电压低到危险程度时,该引脚会立即触发NMI,让CPU在系统断电前有最后的时间来保存关键数据或执行安全关机操作。
-
其他芯片厂商定义的严重错误
- 芯片制造商可以根据自己产品的特性,将其他他们认为至关重要的故障源映射到NMI。
与普通中断的区别总结:
特性 | NMI (不可屏蔽中断) | 普通中断 (IRQ) |
---|---|---|
可屏蔽性 | 不可屏蔽,总能触发 | 可屏蔽,可通过PRIMASK 位关闭 |
优先级 | 固定最高(仅次于复位),用户不可配置 | 优先级可软件配置 |
用途 | 处理极其严重的硬件错误或系统事件 | 处理常规的外设事件和软件中断 |
响应必要性 | 必须响应,否则系统可能失效 | 可根据系统状态延迟或忽略响应 |
总结
NMI是NVIC中一个用于处理最高级别紧急事件的安全机制。 它就像是一个医院的“急救代码蓝色”,任何情况下都不能被忽视,必须得到立即响应。它的存在极大地增强了嵌入式系统的鲁棒性和可靠性,确保在发生严重故障时,系统仍有机会执行最后的挽救措施,而不是直接“死机”。