STM32(Cortex-M3/M4內核)的中斷控制器(NVIC)採用雙級優先級機制:搶占優先級與響應優先級(又稱子優先級/亞優先級)。理解這一機制對於編寫可靠的中斷嵌套程序至關重要。本文系統梳理優先級邏輯、分組配置、實際應用場景及常見誤區。
內核提供8位優先級位,可按下表8種方式劃分:
| 方案 | 搶占位數 | 響應位數 | 搶占級數 | 響應級數 |
|---|---|---|---|---|
| 0 | 0 | 8 | 1 | 256 |
| 1 | 1 | 7 | 2 | 128 |
| 2 | 2 | 6 | 4 | 64 |
| 3 | 3 | 5 | 8 | 32 |
| 4 | 4 | 4 | 16 | 16 |
| 5 | 5 | 3 | 32 | 8 |
| 6 | 6 | 2 | 64 | 4 |
| 7 | 7 | 1 | 128 | 2 |
STM32庫函數僅使用高4位,提供5種分組配置:
// 庫函數調用 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_x); // 5種分組對應關係 NVIC_PriorityGroup_0: 0位搶占 | 4位響應 // 無嵌套,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級搶占,無響應級
// 假設選擇 Group 2:2位搶占 + 2位響應 // 設置 USART1 中斷:搶占優先級1,響應優先級2 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 0-3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; // 0-3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
無搶占優先級,所有中斷平級,完全按響應優先級排隊,絕無嵌套。適合簡單應用或不希望中斷嵌套的場景。
main() 最開始調用 NVIC_PriorityGroupConfig,且全程不再更改STM32中斷優先級機制的核心在於:搶占優先級決定「能不能搶」,響應優先級決定「誰先來」。正確選擇分組(推薦Group 2),合理分配兩級優先級,是構建確定性實時系統的基礎。開發中務必避免「同搶占級下響應級高可搶占」的錯誤認知,並保證分組配置全局唯一、初始化一次。