精华内容
下载资源
问答
  • 中断优先级寄存器
    千次阅读
    2021-05-14 21:22:47

    一、综述
    STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。

    二、优先级判断
    STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作’亚优先级’或’副优先级’,每个中断源都需要被指定这两种优先级。

    具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。

    当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

    三、优先级分组
    既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位在NVIC应用中断与复位控制寄丛器(AIRCR)的中断优先级分组域中,可以有8种分配方式,如下:

    所有8位用于指定响应优先级
    最高1位用于指定抢占式优先级,最低7位用于指定响应优先级
    最高2位用于指定抢占式优先级,最低6位用于指定响应优先级
    最高3位用于指定抢占式优先级,最低5位用于指定响应优先级
    最高4位用于指定抢占式优先级,最低4位用于指定响应优先级
    最高5位用于指定抢占式优先级,最低3位用于指定响应优先级
    最高6位用于指定抢占式优先级,最低2位用于指定响应优先级
    最高7位用于指定抢占式优先级,最低1位用于指定响应优先级

    这就是优先级分组的概念。

    Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位(AIRCR高四位),这4个寄存器位的分组方式如下:

    第0组:所有4位用于指定响应优先级
    第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
    第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
    第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
    第4组:所有4位用于指定抢占式优先级

    可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:

    NVIC_PriorityGroup_0 => 选择第0组
    NVIC_PriorityGroup_1 => 选择第1组
    NVIC_PriorityGroup_2 => 选择第2组
    NVIC_PriorityGroup_3 => 选择第3组
    NVIC_PriorityGroup_4 => 选择第4组

    中断优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄丛器的高四位分配各个优先级数字所占的位数。在一个程序中只能设定一次

    四、中断源的优先级
    接下来就是指定中断源的优先级,中断源优先级是在中断优先级寄存器中设置的,只能设置及高四位,必须根据中断优先级分组中设置好的位数来在该寄存器中设置相应的数值。假如你选择中断优先级分组的第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级,那么抢占式优先级就有000-111共八种数据选择,也就是有八个中断嵌套,而响应优先级中有0和1两种,总共有8*2=16种优先级。
    中断源优先级具体的设置了该中断源的优先级别
    在一个程序中可以设定多个(最多16个)优先级,每个中断源只能设定的一个。

    每写一个关于中断优先级的程序必须包含下列两个函数:

    (1)void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)中断分组设置
    (2)void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)中断优先级设置

    更多相关内容
  • 一、准备工作 ...1、现代单片机MC96F6332D提供了内部中断优先级设置的寄存器IP1和IP;如下图所示: 注意:默认的优先级为上图蓝色框图中所示,优先级呈“之”字形逐渐下降,其中Interrupt0/6//12/18为...

    一、准备工作

    1、KEIL C51编译环境

    2、外部中断EINT示例代码-MC96F6332D

    3、MC96F6332D 开发板

    4、USB-OCD II仿真器

    二、代码部分

    1、现代单片机MC96F6332D提供了内部中断优先级设置的寄存器IP1和IP;如下图所示:

    注意:默认的优先级为上图蓝色框图中所示,优先级呈“之”字形逐渐下降,其中Interrupt0/6//12/18为一组,Interrupt1/7/13/19为一组,以此类推,共计6组;其中最多可以设置4组的优先级,剩余的2组按照上图默认方式再进行排序。

    2、在中断的方框图中也可以看出,有4级优先级可以进行配置:

    3、根据MC96F6332D外部中断EINT的示例代码,此示例在外部中断的工程上进行修改。工程代码中采用了外部中断0和8两个外部中断,具体如下所示:

    外部中断引脚号端口号

    中断向量号

      Interrupt

    EINT029P025
    EINT84P526

    4、在中断优先级默认的情况下,外部中断EINT8(Interrupt6)优先级高于外部中断EINT0(Interrupt5);所以EINT0(Interrupt5)的中断函数会被EINT8(Interrupt6)中断;故增加延时函数并修改中断服务函数,增加低优先级EINT0(Interrupt5)中断函数的执行时间;代码如下所示:

    //延时函数
    void delay_time(unsigned int  tt)
    {
    	unsigned int times;
    
    	while(tt--)
    	{
    		times = 1000;
    		while(times--);
    	}
    }
    
    
    //中断函数修改如下
    //======================================================
    // interrupt routines
    //======================================================
    
    
    void INT_Ext8() interrupt 6
    {
    	// External interrupt 8 
    	sei();
    	
    	EXIT8_STA = 1;		//外部中断8标志使能
    	
    	printf("EXIT 8 Interrupt into.\r\n");
    	
    	delay_time(3267);
    	a_break++;
    	if(a_break >= 200)
    		 a_break = 0;
    	
    	printf("EXIT 8 Interrupt out.\r\n");
    	
    }
    
    void INT_Ext0_7() interrupt 5
    {
    	// External interrupt 0 ~ 7
    	//判断外部引脚0是否被按下
    	sei();
    	
    	printf("EXIT 0 Interrupt into .\r\n");
    		if(EIFLAG0 & 0x01)
    			{
    				EIFLAG0 &= 0xFE;
    				EXIT0_STA = 1;		//外部中断0标志使能
    			}
    			
    //	delay_time(3267);
    //	a_break++;
    //	if(a_break >= 200)
    //		a_break = 0;
    	
    	printf("EXIT 0 Interrupt out.\r\n");
    			
    }

    5、工程代码编译时会提示有2个警告,是因为中断函数中调用了printf函数,此处忽略警告。把代码下载到MC96F6332D并进行仿真,红色方框中分别为两个中断函数的执行时间;

    从仿真结果上可以看到EINT0(Interrupt5)的中断函数并没有被EINT8(Interrupt6)中断,这个是为什么???

    6、尝试修改中断优先级寄存器的值,将Interrupt 6所在的这一组强制定义为最高优先级(按照“之”字形的优先级顺序,其实还是保持默认的高优先级);在Main函数最前端增加如下代码:

    //重新定义优先级
    IP1 = 0x01;				
    IP = 0x01;

    7、将代码进行编译并下载;再进行程序的仿真,其代码仿真结果如下所示:

    外部的EINT8(Interrupt6)成功将EINT0(Interrupt5)进行中断;程序运行结果符合预期设置;所以中断嵌套必须先进行优先级分组。

    注意:在需要被中断的中断函数中必须增加sei();函数,否则程序的嵌套将得不到正确运行,在多级中断章节中有说明:(我也是踩坑爬过来的)

    8、试想一下:高优先级可以打断低优先级的中断,那么高优先级的中断执行时,如果低优先级中断到来,这个时候低优先级的中断是否会被MCU丢弃?

    答案:高优先级中断执行过程中,低优先级中断肯定不会中断高优先级的中断函数,但是低优先级的中断会在高优先级中断执行完毕后被响应;

    如果低优先级中断在高优先级中断执行的过程到来了多次,最后也是仅仅保留一次的响应机会。大家可以自行验证,在原来程序上简单修改即可,下面直接上结果供大家参考:

    三、实验总结:

    1、中断函数在保持默认优先级的情况下不会进入中断嵌套,中断函数是根据中断顺序一个接一个的执行;如果高优先级的中断在执行过程中,低优先级的中断到来,高优先级中断函数执行完毕后,低优先级的中断将会被执行;

    2、在中断嵌套的使用中:被中断的函数中需要增加sei();函数,否则不能进入中断的嵌套;

    3、使用中断的嵌套必须先进行中断组优先级的配置(在中断组中,中断优先级的响应顺序不能被改变;例如中断组Interrupt0/6//12/18中0-->6-->12-->18的优先级顺序不能被改变);

    4、具体的代码可以访问链接:https://share.weiyun.com/5E7eyoX;进行免费下载。


    因为小编自己能力水平有限,文中难免有错误或表达失误的信息,还望广大阅读者留言批评指正,谢谢。

    展开全文
  • *工程模板(寄存器版本) */ #include "stm32f10x.h" /** * 主函数 */ int main(void) { // 开启GPIOB 端口时钟 RCC_APB2ENR |= (1<<3); //清空控制PB0的端口位 GPIOB_CRL &= ~( 0x0F<< (4...

    抢占优先级和响应优先级

    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 SCB->AIRCR 寄存器和中断优先级寄存器使用理解

    千次阅读 多人点赞 2019-07-30 21:19:23
    参考: Cortex M3权威指南(中文).pdf STM32F4xx中文参考手册.pdf STM32F4开发指南-寄存器版本_V1.1.pdf ...首先stm32的中断有240个,中断优先级分两级抢占和响应。两种级别,规则如下,需要记住 高...

    参考:

    Cortex M3权威指南(中文).pdf

    STM32F4xx中文参考手册.pdf

    STM32F4开发指南-寄存器版本_V1.1.pdf

    https://blog.csdn.net/rng_uzi_/article/details/90762767

    记住:抢占和响应的值越小级别越高。

    首先stm32的中断有240个,中断优先级分两级抢占和响应。两种级别,规则如下,需要记住

    高抢占可以打断低抢占

    高响应不能打断低响应(同一抢占级,处理内部的优先级)

    中断7:抢占:2响应:0

    中断3:抢占:2响应:1

    同抢占级别,同时发生中断,响应级别的高先执行,(不是打断)

    中断6:抢占:3:响应0

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

     

    设置抢占和响应级别

     

     SCB->AIRCR 寄存器和IP寄存器

    首先两者联系,SCB->AIRCR 寄存器的10:8位bit,决定了,IP寄存器4:7bit的高四位的抢占与响应位的分配

    读一读关于IP寄存器的描述,子优先级就是响应优先级

     

    那么SCB->AIRCR 寄存器的10:8位bit怎么决定这个分配呢?

    AIRCR 寄存器的10:8位,设置几位抢占,几位响应。举例如下

    AIRCR寄存器8:10与IP寄存器4:7
     AIRCR寄存器8:10IP寄存器4:7 
    0111抢占:0bit,响应:4bit 
    1110抢占:1bit,响应:3bit 
    2101抢占:2bit,响应:2bit 
    3100抢占:3bit,响应:1bit 
    4011抢占:4bit,响应:0bit 

     怎么理解这个表呢?

    AIRCR寄存器8:10是111,表示7,即ip寄存器的第四位到第七位为止是响应级(从0开始),本来就ip寄存器的4:7bit,那4,5,6,7bit,都表示响应级。

    AIRCR寄存器8:10是100,表示4,ip寄存器的第四位到第四位表示响应级。即一位表示响应级

    实例代码  0x05FA0000 看上面图片表D13

     

      SCB->AIRCR = 0x05FA0000 | 0x400;  //  04h=0100b  中断优先级分组 抢占:响应=3:1

     

    那么最多就是0:15级抢占,就是15个中断可相互打断,即011,没有响应级  ,4组

    如果全是响应,那么哪个高,那个先发生,先执行哪个。即111,第七位以内都是响应级,4:7bit都表示,0组

    举例:这是正点原子外部中断实验的优先级设置代码,两位的优先级,4,5,即101,第五位以内都是响应级

    	MY_NVIC_Init(3,2,EXTI2_IRQn,2);		//抢占3,子优先级2,组2
    	MY_NVIC_Init(2,2,EXTI3_IRQn,2);		//抢占2,子优先级2,组2	   
    	MY_NVIC_Init(1,2,EXTI4_IRQn,2);		//抢占1,子优先级2,组2	   
    	MY_NVIC_Init(0,2,EXTI0_IRQn,2);		//抢占0,子优先级2,组2	

    这里设置为组2,即:AIRCR寄存器的8:10bit,101。则IP寄存器4:7bit,第6,7bit为设置抢占优先级,4,5bit设置响应优先级

    那么就是,4级抢断,4种响应。所以所有中断的级别都没有超过2^2=4。只有0,1,2,3级。

     

    应用:

      SCB->AIRCR = 0x05FA0000 | 0x400;  //中断优先级分组 抢占:响应=3:1

    8,9,10bit,为100,ip寄存器高四位的4位是响应,5,6,7位是抢占

    ip寄存器,8bit寄存器,只用了高四位,111抢占,1响应。

    2^3=8级抢断,2级响应
        
      NVIC->IP[39] = 0xf0; //最低抢占优先级,最低响应优先级1111

    39号中断,最高级中断,没有中断的能打断。

    参考手册表49,查相应中断的位置。


     NVIC->ISER[1] |= (1<<(39-32)); //使能中断线39,也就是usart3中断

    256个中断,每个ISER,32位寄存器,控制32个中断。需要8个ISER,即ISER[8]寄存器组。

    39号中断,在ISER[1],32,33,34,335,36,37,38,39。第七位置一

    39-32=7

     

     

     

     

     

     

    展开全文
  • STM32寄存器版本中断分组及优先级讲解和配置,附代码
  • stm32--NVIC中断优先级管理

    千次阅读 2022-05-01 21:42:42
    一、NVIC中断优先级分组 二、NVIC中断优先级设置 一、NVIC中断优先级分组 1.(1)CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的编程中断设置 (2)STM32并没有使用CM3内核的全部东西...
  • 4.3.1 中断允许寄存器IE 4.3.2 中断优先级寄存器IP
  • 设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管加1显示程序)。 #include<...
  • 实现控制和控制分别由特殊功能寄存器区中的中断允许寄存器IE和中断优先级寄存器IP来实现的。下面介绍这两个特殊功能寄存器。 中断允许寄存器IE 的CPU对各中断源的开放或屏蔽,是由片内的中断允许寄存器IE控制的。...
  • Gic 中的中断优先级

    2020-11-12 15:21:24
    1、中断优先级寄存器每8bit一个中断,但是那些bit有效则是有硬件设计时决定,通过查询ICC_CTLR_EL1/3.PRIbits,具体描述查看4.8.2 priority grouping 2、GICD_IPRIORITYR<n> 中的寄存器存放的是spi寄存器,sgi...
  • STM32单片机的一个强大之处在于用于庞大的中断体系,掌握STM32对中断优先级的定义是学好STM32中断的前提。本次我们讲解STM32关于中断优先级NVIC的定义。 我们以基本原理、寄存器介绍和库函数配置这一 顺序来讲解。
  • Cortex M3内核支持256个中断...中断优先级分组 首先,对STM32中断进行分组(在系统初始化时就分好组),组0~4.同时,对每个中断设置一个抢占优先级和一个响应优先级值 分组配置是在寄存器SCB->AIRCR中进行配置 组
  • STM8的中断优先级配置

    2021-06-28 16:58:23
    STM8没有专门的中断状态寄存器,所以只能通过刚进入中断就读取IDR来判断,不过在某些情况下,此种方法就不好用了,所以在设计的时候就要考虑清楚,是不是会冲突.最好把有冲突的中断放到不同的组。 STM8的外部中断采用 ...
  • STM32中断设置以及中断优先级设置

    万次阅读 多人点赞 2018-09-13 15:26:45
    最近,在做一个智能锁的项目,...最终,调试出bug就是由于中断优先级的影响。 本项目使用到的是STM32F030C8型号的MCU,我们可以从官方下载到的标准库文件中的启动汇编文件中,查看到本型号单片机的外部中断向量表...
  • C51中设置中断优先级,需要对中断寄存器IP进行配置。具体值需要根据用户需要的优先级顺序进行确定,具体的设置方法就是直接写如下C语言语句:IP = 06H;// 如果5个中断同时发生,则响应次序为:定时器0 -> 外中断1...
  • 单片机之中断优先级设置

    千次阅读 2020-09-14 17:39:35
    中断优先级的基本规则 1.低优先级中断可被高优先级中断所中断 2.任何中断都不被同级中断所中断 然而datashhet里STC12C5A60S2单片机复位后IP、IP2、IPH、IP2H均为00H,各个中断源都是低优先级=》不能被同级中断所...
  • CM3中文版本的附录D NVIC寄存器小结 目录中两个中断优先级寄存器阵列,下面那个错误的,英文版本是NVIC Peripheral ID Registers
  • 【STM32】串口(USART)通讯 (一文搞懂寄存器操作、端口复用和中断优先级(NVIC)配置) 建议收藏加关注,单片机的深度解读尽在此。
  • 介绍了ARM的工作模式、中断源、中断优先级和标志寄存器
  • STM32 NVIC 中断优先级

    2020-01-17 10:22:35
    NVIC 中断优先级 CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256级的可编程中断设置。但 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。STM32 有 84 个中断,...
  • STM32分为抢占式优先级和响应优先级,每个中断源都需要被指定这两种优先级。 二、 优先顺序如下: 1、抢占优先级不同,会涉及到中断嵌套,抢占优先级高的会优先抢占优先级低的,优先得到执行。(注意:优先级...
  • 很多人在配置STM32中断时对固件库中的这个函数NVIC_PriorityGroupConfig()——配置优先级分组方式,会很不理解,尤其是看中文翻译版的,因为中文翻译版里把这里翻译成“先占优先级和从优先级”这样翻译其实是不对的...
  • STM32中断优先级、FreeRTOS中断优先级,任务优先级
  • NVIC中断优先级管理

    2022-04-30 16:30:43
    1.NVIC中断优先级管理中NVIC是中断优先级管理的专业术语 2. 3. 二.中断优先级分组(在系统初始化的时候就需要把组分好) 1.方法 4 注意:1.每一个中断都有一个IP寄存器,它有一个4~7个位,就是有四个位. ...
  • 51单片机中断的使用及优先级设置 51单片机有两个外部中断,两个定时器/计数器,两个外部中断分别是int0,int1。定时器/计数器分别是t0,t1,还有一个串口中断TI/RI,加起来有五个中断。它们在硬件上的排列顺序是INT0...
  • 其利用51系统内建的中断允许寄存器IE和中断优先级寄存器IP,通过屏蔽字机制来实现;以C51的形式,给出这种扩展方法的函数库实现,为该方法的使用赋予友好、简洁的用户接口。 关键词:MCS-51单片机 中断优先级 软扩展...
  • 为什么要设置PendSV为最低优先级? 应用程序执行SVC 时都是希望所需的请求立即得到响应。 PendSV 则不同,它是可以像普通的中断一样被抢占挂起的(不像SVC 那样会上访)。 操作系统 可以利用它“缓期执行”一个异常...
  • stm32中断优先级概述

    千次阅读 2021-01-17 13:59:05
    stm32中断优先级概述一:综述STM32 目前支持的中断共为 84 个(16 个内核+68 个外部),可以提供16 级可编程中断优先级的设置(仅使用中断优先级设置8bit中的高4位)和16个抢占优先级(因为抢占优先级最多可以有4位)。...
  • 关于51/STC单片机中断优先级的调整

    千次阅读 2022-01-01 11:28:02
    以一个简单的LED灯程序掌握51/STC单片机的中断优先级调整 即:在主程序中设定LED为熄灭状态, 利用LED的点亮或熄灭状态完成对外部中断优先级的调整 理论: 中断源类型 中断类型 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 57,368
精华内容 22,947
关键字:

中断优先级寄存器