NVIC 中断优先级分组详解

📅 2026/7/8 14:37:58
NVIC 中断优先级分组详解
问题两个中断同时触发谁先执行高优先级中断在执行中来了个低优先级中断会打断吗这些问题取决于NVIC 优先级分组。优先级分组Cortex-M4 架构最多支持 8 位256 级优先级STM32F407 厂商实现裁剪为 4 位16 级。这 4 bit 可以拆分成抢占优先级和子优先级两部分// HAL 库函数 HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); // 常用分组抢占位数子优先级位数抢占级数子优先级级数GROUP_004116GROUP_11328GROUP_22244GROUP_33182GROUP_440161GROUP_4 4 bit 全是抢占优先级没有子优先级——这是最常用的。设置中断优先级// 在 main 初始化中设置 HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); ​ // 设置 USART1 优先级 HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); // 最高优先级 ​ // 设置 TIM2 优先级 HAL_NVIC_SetPriority(TIM2_IRQn, 1, 0); // 次高 ​ // 设置 EXTI0 优先级 HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0); // 第三 ​ // 使能中断 HAL_NVIC_EnableIRQ(USART1_IRQn); HAL_NVIC_EnableIRQ(TIM2_IRQn); HAL_NVIC_EnableIRQ(EXTI0_IRQn);数字越小优先级越高。打断规则场景会打断吗USART1优先级 0来了CPU 在执行 main✅ 立即响应USART1优先级 0执行中TIM2优先级 1来了❌ 不会打断等 USART1 处理完TIM2优先级 1执行中USART1优先级 0来了✅ USART1 优先级更高会打断 TIM2USART1优先级 0执行中EXTI0优先级 2来了❌ 不会EXTI0 优先级更低TIM2 和 EXTI0 同时触发TIM2优先级 1 vs 2先执行完了再执行 EXTI0SysTick 的优先级SysTick 的中断优先级不在 NVIC_SetPriority 管理需要单独设HAL_InitTick(TICK_INT_PRIORITY); // TICK_INT_PRIORITY 由 CubeMX 在 main.h 中自动生成默认是 15最低默认 SysTick 优先级是 15最低所以任何中断都能打断它——这也是为什么中断里调 HAL_Delay 会死锁参考另一篇文章。常见配置建议中断建议优先级理由SysTick15最低默认值Tick 被延迟一会无所谓USART接收0~1接收不能丢优先级高点SPI/DMA1~2传数据不能被打断太久TIM 定时器2~3一般任务EXTI按键3~4消抖就不急着处理I2C0~1I2C 有超时容易被时序问题卡死常见错误// ❌ CubeMX 里改了分组但代码没调 HAL_NVIC_SetPriorityGrouping // MX_NVIC_Init() 中的分组值取决于 CubeMX NVIC 配置界面的 Priority Group 下拉选择非硬编码 // 如果你手动改了 CubeMX 的分组确认代码里同步 ​ // ❌ 设了优先级忘了 EnableIRQ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); // 忘了这一行 ↓ HAL_NVIC_EnableIRQ(USART1_IRQn);总结99% 的情况用GROUP_44 bit 全给抢占优先级数字越小越优先高优先级可以打断低优先级SysTick 最末位优先级 15