比如,有时候你在使用STM32CubeMX配置时,你会发现只有Preemption Priority【抢占优先级】,而没有Sub Priority【次优先级】:

然而,有时候你会发现又有Sub Priority【次优先级】:

这个问题就牵涉到STM32,准确的来说的是 Cortex-M NVIC嵌套向量中断控制器的问题。
下面就展开来说说关于ARM单片机NVIC的内容。
关于Cortex-M的NVIC
NVIC:Nested Vectored Interrupt Controller,嵌套向量中断控制器。
在每个Cortex-M内核中都有这么一个NVIC嵌套向量中断控制器,当MCU使用的内核不同,其中的NVIC也可能不同。
比如,Cortex-M0和Cortex-M3内核中NVIC功能就不同。
其中,中断优先级分组功能就不同。
Cortex-M0的NVIC没有优先级分组功能,Cortex-M3、 M4、M7有分组功能。
所以,你在使用STM32CubeMX配置时,M0/M0+内核的STM32是没有【次优先级】那个选项的。
Cortex-M0包含STM32F0、L0、G0等处理器。
对底层感兴趣的朋友可以继续往下看。
NVIC寄存器
NVIC寄存器,需查看对应的内核(Cortex-M)手册,在ARM官网能找到( M3也有对应的中文翻译版,大家可以自己网上搜索)。
内核中的寄存器和我们STM32参考手册中寄存器一样,不同的Bit位代表含义不同。
但是,对于NVIC来说,由于包含众多优先级相关配置,寄存器数量相对较多(NVIC寄存器族)。
拿M3来说,优先级分组的配置,位于NVIC的AIRCR应用程序中断及复位控制寄存器中:
中断入口
额外提下一个小伙伴问的问题:为什么外部中断8和9都使用同一个中断?
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line8) != RESET)
{
/* 代码 */
EXTI_ClearITPendingBit(EXTI_Line8);
}
if(EXTI_GetITStatus(EXTI_Line9) != RESET)
{
/* 代码 */
EXTI_ClearITPendingBit(EXTI_Line9);
}
}我想,这个问题应该不难。好比一个main程序入口,进入之后需要处理很多事情,只是在里面需要区分事件。
很多外设中断,都会使用同一个中断入口,有一个原因:节约中断入口资源分配。
像USART发送和接收中断,TIM不同通道捕获中断等。
关键字:STM32 中断
引用地址:
为什么有些STM32中断没有子优先级?
推荐阅读最新更新时间:2026-03-25 10:43
【菜鸟必看】STM32 串口接收不定长数据中断检测相关问题
今天给大家介绍STM32串口接受不定长数据中断检测的相关问题。能够推测,在UART收到最后一帧数据后,假如随后的一个数据帧的时长内未收到新的数据,则IDLE信号有效.假如数据包之间间隔大于一个数据帧,就能够用IDLE信号作为检测数据包完毕的标志. 运用DMA接管UART-Rx数据,当检测到DMA数据满,或DMA数据半满,或UART的IDLE时,读取DMA数据.假如DMA缓存空间足够大(大于最大的数据包长度),也能够只以IDLE信号为标志. 运用类似的思维,能够用3种方式达到. 启用UART的RXNE中断,运用RXNE中断检测第一数据帧,并读取第一个数据,其次启动DMA接管(DMA设置为Normal模式)和IDLE中断,并关闭RXN
[单片机]
STM32中中断标志位与中断挂起位详解:TIM_ClearFlag与TIM_ClearITPendingBit函数应用指南
1. 中断标志位(Interrupt Flag) 作用: 中断标志位位于外设寄存器中(如定时器的TIMx_SR、GPIO的EXTI_PR等),用于指示某个特定事件是否发生(例如定时器溢出、GPIO引脚电平变化)。该标志位由硬件自动置位,但通常需要软件手动清除。 对上一段文字解释:TIMx_SR:定时器(Timer)的 状态寄存器(Status Register)、EXTI_PR:(External Interrupt Pending Register)是外部中断/事件控制器(EXTI)的挂起寄存器(Pending Register),用于标识外部中断请求是否已触发但未被处理】 关键点: 事件触发:当外设检测到事件(如定时器
[单片机]
【STM32】NVIC嵌套向量中断控制器详解
什么是 NVIC? NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器) 适用于 Cortex-M0、M3、M4、M7 等 ARM 处理器,广泛用于 STM32、ESP32、GD32、NXP 等 MCU 中,它用于管理和控制中断,是 ARM Cortex-M 系列微控制器 的核心外设之一。NVIC 负责中断优先级管理、嵌套中断处理和中断向量跳转,使 Cortex-M 处理器能够高效地响应中断请求。 NVIC 主要功能 1. 支持多个中断源(STM32F103 系列最多支持 60 个) 2. 支持中断优先级管理(可配置 8~256 级优先级) 3. 支持中断嵌套(高优先级
[单片机]
STM32中TIM定时中断功能详解(进阶篇)
一、TIM介绍 1、TIM简介 TIM(Timer)定时器 定时器的基本功能:定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断。 即定时触发中断,同时也可以看出,定时器就是一个计数器,当这个计数器的输入是一个准确可靠的基准时钟的时候, 那它在对这个基准时钟进行计数的过程,实际上就是计时的过程。 比如在STM32中,定时器的基准时钟一般都是主频72MHz,如果对72MHz计72个数,计1个数的周期那就是1MHz,1/1MHz=0.000001s,也就是1us的时间,如果对72MHz计72000个数,计1个数的周期那就是1KHz,1/1KHz=0.001,也就是1ms的时间。 STM32的定时器拥有16位计
[单片机]
STM32定时器详解:实现精准延时的定时中断深入解析
一、什么是定时器? 定时器,顾名思义就是用来定时的内部外设。不同的芯片型号上搭载了不同的定时器,定时器的类型也分为高级定时器,中级定时器,基本定时器。 高级定时器 (TIM1, TIM8等) 高级定时器功能最为强大,通常包含以下特性: 多通道 PWM 输出: 可以产生多个独立的 PWM 信号,用于电机控制、逆变器等应用。 互补输出: 支持互补的 PWM 输出,常用于控制三相电机。 死区时间插入: 在互补输出之间插入可编程的死区时间,防止功率器件同时导通。 编码器接口: 可以直接连接增量式编码器,用于测量旋转速度和方向。 触发输入和输出: 可以与其他定时器或外设进行同步触发。 高级定时器通常用于需要精确控制和复杂波形生成
[单片机]
STM32中断机制详解:重新探索与理解
GPIO-AFIO-EXTI-NVIC AFIO中断引脚选择 GPIO初始化 定义任务与任务句柄 NVIC相当于中断管家,NVIC跟CPU一样在内核,不需要额外对NVIC进行开启时钟的操作。 内部有开关部分:负责中断屏蔽,将用不到的中断源开关断开,进行屏蔽 中断优先级:由4个bit位进行存储 中断仲裁:将存储的中断优先级拿出来进行比较,看看谁优先 中断优先级分组可以根据需要,设置不同的分组方式。(1-1) X位抢占优先级4-x位子优先级 (子优先级就是响应优先级) 一位对应着4个字节 例如: 第0组中断优先级有0位抢占优先级,4位子优先级。即:所有4位都用来配置响应优先级,16种中断向量都具有不相同的响应优先级。(1-2)
[单片机]
stm32定时器初始化后自动进入一次中断问题
今天在调试定时器时,定时器3出现了自动停止工作的问题,中断设置是每过一秒,进一次中断,相应标志位+1,然后每次都是在标志位=4时停止工作,但是有时候又能正常工作,暂时未解决。 在调试时,发现一个有趣的现象,本次项目我同时配置了定时器4,初始化后是DISABLE未使能状态,但是开始运行,定时器还是会进一次中断,相应的标志位+1,后面不能继续增加。 motor_run_time这个标志位在程序启动后会进一次中断导致+1,而我的定时器并未使能。 我的相关代码是 初始化部分代码: TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); //允许定时器4更新中断 TIM_Cmd(TIM4,
[单片机]
STM32单片机串口中断+DMA使用(含CUBE配置)
最近又要重新用32做点东西,发现一两年没怎么碰的结果就是,曾经熟得不行的东西都变得极度陌生,这种重新学习记忆的过程过于痛苦,果然还是要留下一些记录给之后失忆的自己的。 1.STM32CUBE配置 1.1 pinout设置 找到想要用的串口,配置模式,正常情况是Asyn(异步)和Disable。 关于mode的几个选项: Asyn 异步 Syn同步 Single Wire单工 后面几个没有太多的了解惹 1.2 configuration设置 Parameter Settings可以设置:波特率/字长/奇偶校验/停止位/收发模式 DMA Settings中添加接收DMA的流 NVIC Setti
[单片机]