单片机基础知识---stm32单片机的优先级

STM32 优先级完整讲解(NVIC 中断优先级,分两层:抢占优先级 + 子优先级)

一、核心硬件:NVIC 嵌套向量中断控制器

所有 STM32 的外部中断、定时器、串口、ADC、DMA 中断,全部由 NVIC 统一管理优先级。

STM32 中断优先级分两层,缺一不可:

  1. 抢占优先级(Preemption Priority):高抢占可打断正在运行的低抢占中断(嵌套)
  2. 子优先级(Sub Priority) :同抢占优先级时,谁先执行;不能互相打断

数值规则(重点极易踩坑)

数字越小,优先级越高

  • 抢占优先级 0 > 1 > 2 > 3
  • 子优先级 0 > 1 > 2 > 3

二、优先级分组(关键配置:SCB->AIRCR)

单片机不会固定抢占/子优先级位数,通过优先级分组 切分4位优先级寄存器:

总共有 5 种分组(Group0 ~ Group4),以常用的4位优先级位举例:

分组 抢占优先级位数 子优先级位数 抢占可用范围 子优先级可用范围
Group0 0 bit 4 bit 无抢占(不能嵌套) 0~15
Group1 1 bit 3 bit 0~1 0~7
Group2 2 bit 2 bit 0~3 0~3
Group3 3 bit 1 bit 0~7 0~1
Group4 4 bit 0 bit 0~15 无,只有先后

工程通用习惯

绝大多数项目用 NVIC_PriorityGroup_2(分组2)

抢占03,子03,足够电机、串口、定时器、外部中断分层。

三、两层优先级执行逻辑(核心考点)

1. 抢占优先级不同(会嵌套中断)

正在执行:抢占优先级2 的串口中断

此时来了一个:抢占优先级1 的定时器中断

→ 定时器直接打断串口,先执行定时器,结束后回到串口。

2. 抢占优先级相同,子优先级不同(不会嵌套)

正在执行:抢占1,子2 的串口中断

来了:抢占1,子0 的外部中断

→ 外部中断不能打断当前串口,必须等串口中断全部执行完,再运行外部中断。

3. 抢占、子优先级全都一样

同时触发两个中断,子编号小的先响应。

四、系统异常优先级(内核HardFault、SysTick等)

内核自带异常(HardFault、MemManage、BusFault)优先级固定最高,不受NVIC分组控制:

  • HardFault 硬件错误:优先级固定 -1,任何中断都能被它打断
  • SysTick、PendSV:一般配置很低优先级,用于操作系统(FreeRTOS/UCOS)任务切换

注意:普通外设中断(TIM/USART/EXTI)无法打断 HardFault。

五、标准库 / HAL 库配置流程

步骤1:全局设置优先级分组(程序开头只调用一次)

c 复制代码
// HAL库
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
// 标准库
NVIC_SetPriorityGrouping(NVIC_PriorityGroup_2);

只能调用一次,多次调用会打乱所有中断优先级。

步骤2:给单个中断分配抢占、子优先级

c 复制代码
// 定时器3中断:抢占1,子0
HAL_NVIC_SetPriority(TIM3_IRQn,1,0);
// 使能中断通道
HAL_NVIC_EnableIRQ(TIM3_IRQn);

六、实战优先级分层方案(工业/电机项目通用)

按紧急程度从高到低排布:

  1. 抢占0(最高):急停外部中断、编码器捕获、过流保护(必须立刻响应,不能被打断)
  2. 抢占1:高频定时器、PWM电机控制、ADC电流采样
  3. 抢占2:串口接收中断、CAN通讯、传感器数据读取
  4. 抢占3(最低):屏幕刷新、按键检测、日志打印、延时定时器

举例场景

电机过流中断(抢占0)触发 → 立刻打断正在运行的串口、定时器,马上关闭输出,保护硬件。

七、常见踩坑点

  1. 数字越大优先级越低
    很多新手以为数字大优先,完全搞反,导致中断被阻塞。
  2. 只配置子优先级,不区分抢占
    同抢占下无法嵌套,高频中断会卡顿、丢数据。
  3. 多处调用 SetPriorityGrouping
    分组被反复修改,所有中断优先级全部错乱。
  4. SysTick 优先级过高
    跑RTOS时PendSV/SysTick必须最低,否则任务切换异常。
  5. 中断函数里加大量延时、printf
    高优先级中断阻塞,低优先级中断长期得不到执行。

八、极简一句话总结

STM32中断分抢占优先级(控制能否嵌套打断)+子优先级(同抢占时排队顺序),先全局划分优先级分组,再给每个外设中断分配两层数值;数字越小优先级越高。

相关推荐
不悔哥5 天前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
XiHongShi20165 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
优信电子5 天前
AIT1001 非接触式红外测温模块 STM32 驱动开发实战:从引脚到代码全解析
stm32·嵌入式·温度传感器·红外测温·非接触式测温·ait1001
深圳老胡5 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
wuyk5555 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
女神下凡5 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
梅梅9665 天前
一款mipi转lvds的lcd调试(LT8912B)
单片机·计算机外设·电脑·显示器·pd芯片
开发笔记-阿牛5 天前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
CHENKONG_CK5 天前
破解制鞋打磨痛点:RFID赋能去毛刺工序自动化升级
网络·单片机·嵌入式硬件·网络协议·tcp/ip
三佛科技-187366133975 天前
128KB~512KB Flash车规级MCU选型指南(FT32A072 / FT32A103 系列)
单片机·嵌入式硬件