ARM Cortex-M3/M4 內核(STM32、NXP LPC、TI Stellaris等)採用 NVIC 中斷控制器,其優先級機制分為組優先級(搶占優先級)和子優先級(響應優先級)。本文用最簡潔的規則總結與場景圖解,徹底理清「誰能搶誰、誰搶不了誰」的核心邏輯。
| 場景 | 當前執行中斷 | 新到達中斷 | 結果 |
|---|---|---|---|
| 組優先級不同 | 組級 2 | 組級 1 (更高) | 新中斷搶占,嵌套執行 |
| 組優先級不同 | 組級 1 | 組級 2 (更低) | 新中斷等待,不搶占 |
| 組優先級相同 | 組級 1,子級 0 | 組級 1,子級 1 | 新中斷等待,不搶占(同組不嵌套) |
| 組優先級相同 | 組級 1,子級 1 | 組級 1,子級 0 | 新中斷等待,不搶占(子級高也不行) |
Cortex-M3 提供 8 位優先級位,STM32 使用高 4 位,可配置 5 種分組:
// NVIC_PriorityGroupConfig 參數 NVIC_PriorityGroup_0: 0位組 | 4位子 → 1個組級,16子級 (無嵌套) NVIC_PriorityGroup_1: 1位組 | 3位子 → 2個組級,8子級 NVIC_PriorityGroup_2: 2位組 | 2位子 → 4個組級,4子級 ★推薦平衡 NVIC_PriorityGroup_3: 3位組 | 1位子 → 8個組級,2子級 NVIC_PriorityGroup_4: 4位組 | 0位子 → 16個組級,1子級 (純搶占)
NVIC_PriorityGroupConfig,全程不再更改// 系統初始化早期調用 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 關鍵中斷:USART1 接收 - 組級0,子級0(最高) NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_Init(&NVIC_InitStructure); // 普通中斷:定時器3 統計 - 組級2,子級1 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitStructure);
ARM Cortex-M 系列中斷搶占規則的核心只有一句話:「看組優先級定生死,同組優先級不搶占,子優先級只排隊」。牢記這一鐵律,配合合理的分組配置(推薦 Group 2)與分層優先級分配策略,即可構建確定性、可靠的實時中斷系統。