STM32中断优先级与NVIC怎么配置?中断嵌套与延迟怎么理解?嵌入式面试

浏览量:283
时间: 2026-09-16 10:00:53
一句话答案

STM32 中断优先级分抢占优先级和子优先级:抢占高的可以打断抢占低的(嵌套),同抢占级子优先级只决定同时挂起时谁先执行;HAL 库用 NVIC_SetPriority() 配置,分组用 NVIC_PriorityGroupConfig()。

本文概述

中断是单片机核心,面试常考:抢占优先级和子优先级区别、中断嵌套、中断延迟、中断里不能做什么。回答要能讲清分组机制、现场算优先级、并说中断服务程序的禁忌。

核心要点

  • STM32 优先级分抢占优先级和子优先级;抢占高可嵌套,子优先级不嵌套只决定顺序

  • 优先级分组(NVIC_PriorityGroup)决定几位给抢占、几位给子优先级,F1 默认 Group4(4 位抢占)

  • 中断延迟:从中断触发到 ISR 第一条指令,几到几十时钟周期

  • ISR 里要短:不能延时、不能用 printf、不能等信号量太久,用标志位通知主循环

  • 中断向量表位置、中断使能/清除挂起、中断标志清除时机容易出错

示波器显示 STM32 中断响应波形,开发板连接调试器,屏幕显示中断优先级配置代码

面试官:STM32 抢占优先级和子优先级有什么区别?写代码怎么配?

面试官考察点

这是必考题。面试官看:①是否理解嵌套机制;②分组怎么配;③现场能不能写出配置代码。只说「数字越小优先级越高」不够。

回答思路

先讲两个优先级的区别(能否嵌套),再讲分组,最后给配置代码和实际例子。

参考回答

核心区别。

对比项抢占优先级子优先级
能否打断其他中断能(高抢占可嵌套低抢占)不能
同时挂起时高抢占先执行同抢占级时高子优先级先执行
数值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,复杂处理放主循环或任务。

面试官可能追问

追问 1:中断延迟由什么决定?
内核响应(取向量、压栈)+ 指令对齐 + 当前是否在另一个中断中。F1 大概 12 周期,72MHz 约 167ns。
追问 2:中断里为什么不能用 HAL_Delay?
HAL_Delay 靠 SysTick 中断计数,如果你当前中断优先级比 SysTick 高,SysTick 永远进不来,就死等了。
追问 3:中断标志什么时候清?
进 ISR 后尽快清标志,否则退出后会立刻再次进入。但要先读数据(如 USART_DR),因为读操作本身会清 RXNE。
追问 4:FreeRTOS 里中断优先级要注意什么?
FreeRTOS 管的中断要设优先级 ≥ configMAX_SYSCALL_INTERRUPT_PRIORITY,高于这个优先级的中断不能调 FreeRTOS API。
追问 5:中断向量表放哪里?
启动文件里(如 startup_stm32f103xx.s),中断触发时内核自动从向量表取 ISR 地址。改向量表位置要改 SCB->VTOR。

常见失分表达

✗ 优先级数字越大越高 — STM32 数字越小优先级越高,搞反了系统会乱。
✗ 中断里慢慢处理没关系 — ISR 太长会导致低优先级中断延迟、系统跑飞。
✗ 所有中断优先级随便设 — 不分组、不区分抢占/子优先级,中断嵌套行为不可控。

准备动作

1
在 CubeMX 里配两个中断,改抢占/子优先级,实验嵌套行为
2
准备一个 ISR 里调用 HAL_Delay 卡死的排查案例
3
搞清楚 Group4 下有几个抢占级、几个子优先级
4
了解 FreeRTOS 中断优先级约束

核心关键词

NVIC抢占优先级子优先级中断嵌套ISR优先级分组


声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。仅供学习交流使用,不构成商业目的。版权归原作者所有,如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时删除。侵权投诉
相关推荐HOT
STM32 Bootloader与IAP在线升级怎么实现?嵌入式面试从跳转到校验

嵌入式单片机中高级技术基础题本文概述IAP(In-Application Programming)在线升级是产品量产后更新固件的核心能力,也是嵌入式面试的进阶题... 详情>>

2026-09-09 13:31:09
PCB设计阶段怎么做EMC设计?硬件工程师面试分层布局与布线

EMC电磁兼容中高级技术基础题本文概述EMC设计最有效的是在设计源头做,面试中需要讲清PCB分层策略(参考平面、电源/地层分配)、布局分区(高速/模拟/电源/接... 详情>>

2026-09-02 09:08:03
RTOS实时操作系统中强调的实时是什么概念?

RTOS,实时系统(Real-time operating system),实时系统能够在指定或者确定的时间内完成系统功能和外部或内部、同步或异步时间做出响应的... 详情>>

2024-03-27 11:20:23
看门狗电路硬件设计要点与误触发怎么排查

分类:硬件设计 经验级别:中级 难度:中等 题型:技术设计题+故障排查题本文概述看门狗电路是嵌入式系统可靠性的最后一道防线,其核心原理是在规定时间内未收到喂狗信... 详情>>

2026-08-19 09:50:23
异步FIFO怎么设计与跨时钟域处理?FPGA工程师面试

一句话答案异步 FIFO 解决两个不同时钟域之间的数据传递:写侧用写时钟、读侧用读时钟,通过格雷码指针同步到对方时钟域来判断空满;关键是指针同步避免亚稳态,不能... 详情>>

2026-09-14 19:50:45
开班信息