-
2019-12-11 17:20:41
stm32中断优先级分组
转载:http://news.eeworld.com.cn/mcu/article_2018053039408.html
一、抢占优先级和响应优先级
STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。 抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断(在执行中断服务函数A 的过程中被中断B 打断,执行完中断服务函数B 再继续执行中断服务函数A),抢占属性由NVIC_IRQChannelPreemptionPriority 的参数配置。 而响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达, 则先处理响应优先级高的中断, 响应属性由NVIC_IRQChannelSubPriority 参数配置。例如,现在有三个中断向量,如下表。 若内核正在执行C 的中断服务函数,则它能被抢占优先级更高的中断A 打断,由于B和C 的抢占优先级相同,所以C 不能被B 打断。但如果B 和C 中断是同时到达的,内核就会首先响应响应优先级别更高的B 中断。二、NVIC 的优先级组
在配置优先级的时候,还要注意一个很重要的问题,即中断种类的数量。NVIC 只可以配置16 种中断向量的优先级,也就是说,抢占优先级和响应优先级的数量由一个4 位的数字来决定,把这个4 位数字的位数分配成抢占优先级部分和响应优先级部分。有5 组分配方式:q 第0 组: 所有4 位用来配置响应优先级。即16 种中断向量具有都不相同的响应优先级。
第1 组:最高1 位用来配置抢占优先级,低3 位用来配置响应优先级。表示有2 种级别的抢占优先级(0 级,1 级),有8 种响应优先级,即在16 种中断向量之中,有8 种中断,其抢占优先级都为0 级,而它们的响应优先级分别为0~7,其余8 种中断向量的抢占优先级则都为1 级,响应优先级别分别为0~7。
第2 组:2 位用来配置抢占优先级,2 位用来配置响应优先级。即4 种抢占优先级,4 种响应优先级。
第3 组:高3 位用来配置抢占优先级,最低1 位用来配置响应优先级。即有8 种抢占优先级,2 种响应2 优先级。q
第4组:所有4 位用来配置抢占优先级,即NVIC 配置的16 种中断向量都是只有抢占属性,没有响应属性。
要配置这些优先级组,可以采用库函数NVIC_PriorityGroupConfi g(),可输入的参数为NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4,分别为以上介绍的5 种分配组。
于是,有读者觉得疑惑了,如此强大的STM32,所有GPIO都能够配置成外部中断,USART、ADC 等外设也有中断,而NVIC 只能配置16 种中断向量,那么在某个工程中使用超过16 个中断怎么办呢?注意NVIC 能配置的是16 种中断向量,而不是16 个,当工程中有超过16 个中断向量时,必然有两个以上的中断向量是使用相同的中断种类,而具有相同中断种类的中断向量不能互相嵌套。更多相关内容 -
STM32——中断优先级分组
2022-03-20 17:08:08一、SCB-AIRCR寄存器 首先,对STM32中断进行分组...注意:中断优先级分组一般只进行一次。随意改变会产生意想不到的执行结果。 二、中断优先级分组函数 void NVIC_PriorityGroupConfig(nint32_t NVIC_PriorityGro...一、SCB-AIRCR寄存器
首先,对STM32中断进行分组,0——4.同时,每个中断设置一个抢占优先级和一个响应优先级。
1、 高抢占可以打断正在执行的低抢占
2、 抢占相等,高响应不能打断低响应
3 抢占相等,两个中断同时发生,高响应先执行
4、 抢占和响应都相等,先来先执行注意:中断优先级分组一般只进行一次。随意改变会产生意想不到的执行结果。
二、中断优先级分组函数
void NVIC_PriorityGroupConfig(nint32_t NVIC_PriorityGroup)
{
assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
SCB->AIRCR=AIRCR_VECTKEY_MASK|NVIC_PriorityGoup;
}例如:NVIC_PriorityGroupConfig(NVIC_PriorityGoup_2);//分组二
三、中断优先级设置步骤
-
STM32-NVIC中断优先级分组-中断优先级设置
2021-09-13 20:51:271.NVIC中断优先级分组 NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器。STM32F中文参考手册中搜索向量表可以找到相应的中断说明。 CM4/CM7 内核支持256个中断,其中包含了16个内核中断和...STM32-中断优先级管理NVIC
1.NVIC中断优先级分组
NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器。STM32F中文参考手册中搜索向量表可以找到相应的中断说明。
CM4/CM7 内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。
STM32F4/F7并没有使用CM4内核的全部东西,而是只用了它的一部分。
STM32F40xx/STM32F41xx总共有92个中断。10个内核中断,82个可屏蔽中断。
STM32F42xx/STM32F43xx则总共有97个中断。10个内核中断,87个可屏蔽中断。
STM32F76x总共118个中断,10个内核中断,108个可屏蔽中断。STM32具有16级可编程的中断优先级,而我们常用的就是这些可屏蔽中断。
几十个中断,怎么管理?
首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。
分组配置是在寄存器SCB->AIRCR中配置: IP bit[7:4]有4位,2^4=16,所以说它们的优先级可以有16个值,这时候如果是2位抢占优先级,那么它的值可能为0、1、2、3。也就是抢占优先级可以取0到3 。首先进行分组来决定几位抢占优先级、几位响应优先级。数越小它的优先级越高。
组 AIRCR[10:8] IP bit[7:4]分配情况 分配结果 0 111 0:4 0位抢占优先级,4位响应优先级 1 110 1:3 1位抢占优先级,3位响应优先级 2 101 2:2 2位抢占优先级,2位响应优先级 3 100 3:1 3位抢占优先级,1位响应优先级 4 011 4:0 4位抢占优先级,0位响应优先级 抢占优先级 & 响应优先级区别:
高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。抢占决定了是否能打断别人。
抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;举例:
假定设置中断优先级组为2,然后设置
中断3(RTC中断)的抢占优先级为2,响应优先级为1。
中断6(外部中断0)的抢占优先级为3,响应优先级为0
中断7(外部中断1)的抢占优先级为2,响应优先级为0。
那么这3个中断的优先级顺序为:中断7>中断3>中断6。
一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如分组2,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。
中断优先级分组函数位于HALLIB中的stm32f7xx_hal_cortex.c:void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);
void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup) { /* Check the parameters */ assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */ NVIC_SetPriorityGrouping(PriorityGroup); }
可以找到IS_NVIC_PRIORITY_GROUP的定义,进而确定PriorityGroup参数怎么写。
#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PRIORITYGROUP_0) || \ ((GROUP) == NVIC_PRIORITYGROUP_1) || \ ((GROUP) == NVIC_PRIORITYGROUP_2) || \ ((GROUP) == NVIC_PRIORITYGROUP_3) || \ ((GROUP) == NVIC_PRIORITYGROUP_4))
在stm32f7xx_hal.c中可以找到HAL_Init函数:其中HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);可以看到中断分组为2 。
HAL_StatusTypeDef HAL_Init(void) { /* Configure Flash prefetch and Instruction cache through ART accelerator */ #if (ART_ACCLERATOR_ENABLE != 0) __HAL_FLASH_ART_ENABLE(); #endif /* ART_ACCLERATOR_ENABLE */ /* Set Interrupt Group Priority */ HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */ HAL_InitTick(TICK_INT_PRIORITY); /* Init the low level hardware */ HAL_MspInit(); /* Return function status */ return HAL_OK; }
2.NVIC中断优先级设置
分组设置好之后,怎么设置单个中断的抢占优先级和响应优先级?
中断设置相关寄存器:
_IO uint8_t IP[240]; //中断优先级控制的寄存器组
_IO uint32_t ISER[8]; //中断使能寄存器组
_IO uint32_t ICER[8]; //中断失能寄存器组
_IO uint32_t ISPR[8]; //中断挂起寄存器组
_IO uint32_t ICPR[8]; //中断解挂寄存器组
_IO uint32_t IABR[8]; //中断激活标志位寄存器组位于core_cm7.h中:NVIC_Type结构体中成员变量就是那些寄存器。
/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). */ typedef struct { __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ uint32_t RESERVED0[24U]; __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ uint32_t RSERVED1[24U]; __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ uint32_t RESERVED2[24U]; __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ uint32_t RESERVED3[24U]; __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ uint32_t RESERVED4[56U]; __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ uint32_t RESERVED5[644U]; __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ } NVIC_Type;
对于每个中断怎么设置优先级?
中断优先级控制的寄存器组:IP[240],全称是:Interrupt Priority Registers
240个8位寄存器,每个中断使用一个寄存器来确定优先级。STM32F40x系列一共82个可屏蔽中断,使用IP[81]~IP[0]。
每个IP寄存器的高4位用来设置抢占和响应优先级(根据分组),低4位没有用到。
在stm32f7xx_hal_cortex.c可找到:
/** * @brief Sets the priority of an interrupt. * @param IRQn: External interrupt number. * This parameter can be an enumerator of IRQn_Type enumeration * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f7xxxx.h)) * @param PreemptPriority: The preemption priority for the IRQn channel. * This parameter can be a value between 0 and 15 * A lower priority value indicates a higher priority * @param SubPriority: the subpriority level for the IRQ channel. * This parameter can be a value between 0 and 15 * A lower priority value indicates a higher priority. * @retval None */ void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) { uint32_t prioritygroup = 0x00; /* Check the parameters */ assert_param(IS_NVIC_SUB_PRIORITY(SubPriority)); assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority)); prioritygroup = NVIC_GetPriorityGrouping(); NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority)); }
中断优先级设置步骤:
- 系统运行后在HAL_Init函数中设置中断优先级分组。调用函数:
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
//中断优先级分组2 整个系统执行过程中,只设置一次中断分组。 - 针对每个中断,设置对应的抢占优先级和响应优先级:
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t
PreemptPriority, uint32_t SubPriority); - 使能中断通道:
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn) { /* Check the parameters */ assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); /* Enable interrupt */ NVIC_EnableIRQ(IRQn); }
- 系统运行后在HAL_Init函数中设置中断优先级分组。调用函数:
-
关于STM32中NVIC中断优先级分组
2022-04-07 16:30:45STM32中NVIC中断优先级分组共有5组分配关系,具体分组情况如下图所示。 若两组中断同时请求,先比较抢占优先级大小,数字小者优先级高,再比较响应优先级。 在我们工程中,需先设置NVIC中断优先级分组(注意每...STM32中NVIC中断优先级分组共有5组分配关系,具体分组情况如下图所示。
若两组中断同时请求,先比较抢占优先级大小,数字小者优先级高,再比较响应优先级。
在我们工程中,需先设置NVIC中断优先级分组(注意每一个工程中断优先级分组仅分一次,尽量不要更改),然后在NVIC_Init()中设置抢占优先级和响应优先级(响应优先级也称“子优先级”)。上表中“分配结果”中的“位”是我们可以设置的优先级的数目,例如设置 优先级分组为3,按分配结果来看我们可以设置抢占优先级的数字为2³=8,即可以设置0、1、2、3、4、5、6、7;我们可以设置响应优先级的数字为2¹=2,即可以设置0、1。也就是我们NVIC_Init()中的 NVIC_InitStruct_EXTI.NVIC_IRQChannelPreemptionPriority =;//设置抢占优先级
NVIC_InitStruct_EXTI.NVIC_IRQChannelSubPriority =;//设置响应优先级注:中断优先级分组,NVIC_PriorityGroupConfig(),在misc.h里.
在需要多个中断时,设置好优先级,对于程序有着至关重要的作用。
-
中断优先级分组和抢占式优先级和响应优先级
2019-05-15 21:42:54STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作’亚优先级’或’副优先级’,每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级... -
无基础也可以了解,NVIC中断优先级分组
2021-06-02 00:31:27STM32可以对中断进行分组,可以分为5组。 -
【STM32】Cortex-M3的中断优先级分组
2021-06-30 22:53:12这篇文章算是自己这半个月,终于从中断优先级分组的坑里爬出来的一点个人经验的总结吧,其中的各种问题也确实在网上资料偏少,所以抛砖引玉吧。 2 遇到的问题 首先,介绍一下我所遇到的问题。我在开发板上搞1838... -
STM32优先级分组,抢占优先级与响应优先级详解
2019-04-18 19:06:07优先级分组 //对中断源进行分组,每组有一个抢占优先级和响应优先级。 上面的理解是错误的,事实上,所有中断源都是一个组。 这个操作应该称之为设置中断优先级的控制模式(控制组别)。 清楚地说是:这里不应该... -
stm32 优先级分组
2019-06-06 11:06:47一、中断优先级配置的函数: 1.NVIC_IRQChannelPreemptionPriority 配置抢占优先级 2.NVIC_IRQChannelSubPriority 配置响应优先级 二、抢占优先级与响应优先级的描述: 1、抢占优先级不同,... -
stm32学习(3)——NVIC中断优先级分组
2020-05-22 21:16:34它们在51单片机中的优先级也是按自上而下的顺序,中断少且优先级明确,这就是大家了解的51单片机中断系统,又顺便复习了一波老知识。 而在stm32f103系列芯片中有60个可屏蔽中断(可屏蔽中断简单来说就是可以由寄存器... -
STM32F407ZGT6的NVIC中断优先级分组
2021-06-30 21:37:56注意:上面得到的分配结果,是指可以形成多个抢占优先级,多个响应优先级,这样两个端口争优先级时,就有两重优先级。如下:先判断抢占优先级,再判断响应优先级。数字越低,越优先。 注意第二第三点。例: 情况... -
STM32中断优先级分组概念
2016-12-20 09:19:23Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:第0组:所有4位用于指定响应优先级第1组:最高1位用于指定抢占... -
【stm32】 中断优先级分组
2018-09-05 11:49:13在stm32开发中,我们可能需要多个串口同时收发,这时需要配置下中断的优先级问题。 中断优先级中抢占优先级与响应优先级位数可自行分配。 初始化时NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //2 位抢占... -
时间优先级分组的二进制防冲突协议
2020-10-23 04:15:52提出了基于时间分组的二进制搜索协议,该协议在标签里设置时间优先级,记录标签进入阅读器读写范围的时间长短,并以此时间优先级将阅读器范围内的多个标签进行分组,每次识别时间优先级最大(对识别时间要求最为紧迫... -
STM32F103系列NVIC中断优先级分组讲解
2019-05-17 16:29:33但是STM32只用到了CM3内核的一部分,STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程中断优先级。 STM32F103系列只有60个可屏蔽中断。 二、中断管理 1.对STM32进行中断分组,组0-4,同时对... -
中断优先级分组与抢占优先级和响应优先级的关系
2018-07-23 21:51:38之前学习嵌入式的时候不太明白中断优先级分组与抢占优先级和响应优先级的关系,比如分组为2,抢占优先级也为2,响应优先级也为2,就是不明白他们之间有什么关系,谁决定谁,总共有多少个数值可供选择。 趁着现在... -
蓝桥杯嵌入式学习STM32之中断优先级分组NVIC
2020-01-29 01:09:27CM3里面有很多中断,有更高的优先级层数。但是stm32f103被阉割了好多。 CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。 STM32并没有使用CM3内核的全部东西,... -
[原创]NVIC中断优先级分组与中断优先级和子优先级
2018-08-08 19:24:21Cortex-M内核提出中断分组的概念,一共5组 NVIC_PriorityGroup_0 :0 bit 抢占优先级 4 bit 子优先级 NVIC_PriorityGroup_1 :1 bit 抢占优先级 3 bit 子优先级 NVIC_PriorityGroup_2 :2 bit 抢占优先级 2 bit ... -
对STM32的NVIC_PriorityGroupConfig使用及优先级分组方式理解
2019-09-12 10:27:13由于STM32使用了4位,所以最多有5个优先级分组。 STM32 HAL库中的中断优先级分组 /* Preemption Priority Group -------------------------------------------------*/ #define NVIC_PriorityGroup_0 ((u32)0x700) /... -
NXP NVIC(嵌套向量中断管理器) 优先级分组
2020-04-17 15:34:06NXP NVIC(嵌套向量中断管理器) 优先级分组 Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下: 第0组:所有4位... -
NVIC中断优先级分组
2018-05-23 22:14:08CM7内核支持256个中断,其中包含了16个内核中断和...STM32具有16级可编程的中断优先级,而我们常用的就是这些可屏蔽中断。 ???几十个中断,怎么管理?首先,对STM32中断进行分组,组0~4,同时,对每个中断设置... -
Cortex-M0的NVIC没有优先级分组功能,以及衍生内容
2019-05-20 21:00:18今天在一个交流群看到有人问,为什么NVIC没有优先级分组配置的选项,如下如: 这个问题,想必没有遇到过的人,还以为是STM32CubeMX的Bug。 其实,答案很简单: 有的MCU是没有NVIC分组功能 。 下面就针对这个NVIC分组... -
6.中断优先级分组NVIC
2018-09-11 16:57:16系统运行后,首先进行中断优先级分组:NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) 整个系统执行过程中只设置一次中断分组 b.针对每个中断进行初始化,设置抢占优先级和响应优先级以及使能:NVIC_... -
抢占优先级和相应优先级以及优先级分组的理解
2015-03-06 10:03:01STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级... -
正点原子 24 NVIC中断优先级分组
2018-10-06 22:57:47数值越小,优先级越高 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。 抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。...中断优先级分组函数 在misc.c函数中 void NVIC_P... -
GD32/ST32的中断优先级分组记录
2021-03-09 09:40:18配置分组2. 使能中断 简介 简单来说NVIC就是个嵌套向量中断控制器,控制着整个芯片中断相关的功能。NVIC相关结构体定义在文件:core_cm3.h中。 关于中断寄存器主要有:ISER(使能中断),ICER(失能中断),IP(用来... -
STM32F4设置NVIC中断优先级分组
2017-01-16 14:32:42同时,对每个中断设置一个抢占优先级和一个响应优先级值。 分组配置是在寄存器SCB->AIRCR中配置: 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。抢占优先级相同的中断,高响应优先级不可以打断低... -
STM32 入门 之 优先级分组
2018-01-30 22:04:45在配置中断时需要配置优先级,在此对优先级进行总结。 ...因为要分为抢占优先级和响应优先级,故一共有5种分组。、 看代码注释 具体分配如下(红线前为抢占优先级后为响应优先级) 还看不 -
论文研究-TD-SCDMA 系统估计优先级分组调度算法 .pdf
2019-08-14 17:34:29TD-SCDMA 系统估计优先级分组调度算法,吴燕珠,雷萍,高速下行分组接入(HSDPA)是包含在TD-SCDMA规范5,该方式有利于增加下行容量和比特率。这篇论文主要考虑HSDPA上混合业务的不同分组调��