STM32中有两个关于优先级的概念,分别是抢占式优先级和响应优先级,每个中断源都需要被指定这两种优先级,其属性编号越小,表明它的优先级别越高。下面将先大致介绍一下这两个优先级的概念。
抢占式优先级与响应优先级?
首先,如何确定优先级等级?
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套在低抢占式优先级的中断中。当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
总结下便是:抢占式优先级>响应优先级>中断表中的排位顺序
第0组优先级最高,第4组优先级最低。
#STM32中设置优先级的库函数
NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); #选择第1组
NVIC_PriorityGroup_0 => 选择第0组 //就是全部为响应优先级,所有的中断都不能抢占其他中断。
NVIC_PriorityGroup_1 => 选择第1组 //两个抢占优先级
NVIC_PriorityGroup_2 => 选择第2组 //4个抢占优先级
NVIC_PriorityGroup_3 => 选择第3组 //8个抢占优先级
NVIC_PriorityGroup_4 => 选择第4组 //16个抢占优先级,没有响应优先级。所有中断到来时均能按照优先级高低抢占其他优先级的中断。
以选择NVIC_PriorityGroup_1为例,那么抢占式优先级便占一位,也就是说可以有21个级别,可以设置为0和1,而响应优先级则占3位,也就是说可以有23个选择,可以设置为0~7;总共来说就可以区别>16种优先级。举个例子,假如现在有4个外部中断,还有一个EXTI9_5中断,那么如果选择优先级分组为第1组,那么抢占式优先级便只有两种,5个中断就至少有3个在抢占式优先级上是相同的优先级上,其他两个在令一优先级别。接着设置响应优先级可以有8种选择;假如现在同时有两个抢占式优先级别相同的中断发生,那么处理的顺序是谁的响应优先级高则谁优先进入中断,另外这点是需要注意的,如果此时进入这个中断之后又来了一个抢占式优先级相同但是响应优先级更高的中断,这时也是不会打断已有的中断的
关键字:STM32 优先级 中断源
引用地址:
STM32优先级
推荐阅读最新更新时间:2026-03-20 12:16
stm32中中断源名和中断处理函数名所在位置
两个文件分别在stm32f4xx.h(中断名) CORE—startup_stm32f40_41xxx.s(中断函数名) #if defined (STM32F40_41xxx) CAN1_TX_IRQn = 19, /*! CAN1 TX Interrupt */ CAN1_RX0_IRQn = 20, /*! CAN1 RX0 Interrupt */ CAN1_RX1_IRQn = 21, /*! CAN1 RX1 Interrupt
[单片机]
STM32中断源位置
在...\CMSIS\Device\ST\STM32F10x中的stm32f10x.h, 然后在结构体IRQn_Type找到对应单片机型号的代码片段。 比如STM32F103C8T6属于STM32F10X_MD, 那对应 的中断源为: 再比如STM32F103ZET6对应的是STM32F10X_HD
[单片机]
STM32中断编程三步曲教你弄会中断设置以及中断优先级设置
中断作为stm32中必不可少的一个功能,其重要性是不言而喻的因此把中断学习好是根本。 所以今天就来好好啃一下中断配置的知识,俗话说:磨刀不误砍柴工。问题是什么呢?项目中我用到了一个触摸键盘TTP229,结果在测试键盘时,不能够输入密码?最终,调试出bug就是由于中断优先级的影响。 本项目使用到的是STM32F030C8型号的MCU,我们可以从官方下载到的标准库文件中的启动汇编文件中,查看到本型号单片机的外部中断向量表。(如下图所示) 首先,我们了解一下NVIC是什么,在core_cm0.h文件中的标准库中的NVIC结构体。 其中,我们一般只用到ISER、ICER、IP这3个寄存器。ISER用于使能中断
[单片机]
STM32中断优先级void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) { u32 tmppriority = 0x00, tmpreg = 0x00, tmpmask = 0x00; u32 tmppre = 0, tmpsub = 0x0F; /* Check the parameters */ assert(IS_FUNCTIONAL_STATE(NVIC_InitStruct- NVIC_IRQChannelCmd)); assert(IS_NVIC_IRQ_CHANNEL(NVIC_InitStruct- NVIC_IRQChannel)); assert(IS_NVIC_PREE
[单片机]
STM32中断优先级实例
本例示范了如何使用嵌套向量中断控制器(Nested Vectored Interrupt Controller)来设置各个中断的优先级(Preemption Priority和SubPriority)。 设置2条外部中断线路(线路3和线路4)在每一个输入信号下降沿产生中断,开启SysTick中断。 这3个中断的优先级设置如下: EXTI Line3: PreemptionPriority = PreemptionPriorityValue SubPriority = 0 EXTI Line4: PreemptionPriority = 0 SubPriority = 1 Sys
[单片机]
STM32 MCU通过STM32CubeMx配置NVIC怎么没有中断子优先级选项
1、使用CubeMx配置NVIC时为何不见子优先级选项? 有些STM32用户,尤其是那些用过基于ARM Cortx-M3/M4/M7内核的STM32 MCU的用户,在使用基于M0/M0+内核的STM32系列并通过STM32CubeMx进行NVIC配置时,不难发现一个问题,那就是怎么没有中断子优先级【或称响应优先级、副优先级等】的配置?!【当然,很多时候我们或许没有关注子优先级】如下图所示,只看到抢占优先级的配置,看不到子优先级的配置项。 上图是我基于STM32L0系列芯片的配置,该系列芯片是基于ARM Cortex-M0+内核的。我们再看看下图的NVIC配置页面,显然可以看到抢占优先级【PreemptionPriority】和
[单片机]
STM32单片机中抢占优先级和响应优先级的表达方式解析
NVIC: Nested vectored interrupt controller, 嵌套中断向量控制器。 中断与异常: 所有能打断正常执行流的事件都称为异常。 异常与中断的区别在于, 中断请求是来自于Cortex内核外部, 比如各种片上外设, 外部中断请求等, 它们对于内核是”异步”的; 而异常则是由于Cortex内核在执行指令或者访问存储等操作时所产生的, 对于Cortex内核来说是属于”同步”的(可以参见Cortex M3权威指南), 异常和中断一般可以不加区分的使用。 Cortex内核可以支持多达240个外部中断, 编号16 – 255. 编号1 – 15的为系统异常, 编号0未被使用。 Cortex支行中断嵌套, 允许
[单片机]
STM32中断设置以及中断优先级设置三步曲
中断作为stm32中必不可少的一个功能,其重要性是不言而喻的因此把中断学习好是根本。 所以今天就来好好啃一下中断配置的知识,俗话说:磨刀不误砍柴工。问题是什么呢?项目中我用到了一个触摸键盘TTP229,结果在测试键盘时,不能够输入密码?最终,调试出bug就是由于中断优先级的影响。 本项目使用到的是STM32F030C8型号的MCU,我们可以从官方下载到的标准库文件中的启动汇编文件中,查看到本型号单片机的外部中断向量表。(如下图所示) 首先,我们了解一下NVIC是什么,在core_cm0.h文件中的标准库中的NVIC结构体。 其中,我们一般只用到ISER、ICER、IP这3个寄存器。ISER用于使能中
[单片机]