STM32 中断优先级分抢占优先级和子优先级:抢占高的可以打断抢占低的(嵌套),同抢占级子优先级只决定同时挂起时谁先执行;HAL 库用 NVIC_SetPriority() 配置,分组用 NVIC_PriorityGroupConfig()。
本文概述
中断是单片机核心,面试常考:抢占优先级和子优先级区别、中断嵌套、中断延迟、中断里不能做什么。回答要能讲清分组机制、现场算优先级、并说中断服务程序的禁忌。
核心要点
STM32 优先级分抢占优先级和子优先级;抢占高可嵌套,子优先级不嵌套只决定顺序
优先级分组(NVIC_PriorityGroup)决定几位给抢占、几位给子优先级,F1 默认 Group4(4 位抢占)
中断延迟:从中断触发到 ISR 第一条指令,几到几十时钟周期
ISR 里要短:不能延时、不能用 printf、不能等信号量太久,用标志位通知主循环
中断向量表位置、中断使能/清除挂起、中断标志清除时机容易出错

面试官考察点
这是必考题。面试官看:①是否理解嵌套机制;②分组怎么配;③现场能不能写出配置代码。只说「数字越小优先级越高」不够。
回答思路
先讲两个优先级的区别(能否嵌套),再讲分组,最后给配置代码和实际例子。
参考回答
核心区别。
| 对比项 | 抢占优先级 | 子优先级 |
|---|---|---|
| 能否打断其他中断 | 能(高抢占可嵌套低抢占) | 不能 |
| 同时挂起时 | 高抢占先执行 | 同抢占级时高子优先级先执行 |
| 数值 | 0 最高 | 0 最高 |
举个例子。串口中断抢占=2、ADC 中断抢占=1、定时器中断抢占=2:
ADC 在跑时串口来了 → ADC 抢占 1 比串口 2 高,串口等 ADC 跑完;
串口在跑时定时器来了 → 抢占都是 2,不嵌套,定时器等串口跑完;
串口和定时器同时来 → 比子优先级,子优先级高的先跑。
分组。STM32 用 NVIC_PriorityGroupConfig() 把 4 位优先级分成抢占位和子位:
Group 4:4 位抢占(0~15)、0 位子优先级,F1 默认;
Group 3:3 位抢占(0~7)、1 位子优先级;
系统只允许一个分组,所有中断共用;HAL_Init() 里默认 Group4。
配置代码。
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
HAL_NVIC_SetPriority(USART1_IRQn, 2, 0); // 抢占2、子0
HAL_NVIC_EnableIRQ(USART1_IRQn);
ISR 里的禁忌。
不能写
HAL_Delay()(它靠 SysTick,会卡死);不能 printf(耗时太长,且要加互斥可能死锁);
不能长时间循环或等硬件;
做法:ISR 里只清标志、读数据、置 flag,复杂处理放主循环或任务。

扫码关注





























