精华内容
下载资源
问答
  • 2021-01-18 21:43:15

    1、中断类型

    从之前的串口实验可以看出,STM32总共分为内部中断和外部中断,内部和外部的配置差别不是很大,外部中断只是多了一步,需要通过
    GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)函数(在stm32f10x_gpio.h里面)
    将外部中断源挂载到中断线上即可。

    2、外部中断配置过程

    1、开时钟(必须开启复用时钟)
    2、初始化用到的GPIO口
    3、将使用到的GPIO口挂载到中断线上 GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)函数
    4、配置EXTI_Init() //中断线,中断的类型、触发方式
    5、配置NVIC_Init() //中断优先级
    6、编写中断服务函数

    3、外部中断的主要配置说明

    1)NVIC
    外部出现满足中断条件,开始执行中断服务函数,如同时出现多个中断,则根据NVIC设定的优先级开始执行中断函数。
    NVIC分组分析:NVIC的库函数和结构体定义都在misc文件中。
    NVIC的分组分为两组,但优先级总数不变,均为16组,并且编号越小,优先级越高

    ============================================================================================================================
        NVIC_PriorityGroup   | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority  | Description
      ============================================================================================================================
       NVIC_PriorityGroup_0  |                0                  |            0-15             |   0 bits for pre-emption priority
                             |                                   |                             |   4 bits for subpriority
      ----------------------------------------------------------------------------------------------------------------------------
       NVIC_PriorityGroup_1  |                0-1                |            0-7              |   1 bits for pre-emption priority
                             |                                   |                             |   3 bits for subpriority
      ----------------------------------------------------------------------------------------------------------------------------    
       NVIC_PriorityGroup_2  |                0-3                |            0-3              |   2 bits for pre-emption priority
                             |                                   |                             |   2 bits for subpriority
      ----------------------------------------------------------------------------------------------------------------------------    
       NVIC_PriorityGroup_3  |                0-7                |            0-1              |   3 bits for pre-emption priority
                             |                                   |                             |   1 bits for subpriority
      ----------------------------------------------------------------------------------------------------------------------------    
       NVIC_PriorityGroup_4  |                0-15               |            0                |   4 bits for pre-emption priority
                             |                                   |                             |   0 bits for subpriority                       
      ============================================================================================================================
    

    这里解释一下中断优先级分组是什么意思,有什么作用
    第二列:NVIC_IRQChannelPreemptionPriority 抢占优先级
    第三列:NVIC_IRQChannelSubPriority 响应优先级
    (1)抢占优先级:指此中断的抢占能力,抢占优先级越高,则此中断就可以打断优先级低的函数,这样就会出现中断的嵌套。①两个抢占优先级一样的中断同时到达,那么就会比较响应优先级,越高越先反应;②两个抢占优先级一样的中断不同时到达,无关响应优先级,前一中断不会被打断,直到执行完前一中断,才会执行后一个中断。
    (2)响应优先级:同时到达的中断的响应先后。两个抢占优先级一样的中断同时到达,那么就会比较响应优先级,越高越先反应。

    2)中断服务函数
    中断服务函数已经在“startup_stm32f10x_hd.s”中的264-323行声明,需要哪种中断直接去找即可。在配置EXTI时使用的中断线是哪一条,那么中断服务函数就选择哪一个。
    个人建议所有的中断服务函数写在“stm32f10x_it.c”中,然后在原本设置的.c文件里面打一个备注,这样中断服务函数一目了然,在各个子程序里面也可以看到备注。

    4、代码示例

    /*
    *main.c中需要添加
    */
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级	
    	LED_Init();
    	KEY_Init();   	
    	EXTI_Config();	
    
    /*
    *EXTI 和 NVIC 配置函数
    */
    void EXTI_Config(void)
    {
    	EXTI_InitTypeDef	EXTI_InitStructure;
    	NVIC_InitTypeDef	NVIC_InitStructure;
    	
    	KEY_Init();//先配置需要用到的按键
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//一定要开启复用时钟
    	
    //KEY1 PE3 	上升沿	优先级2 1
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
    	EXTI_InitStructure.EXTI_Line = EXTI_Line3;
    	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    	EXTI_Init(&EXTI_InitStructure);	
    	
    	NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; 
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_Init(&NVIC_InitStructure);
    }
    
    /*
    *中断服务函数
    */
    //KEY1 中断服务函数
    void EXTI3_IRQHandler(void)
    {
    	delay_ms(10);//消抖
    	if(KEY1 == 1)
    	{
    		LED1 = !LED1;
    	}
    	EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE3上的中断标志位  
    }
    
    更多相关内容
  • 文章目录 抢占优先级和响应优先级 抢占 响应 NVIC 的优先级组 中断寄存器 ISER[8] ICER[8] ISPR[8] ICPR[8] IABR[8] IP[240] 中断优先级设置步骤总结 Ref. 抢占优先级和响应优先级 STM32 的中断向量具有两个属性,一...

    抢占优先级和响应优先级

    STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。

    抢占

    抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断(在执行中断服务函数A 的过程中被中断B 打断,执行完中断服务函数B 再继续执行中断服务函数A),抢占属性由NVIC_IRQChannelPreemptionPriority 的参数配置。

    响应

    响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达, 则先处理响应优先级高的中断, 响应属性由NVIC_IRQChannelSubPriority 参数配置。

    例如,现在有三个中断向量,如下表
    在这里插入图片描述

    若内核正在执行C 的中断服务函数,则它能被抢占优先级更高的中断A 打断,由于B 和C 的抢占优先级相同,所以C 不能被B 打断。但如果B 和C 中断是同时到达的,内核就会首先响应响应优先级别更高的B 中断(高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的,而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断)。

    NVIC 的优先级组

    在配置优先级的时候,还要注意一个很重要的问题,即中断种类的数量。

    NVIC 只可以配置16 种中断向量的优先级,也就是说,抢占优先级和响应优先级的数量由一个4 位的数字来决定,把这个4 位数字的位数分配成抢占优先级部分和响应优先级部分。

    有5 组分配方式:

    1. 第 0 组: 所有4 位用来配置响应优先级。即16 种中断向量具有都不相同的响应优先级。
    2. 第 1 组:最高1 位用来配置抢占优先级,低3 位用来配置响应优先级。表示有2 种级别的抢占优先级(0 级,1 级),有8 种响应优先级,即在16 种中断向量之中,有 8 种中断,其抢占优先级都为0 级,而它们的响应优先级分别为0~7,其余8 种中断向量的抢占优先级则都为1 级,响应优先级别分别为0~7。
    3. 第 2 组:2 位用来配置抢占优先级,2 位用来配置响应优先级。即4 种抢占优先级,4 种响应优先级。
    4. 第 3 组:高3 位用来配置抢占优先级,最低1 位用来配置响应优先级。即有8 种抢占优先级,2 种响应2 优先级。
    5. 第 4 组:所有4 位用来配置抢占优先级,即NVIC 配置的16 种中断向量都是只有抢占属性,没有响应属性。

    要配置这些优先级组,可以采用库函数NVIC_PriorityGroupConfig(),可输入的参数为NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4,分别为以上介绍的5 种分配组。

    于是,有读者觉得疑惑了,如此强大的STM32,所有GPIO都能够配置成外部中断,USART、ADC 等外设也有中断,而NVIC 只能配置16 种中断向量,那么在某个工程中使用超过16 个中断怎么办呢?注意NVIC 能配置的是16 种中断向量,而不是16 个,当工程中有超过16 个中断向量时,必然有两个以上的中断向量是使用相同的中断种类,而具有相同中断种类的中断向量不能互相嵌套。

    中断寄存器

    ISER[8]

    全称 Interrupt Set-Enable Registers,是一个中断使能寄存器组。

    CM3 内核支持 256 个中断,这里用 8 个 32 位寄存器来控制,每个位控制一个中断。

    但是 STM32F103 的可屏蔽中断只有 60 个,所以对我们来说,有用的就是两个(ISER[0]和 ISER[1]), 总共可以表示 64 个中断。

    而 STM32F103 只用了其中的前 60 位。ISER[0]的 bit0~bit31 分别对应中断 0~31。ISER[1]的 bit0~27 对应中断 32~59;这样总共 60 个中断就分别对应上了。

    你要使能某个中断,必须设置相应的 ISER 位为 1,使该中断被使能(这里仅仅是使能,还要配合中 断分组、屏蔽、IO 口映射等设置才算是一个完整的中断设置)。具体每一位对应哪个中断,请参考 stm32f10x.h 里面的第 140 行处(针对编译器 MDK5 来说)。

    ICER[8]

    全称 Interrupt Clear-Enable Registers,是一个中断除能寄存器组。

    该寄存器组与 ISER 的作用恰好相反,是用来清除某个中断的使能的。其对应位的功能,也和 ICRT 一样。

    这里要专门设置一个 ICER 来清除中断位,而不是向 ISER 写 0 来清除,是因为 NVIC 的这些寄 存器都是写 1 有效的,写 0 是无效的。具体为什么这么设计,请看《CM3 权威指南》第 125 页, NVIC 概览一章。

    ISPR[8]

    全称 Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。

    每个位对应的中断和 ISER 是一样的。

    通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别 的中断。写 0 是无效的。

    ICPR[8]

    全称 Interrupt Clear-Pending Registers,是一个中断解挂控制寄存器组。

    其作用与 ISPR 相反,对应位也和 ISER 是一样的。

    通过设置 1,可以将挂起的中断接挂。写 0 无效。

    IABR[8]

    全称 Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。

    对应位所代表的中断和 ISER 一样,如果为 1,则表示该位所对应的中断正在被执行。

    这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。

    IP[240]

    全称 Interrupt Priority Registers,是一个中断优先级控制的寄存器组。

    这个寄存器组相当重要!STM32 的中断分组与这个寄存器组密切相关。

    IP 寄存器组由 240 个 8bit 的寄存器组成,每个可屏蔽中断占用 8bit,这样总共可以表示 240 个可屏蔽中断。

    而 STM32 只用到了其中的前 60 个。IP[59]~IP[0]分别对应中断 59~0。而每个可屏蔽中断占用的 8bit 并没有全部使用,而是只用了高 4 位。这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。


    STM32 将中断分为 5 个组,组 0~4。该分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。具体分配关系如下表:

    AIRCR[10:8]bit[7:4]分配情况分配结果
    01110: 40 位抢占优先级,4 位响应优先级
    11101: 31 位抢占优先级,3 位响应优先级
    21012: 22 位抢占优先级,2 位响应优先级
    31003: 13 位抢占优先级,1 位响应优先级
    40114: 04 位抢占优先级,0 位响应优先级

    例如,组设置为 3,那么此时所有的 60 个中断,每个中断的中断优先寄存器的高四位中的最高 3 位是抢占优先级,低 1 位是响应优先级。这样每个中断,你就可以设置抢占优先级位 0~7(因为抢占优先级有 3 位,最高可表示为 000=0~111=7),响应优先级(只有 1 位因此)为 1 或 0。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。

    这里需要注意两点:
    第一,如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
    第二,高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的,而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。

    结合实例说明一下:
    假定设置中断优先级组为 2,然后设置中断 3(RTC 中断)的抢占优先级为 2,响应优先级为 1。中断 6(外部中断 0)的抢占优先级为 3,响应优先级为 0。中断 7(外部中断 1)的抢占优先级为 2,响应优先级为 0。

    那么这 3 个中断的优先级顺序为:中断 7>中断 3>中断 6。

    上面例子中的中断 3 和中断 7 都可以打断中断 6 的中断。而中断 7 和中断 3 却不可以相互打断!


    接下来我们介绍如何使用库函数实现以上中断分组设置以及中断优先级管理,使得我们以后的中断设置简单化。NVIC 中断管理函数主要在 misc.c 文件里面。

    中断优先级分组函数

    void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);	//中断优先级分组函数
    

    这个函数唯一目的就是通过设置 SCB->AIRCR 寄存器来设置中断优先级分组

    比如我们设置整个系统的中断优先级分组值为 2,那么方法是:

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    

    中断初始化函数

    void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);	//中断初始化函数
    

    其中 NVIC_InitTypeDef 是一个结构体,中间有三个成员变量,这三个成员变量的作用是:

    1. NVIC_IRQChannel:定义初始化的是哪个中断,这个我们可以在 stm32f10x.h 中找到每个中断对应的名字。例如 USART1_IRQn。
    2. NVIC_IRQChannelPreemptionPriority:定义这个中断的抢占优先级别。
    3. NVIC_IRQChannelSubPriority:定义这个中断的子优先级别。
    4. NVIC_IRQChannelCmd:该中断是否使能。

    比如我们要使能串口 1 的中断,同时设置抢占优先级为 1,子优先级位 2,初始化的方法是:

    NVIC_InitTypeDef NVIC_InitStructure; 
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;			// 串口 1 中断 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1 ;	// 抢占优先级为 1 
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;			// 子优先级位 2 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 			// IRQ 通道使能 
    NVIC_Init(&NVIC_InitStructure); 							// 根据上面指定的参数初始化 NVIC 寄存器
    

    中断优先级设置步骤总结

    1. 系统运行开始的时候设置中断分组。确定组号,也就是确定抢占优先级和子优先级的 分配位数。调用函数为
    NVIC_PriorityGroupConfig();
    
    1. 设置所用到的中断的中断优先级别。对每个中断调用函数为
    NVIC_Init();
    

    Ref.

    1. STM32的抢占优先级和响应优先级
    展开全文
  • stm32的抢占优先级和响应优先级(也叫子优先级)

    万次阅读 多人点赞 2019-04-25 18:30:41
    一、抢占优先级和响应优先级 STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。 抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断(在执行...

    一、抢占优先级和响应优先级
    STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。
    抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断(在执行中断服务函数A 的过程中被中断B 打断,执行完中断服务函数B 再继续执行中断服务函数A),抢占属性由NVIC_IRQChannelPreemptionPriority 的参数配置。
    而响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达, 则先处理响应优先级高的中断, 响应属性由NVIC_IRQChannelSubPriority 参数配置。例如,现在有三个中断向量,如下表。
    在这里插入图片描述
    若内核正在执行C 的中断服务函数,则它能被抢占优先级更高的中断A 打断,由于B和C 的抢占优先级相同,所以C 不能被B 打断。但如果B 和C 中断是同时到达的,内核就会首先响应响应优先级别更高的B 中断。

    二、NVIC 的优先级组
    Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:
    第0组:所有4位用于指定响应优先级
    第1组:最高1位用于指定抢占式优先级,最低3位用于指定响 应优先级
    第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
    第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
    第四组:所有4位用于指定抢占式优先级

    M3用8bitsSTM32用高四位来表示抢占和子优先级:bit=1表示抢占bit=0表示非抢占即子优先级;所以共有5中方案分组:
    分组  Bit7 Bit6  Bit5  Bit4 说明:
    第0组 0   0    0   0
    第1组 1   0    0   0
    第2组 1   1    0   0 抢占共有22=4(0~3);子优先级22=4(0~3),共44=16级嵌套
    第3组 1   1    1   0  抢占共有23=4(0~7);子优先级21=2(0~1),共8
    2=16级嵌套
    第4组 1   1    1   1
    到底谁优先:数字越小优先级越高,抢占级数字小的可剥夺抢占级数字大的
    1抢占相同,子优先级不同:此时没有抢占剥夺,此时按照子优先级顺序排序
    2抢占和子优先级都相同但有先后:此时无抢占剥夺,依照FIFO,前一个执行完了才能执行后者;
    3抢占和子优先级都相同且同时到达:此时按照中断向量表顺序排先后

    三、举例说明
    中断优先级设置步骤:
    系统运行后先设置中断优先级分组。在主函数调用函数:void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
    整个系统执行过程中,只设置一次中断分组。
    针对每个中断,设置对应的抢占优先级和响应优先级:
    //配置过程
    void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断,此处可改为任何有中断功能的模块定时器,外部中断等,
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
    NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化NVIC寄存器
    如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。
    优先级分组只是给抢占优先级与响应优先级在中断优先级寄存器中高四位分配各个优先级数字所占的位数,在程序中只能设定一次。

    每写一个关于中断优先级的程序必须包含下列两个函数:
    (1)void NVIC_PriorityGroup();//写在主程序中;
    (2)NVIC_Init(); //写在初始化配置中

    默认情况下,如何不设置中断优先级分组,则中断优先级分组默认为0,即0位抢占优先级,4位响应优先级,则无任何抢占优先级,所以无论中断的优先级设多少,都没有抢占中断的功能,所以,如果想要一个中断打断另一个中断,必须设置中断优先级分组为1,2,3,4.
    如设置优先级分组为2:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    具体例子如下:
    {
    假设NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1)则

    // 使能EXTI0中断
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel; 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
    NVIC_Init(&NVIC_InitStructure);
    // 使能EXTI9_5中断 
    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0 
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
    NVIC_Init(&NVIC_InitStructure);
    //TIM3中断
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占优先级0级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //响应优先级3级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
    TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
    

    }

    在上例子中,优先抢占优先级,其数字越低,优先级越高。相同下比较响应优先级,其数字越低,优先级越高

    **Tips:**代码中抢占优先级0,1等,响应优先级(子优先级)0,1,3等,都是由自己设置的,但是必须在抢占优先级或者响应优先级设定的范围内。

    展开全文
  • 一、抢占优先级和响应优先级 STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。 抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断(在执行...

    一、抢占优先级和响应优先级

    STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。
    抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断(在执行中断服务函数A 的过程中被中断B 打断,执行完中断服务函数B 再继续执行中断服务函数A),抢占属性由NVIC_IRQChannelPreemptionPriority 的参数配置。
    而响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达, 则先处理响应优先级高的中断, 响应属性由NVIC_IRQChannelSubPriority 参数配置。例如,现在有三个中断向量,如下表。
    在这里插入图片描述

    若内核正在执行C 的中断服务函数,则它能被抢占优先级更高的中断A 打断,由于B和C 的抢占优先级相同,所以C 不能被B 打断。但如果B 和C 中断是同时到达的,内核就会首先响应响应优先级别更高的B 中断。

    二、NVIC 的优先级组

    Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:
    第0组:所有4位用于指定响应优先级
    第1组:最高1位用于指定抢占式优先级,最低3位用于指定响 应优先级
    第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
    第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
    第四组:所有4位用于指定抢占式优先级

    M3用8bits而STM32用高四位来表示抢占和子优先级:bit=1表示抢占;bit=0表示非抢占即子优先级;所以共有5中方案分组:
    分组  Bit7 Bit6  Bit5  Bit4 说明:
    第0组 0   0    0   0
    第1组 1   0    0   0
    第2组 1   1    0   0 抢占共有22=4(03);子优先级22=4(03),共44=16级嵌套
    第3组 1   1    1   0  抢占共有23=4(07);子优先级21=2(01),共82=16级嵌套
    第4组 1   1    1   1
    到底谁优先:数字越小优先级越高,抢占级数字小的可剥夺抢占级数字大的
    1抢占相同,子优先级不同:此时没有抢占剥夺,此时按照子优先级顺序排序
    2抢占和子优先级都相同但有先后:此时无抢占剥夺,依照FIFO,前一个执行完了才能执行后者;
    3抢占和子优先级都相同且同时到达:此时按照中断向量表顺序排先后

    例如如下代码:

    void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
    {
        if(htim->Instance==TIM3)
    	{
    		__HAL_RCC_TIM3_CLK_ENABLE();            //使能TIM3时钟
    		HAL_NVIC_SetPriority(TIM3_IRQn,1,3);    //设置中断优先级,抢占优先级1,子优先级3
    		HAL_NVIC_EnableIRQ(TIM3_IRQn);          //开启ITM3中断   
    	}
    	
    	 if(htim->Instance==TIM4)
    	{
    		__HAL_RCC_TIM4_CLK_ENABLE();            //使能TIM4时钟
    		HAL_NVIC_SetPriority(TIM4_IRQn,1,2);    //设置中断优先级,抢占优先级1,子优先级2
    		HAL_NVIC_EnableIRQ(TIM4_IRQn);          //开启ITM4中断   
    	}
    }
    

    则TIM4的优先级比TIM3优先级高。

    展开全文
  • 中断响应优先级和中断处理优先级的区别 中断响应优先级是由硬件排队线路或中断查询程序的查询顺序决定的,不可动态改变; 而中断优先级可以由中断屏蔽字来改变,反映的是正在处理的中断是否比新发生的中断的处理...
  • STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作’亚优先级’或’副优先级’,每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级...
  • STM32中断分配——抢占优先级与响应优先级

    千次阅读 多人点赞 2019-01-25 16:51:06
    4位二进制表示抢占优先级和响应优先级,用Q表示抢占优先级,用X表示响应优先级,那么4位二进制进行中断配置有以下5种方式: (1) XXXX: 4位全部用来配置响应优先级,16种中断向量都具有不同的响应优先级;...
  • STM32 NVIC 抢占优先级和响应优先级

    千次阅读 2018-11-14 19:37:36
    STM32 NVIC 抢占优先级和响应优先级
  • STM32中断 抢占优先级 响应优先级

    千次阅读 2019-06-21 17:54:22
    STM32中断有0-4 5个分组,对每个中断设置一个抢占优先级和响应优先级。 分组配置是在寄存器SCB->AIRCR中配置: AIRCR[10:8] IP[7:4]分配情况 分配结果 0 111 0:4 0位抢占优先级,4位响应优先级 1 ...
  • STM32的抢占优先级和响应优先级

    万次阅读 多人点赞 2017-12-19 12:25:09
    一、抢占优先级和响应优先级  STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号 越小,表明它的优先级别越高。  抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断...
  • 抢占优先级和响应优先级,其实是一个中断所包含的两个优先级,其中前者是对抢占优先级的级别划分,后者是相同抢占优先级的优先级别的划分。 比如:中断A抢占优先级比B高,那么A的中断可以在B里面触发,忽略响应...
  • 之前学习嵌入式的时候不太明白中断优先级分组与抢占优先级和响应优先级的关系,比如分组为2,抢占优先级也为2,响应优先级也为2,就是不明白他们之间有什么关系,谁决定谁,总共有多少个数值可供选择。  趁着现在...
  • NVIC抢占和响应优先级设置
  • 1)中断响应分为:自然优先级、抢占优先级、响应优先级。2)抢占优先级和响应优先级,其实是一个中断所包含的两个优先级,其中前者是抢占优先级之间的级别划分,后者是相同抢占优先级的优先级别的划分。中断A抢占...
  • 同时,对每个中断设置一个抢占优先级和一个响应优先级值。分组配置是在寄存器SCB->AIRCR中配置:抢占优先级 & 响应优先级区别:1. 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。2. ...
  • //对中断源进行分组,每组有一个抢占优先级和响应优先级。 上面的理解是错误的,事实上,所有中断源都是一个组。 这个操作应该称之为设置中断优先级的控制模式(控制组别)。 清楚地说是:这里不应该用“组”这个...
  • 主要介绍了IOS开发之手势响应事件优先级的实例详解的相关资料,希望通过本文大家能够掌握手势响应优先级的使用方法,需要的朋友可以参考下
  • 转载于:https://blog.51cto.com/13502993/2053541
  • 然后在设置相应的抢占优先级和响应优先级。 3.抢占优先级和响应优先级的区别: 抢占优先级为0的高于抢占优先级为1的,抢占优先级0>1>2>3>4。 响应优先级同理。 4. 中断函数 4.1 中断优先级分组函
  • 某计算机系统共有五级中断,其中断响应优先级从高到低为來源:互聯網2010-02-16 21:16:18評論分類: 電腦/網絡 >> 操作系統/系統故障問題描述:某计算机系统共有五级中断,其中断响应优先级从高到低为。但操作...
  • STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。  抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断(在执行中断服务函数 A 的过程中...
  • STM32 NVIC之抢占优先级和响应优先级

    千次阅读 2014-08-27 13:28:29
    STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级...
  • STM32 的中断处理流程,中断嵌套,中断相应优先级
  • 抢占优先级和响应优先级 STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性, 其属性编号越小,表明它的优先级别越高。 抢占,是指打断其它中断的属性,即因为具有这个属性,会出现嵌套中断 (在...
  • stm32中多了响应优先级这一概念。 stm32的中断分为 1.抢占(占先)优先级。 2.响应优先级。 1.抢占优先级。抢占优先级高的中断,可以打断抢占优先级低的中断。 2.响应优先级。抢占优先级相同的中断,响应优先级高的...
  • 响应优先级,指的是“不可嵌套”的优先级,又叫“副优先级”,也即,主优先级相同的两个中断,“副优先级高”的那个,只能比“副优先级低”的那个优先响应,但不能打断。 STM32支持几个主优先级,几个副优先级?这...
  • STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的...
  • 各种规模的组织都正被其网络中已经存在的网络所覆盖,伴随着网络规模的不断扩大和多样化的发展,并且...作为网络的安全管理员要全面了解组织的网络环境中的漏洞,并且根据漏洞的危急情况进行分类处理,制定优先级。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 215,647
精华内容 86,258
关键字:

响应优先级

友情链接: MiniModbusRTU.rar