STM32 中断优先级理解
- 格式:docx
- 大小:76.93 KB
- 文档页数:3
CM3 内核支持256 个中断,其中包含了16 个内核中断和240 个外部中断,并且具有256级的可编程中断设置。
但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分。
STM32 有84 个中断,包括16 个内核中断和68 个可屏蔽中断,具有16 级可编程的中断优先级。
而我们常用的就是这68 个可屏蔽中断,但是STM32 的68 个可屏蔽中断,在STM32F103 系列上面,又只有60 个(在107 系列才有68 个)。
在MDK 内,与NVIC 相关的寄存器,MDK 为其定义了如下的结构体:点击(此处)折叠或打开1.typedef struct2.{3.vu32 ISER[2];4.u32 RESERVED0[30];5.vu32 ICER[2];6.u32 RSERVED1[30];7.vu32 ISPR[2];8.u32 RESERVED2[30];9.vu32 ICPR[2];10.u32 RESERVED3[30];11.vu32 IABR[2];12.u32 RESERVED4[62];13.vu32 IPR[15];14.} NVIC_TypeDef;STM32 的中断在这些寄存器的控制下有序的执行的。
只有了解这些中断寄存器,才能了解STM32 的中断。
下面简要介绍这几个寄存器:ISER[2]:I SER 全称是:Interrupt Set-Enable Registers,这是一个中断使能寄存器组。
上面说了STM32F103 的可屏蔽中断只有60 个,这里用了 2 个32 位的寄存器,总共可以表示64 个中断。
而STM32F103 只用了其中的前60 位。
ISER[0]的bit0~bit31 分别对应中断0~31。
ISER[1]的bit0~27 对应中断32~59;这样总共60 个中断就分别对应上了。
你要使能某个中断,必须设置相应的ISER 位为1,使该中断被使能(这里仅仅是使能,还要配合中断分组、屏蔽、IO 口映射等设置才算是一个完整的中断设置)。
STM32的中断优先级别理解20210524
理解:
1、STM32 总共有4个bit⽤来描述中断的种类,4个bit⼀共有5种组合【抢占式优先级别+副优先级(响应优先级)】,分组就决定了抢占优先级占⽤的bit数。
组0也就是表⽰0个bit为抢占优先级。
2、抢占式优先级别⾼的可以打断低优先级别的⼯作,相同抢占优先级的不能相互打断。
3、副优先级⾼的中断来临是,序号低的优先处理【响应】。
前提条件1:组别优先顺序(第0组优先级最强,第4组优先级最弱):
NVIC_PriorityGroup_0>NVIC_PriorityGroup_1>NVIC_PriorityGroup_2>NVIC_PriorityGroup_3>NVIC_PriorityGroup_4
前提条件2:“组”优先级别>“抢”占优先级别>“副”优先级别
前提条件3:同⼀组优先级别中,不同的抢占级别之间,其中⼀抢占级别正在做事,另外抢占级别不能打断他;(即”同⼀组优先级下的中断源间,没有中断嵌套“)
前提条件4:不同组优先级别间,依据优先级强弱,优先级别⾼的组的中断源可以打断优先级别低的组的正在做的事情;(即:不同组优先级间,可以中断嵌套)
对于上⾯的理解:
STM32中,每个设备都可以配置不同的中断组,抢占优先级,响应优先级。
具体举例:
项⽬需要2个串⼝,但是不是两个串⼝同时使⽤,只是随机使⽤其中⼀个,程序对2个串⼝的优先级需要配置;
要求两个串⼝⼯作的时候不能相互打断,最好也不鞥你被其他程序打断,那么可以把2个串⼝都设置成 NVIC_PriorityGroup_0 分组0【0个bit表⽰抢占优先级】,副优先级可以分别设置为1,2。
STM32中断(转载)分类:STM32 2011-12-15 17:07 277人阅读评论(0) 收藏举报STM32中断优先级相关概念与使用笔记上海华东师范大学通信工程系ma-chao一、基本概念1.ARM cortex_m3 内核支持256 个中断(16 个内核+240 外部)和可编程256 级中断优先级的设置,与其相关的中断控制和中断优先级控制寄存器(NVIC、SYSTICK 等)也都属于cortex_m3 内核的部分。
STM32 采用了cortex_m3 内核,所以这部分仍旧保留使用,但STM32并没有使用cortex_m3 内核全部的东西(如内存保护单元MPU 等),因此它的NVIC 是cortex_m3 内核的NVIC 的子集。
2.STM32 目前支持的中断共为84 个(16 个内核+68 个外部),和16 级可编程中断优先级的设置(仅使用中断优先级设置8bit 中的高4 位,见后面解释)。
《参考最新101xx-107xx STM32 Reference manual, RM0008》。
3.以下主要对“外部中断通道”进行说明。
对于cortex_m3 内核所支持的240 个外部中断,我在这里使用了“中断通道”这个概念,因为尽管每个中断对应一个外围设备,但该外围设备通常具备若干个可以引起中断的中断源或中断事件。
而该设备的所有的中断都只能通过该指定的“中断通道”向内核申请中断。
因此,下面关于中断优先级的概念都是针对“中断通道”的。
当该中断通道的优先级确定后,也就确定了该外围设备的中断优先级,并且该设备所能产生的所有类型的中断,都享有相同的通道中断优先级。
至于该设备本身产生的多个中断的执行顺序,则取决于用户的中断服务程序。
4.STM32 可以支持的68 个外部中断通道,已经固定的分配给相应的外部设备。
每个中断通道都具备自己的中断优先级控制字节PRI_n(8 位,但在STM32 中只使用 4 位,高4 位有效),每 4 个通道的8 位中断优先级控制字(PRI_n)构成一个32 位的优先级寄存器(PriorityRegister)。
STM32抢占优先级、响应优先级的详细讲解说明:stm32的优先级以寄存器的4位数据来表示的,因此2^4=16只能表示16级中断嵌套。
如上图所示:NVIC_PriotityGroup_0:即4位全部用于响应优先级(子优先级);因此,抢占优先级0级中断嵌套;响应优先级共有16即0—15级中断嵌套;NVIC_PriotityGroup_1:即1位用于响应优先级,3位用于响应优先级;因此,抢占优先级0下面共有2^3=8级中断嵌套;抢占优先级1下面共有2^3=8级中断嵌套;NVIC_PriotityGroup_2:即2位用于响应优先级,2位用于响应优先级;因此,抢占优先级总共有2^2=4个分别为:抢占优先级0至3且每个抢占优先级下面都有2^2=4个响应优先级。
NVIC_PriotityGroup_3:即3位用于响应优先级,1位用于响应优先级;因此,抢占优先级总共有2^3=8个分别为:抢占优先级0至7且每个抢占优先级下面都有2^1=2个响应优先级。
类似的,NVIC_PriotityGroup_4:即4位用于响应优先级,0位用于响应优先级;因此,抢占优先级16即0—15优先级中断嵌套;响应优先级共有0级中断嵌套;注意:响应优先级相等时,抢占优先级越小,中断级别越高抢占优先级相等时,响应优先级越小,中断级别越高举个栗子:void NVIC_Config(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC_PriorityGroup_2即表明抢占优先级可有0—3级中断嵌套;响应优先级可设0—3级中断嵌套。
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//配置串口中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPrior ity = 0;//0即表明抢占优先级0;即为NVIC_PriorityGroup_2抢占优先0—3级中级别最高的优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//0即表明响应优先级0;即为NVIC_PriorityGroup_2响应优先0—3级中级别最高的优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}总结:如上程序中串口1中断抢占优先级0,响应优先级0;其即为NVIC_PriorityGroup_2中中断优先级别最高,能够打断其它正在执行的中断。
STM32中断中设置的先占式优先级与从优先级STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。
如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位可以有8种分配方式,如下:所有8位用于指定响应优先级最高1位用于指定抢占式优先级,最低7位用于指定响应优先级最高2位用于指定抢占式优先级,最低6位用于指定响应优先级最高3位用于指定抢占式优先级,最低5位用于指定响应优先级最高4位用于指定抢占式优先级,最低4位用于指定响应优先级最高5位用于指定抢占式优先级,最低3位用于指定响应优先级最高6位用于指定抢占式优先级,最低2位用于指定响应优先级最高7位用于指定抢占式优先级,最低1位用于指定响应优先级这就是优先级分组的概念。
--------------------------------------------------------------------------------Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:第0组:所有4位用于指定响应优先级第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级第4组:所有4位用于指定抢占式优先级可以通过调用STM32的固件库中的函数选择使用哪种优先级分组方式,这个函数的参数有下列5种: NVIC_PriorityGroup_0 => 选择第0组NVIC_PriorityGroup_1 => 选择第1组NVIC_PriorityGroup_2 => 选择第2组NVIC_PriorityGroup_3 => 选择第3组NVIC_PriorityGroup_4 => 选择第4组接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:// 选择使用优先级分组第1组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);// 使能EXTI0中断NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 使能EXTI9_5中断NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;NVIC_Init(&NVIC_InitStructure);--------------------------------------------------------------------------------要注意的几点是:1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;2)抢占式优先级别相同的中断源之间没有嵌套关系;3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。
stm32中断程序STM32是一款非常强大的微控制器系列,它的应用范围非常广泛,包括智能家居、汽车电子、医疗器械等等。
在STM32中,中断是非常重要的一个概念。
本文将详细介绍STM32中的中断程序。
一、中断的基本概念中断是指在程序执行过程中,某些硬件或软件条件满足时,CPU通过改变程序的执行顺序,转去执行相应的处理程序,处理完毕后再返回原程序继续执行。
换句话说,中断是指CPU在执行主程序时,暂停执行当前的指令序列,执行一段中断处理程序,处理完毕后再返回原处继续执行主程序。
二、STM32的中断控制器STM32的中断控制器是NVIC(Nested Vectored Interrupt Controller),它集成在Cortex-M3内核中。
NVIC可以处理中断请求,也可以管理中断优先级,它可以同时处理256个中断请求,并支持嵌套中断。
三、中断向量表中断向量表是一个表格,它里面存放着中断处理程序的入口地址。
在STM32中,中断向量表是存放在Flash中的,被称为向量表区或者中断向量表区。
向量表区的大小是固定的,为48字节(即12个中断)或者1024字节(即256个中断),它的起始地址是0x08000000或者0x00000000(取决于Flash的底层硬件设计)。
四、中断服务程序的编写中断服务程序可以分为两个部分:中断处理和中断返回。
中断处理是指具体的中断处理代码,中断返回则是指恢复现场并退出中断的代码。
在STM32中,中断服务程序的函数原型如下:void EXTIx_IRQHandler(void)其中,x表示中断源的编号,范围从0到15。
EXTI表示是外部中断。
在开发STM32中断程序之前,需要实现中断控制器的配置。
步骤如下:(1)设置中断向量表的首地址在开发环境中,中断向量表的首地址已经被定义好了。
如果在自定义的应用程序中需要重新设置中断向量表的首地址,可以使用以下代码:NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x10000);其中,NVIC_VectTab_FLASH表示中断向量表的首地址存储在Flash中,0x10000表示中断向量表的起始地址。
STM32中断优先级彻底讲解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十一位用作选定积极响应优先级这就是优先级分组的概念。
STM32中断优先级彻底讲解一:综述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位用于指定响应优先级这就是优先级分组的概念。
Stm32中断优先级相关概念与使用笔记一、基本概念1.ARM cortex_m3内核支持256个中断(16个内核+240外部)和可编程256级中断优先级的设置,与中断控制核中断优先级控制的寄存器(NVIC、SYSTICK等)属于cortex_m3内核的部分。
STM32采用了cortex_m3内核,所以这些部分仍旧保留使用,但并不是完全使用的,只是使用了一部分。
2.STM32目前支持的中断共为84个(16个内核+68个外部),和16级可编程中断优先级的设置(仅使用中断优先级设置8bit中的高4位,见后面解释)。
《参考最新101xx-107xx STM32 Reference manual, RM0008》。
以下主要对外部中断进行说明。
3.68个外部中断(通道)在STM32中已经固定的分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但在STM32中只有高4位有效),每4个通道的8位中断优先级控制字(PRI_n)构成一个32位的优先级寄存器(Priority Register)。
68个通道的优先级寄存器至少有是17个32位的寄存器,它们是NVIC寄存器的一部分。
4.这4bit的中断优先级控制位还要分成2组看,从高位开始,前面的定义抢先式优先级,后面为子优先级。
4bit的组合可以有以下几种形式:5.在一个系统中,通常只使用上面5种分配情况的一种,具体采用哪一种,需要在初始化时写入到一个32位寄存器AIRC(Application Interrupt and Reset Control Register)的第[10:8]这2个位中。
这3个bit位有专门的称呼:PRIGROUP(具体写操作后面介绍)。
比如你将0x05(上表的编号)写到AIRC的[10:8]中,那么也就规定了你的系统中只有4个抢先式优先级,相同的抢先式优先级下还可以有4个不同级别的子优先级。
6.AIRC中PRIGROUP的值规定了设置和确定每个外部中断通道优先级的格式。
STM32中断优先级分组Cortex-M3 的中断优先级的分组方式最多可以有有8 种,因为CM3 强制规定:SubPriority 至少要占一个位(如果没有该强制规定,那么CM3 分组方式最多有9 种)。
我们知道:STM32 把指定中断优先级的寄存器的MSB4 位有效,共有以下5 种分组方式:第0 组方式:所有4 位用于响应优先级第1 组方式:最高1 位用于抢占式优先级,最低3 位用于响应优先级第2 组方式:最高2 位用于抢占式优先级,最低2 位用于响应优先级第3 组方式:最高3 位用于抢占式优先级,最低1 位用于响应优先级第4 组方式:所有4 位用于抢占式优先级在MISC.H 里面有:#define NVIC_PriorityGroup_0((uint32_t)0x700)#define NVIC_PriorityGroup_1((uint32_t)0x600)#defineNVIC_PriorityGroup_2((uint32_t)0x500)#defineNVIC_PriorityGroup_3((uint32_t)0x400)#defineNVIC_PriorityGroup_4((uint32_t)0x300)我们发现:第4 组方式是所有4 位用于抢占式优先级,那么这是不是与”SubPriority 至少要占一个位”相冲突呢?答案:当然不冲突了!因为虽然STM32 的”优先级配置寄存器”没有使用bit3、bit2、bit1、bit0,但是却允许从它们中分组(分组位置由应用程序中断及复位控制寄存器(AIRCR)的[10:8]决定)。
=========================第0 组采用的分组方式是bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0。
外部中断(zhōngduàn)的初始化过程:1.初始化IO为输入(shūrù)(可以设置上拉,下拉,浮空)2.开启(kāiqǐ)IO复用(fù yònɡ)时钟3.开启(kāiqǐ)与该IO相对的线上(详解下)4.配置NVIC,使能中断5.编写中断服务函数外部中断:Stm32中总共有19个外部中断包括:线0-15:IO输入中断(每条线上最多有7个IO,如GPIOA~GPIOG,但是每一条线每次只允许同时连接到一个IO)线16:PVD线17:RTC线18:USB关于(guānyú)优先级:CM3中内核(nèi hé)支持256个中断(zhōngduàn)(16个内核(nèi hé)+240外部(wàibù))和可编程256级中断优先级的设置Stm32目前(mùqián)支持84个中断(zhōngduàn)(16个内核(nèi hé)+68个外部(wàibù),注:不是(bù shi)指68个外部中断),16级可编程优先级(优先级设置寄存器中使用了4位)注意:其中(qízhōng)外部中断5-9和中断(zhōngduàn)10-15向量存放(cúnfàng)在一起优先级:数值(shùzí)低的优先级要高于数值高的!!!!!!上电复位后,系统默认(mòrèn)使用的是组0;一个系统只能使用一组优先级组,不可使用多个,优先级的设置不能超过组的范围,否则会产生不可预计的错误1.高抢先级的中断可以打断低优先级的中断响应,构成中断嵌套2.相同抢先级的中断不可以构成嵌套,系统会优先响应子优先级高的3.当2(n)个相同抢先优先级和相同子优先级的中断(zhōngduàn)出现,STM32首先响应中断通道所对应的中断向量地址(dìzhǐ)低的那个中断4.0号抢先优先级的中断,可以(kěyǐ)打断任何中断抢先优先级为非0号的中断(zhōngduàn);1号抢先优先级的中断(zhōngduàn),可以打断任何中断抢先优先级为2、3、4号的中断;……;构成中断嵌套。
STM32的中断理解
STM32的中断理解:首先是MSP和PSP堆栈指针。
MSP是主堆栈,PSP是线程堆栈。
MSP可以用于线程模式下,也可以用于中断模式下。
而PSP只能在线程模式下使用
2.当系统复位以后默认使用的是MSP指针。
3.中断执行的过程:首先是入栈利用线程模式下的指针(入栈属于线程模式)。
然后调用向量表找到中断程序入口,开始进入中断程序,中断服务程序后。
调用BX LR会中断返回,在中断返回时会自动出栈LR,PC,等寄存器。
如果不修改CONTORL【1】则主程序中用的还是MSP指针。
如果修改后则用的PSP
这样下一次就可以自动切换了。
4 LR和PC:PC里面存放的是当前指令的地址。
LR是连接寄存器。
当发生中断或调用子程序时,此时当前的PC指令的下一条会被保存到LR。
当中断返回即可用LR返回到断点处(但是此时必须把LR的内容放到PC中,否则因为PC的地址不是LR中的地址,所以不会调到那个位置运行)。
还有就是把LR的值放到PC中。
PC自动从这个地址开始读代码。
5.PC里面的地址是多少,程序就是从这个地址开始运行。
stm32中断抢占优先级和响应优先级有什么区别
与51不同,stm32的中断分类更灵活。
51只是按先后顺序⼤⼩排列互相打断。
stm32中多了响应优先级这⼀概念。
stm32的中断分为 1.抢占(占先)优先级。
2.响应优先级。
1.抢占优先级。
抢占优先级⾼的中断,可以打断抢占优先级低的中断。
2.响应优先级。
抢占优先级相同的中断,响应优先级⾼的可以优先执⾏。
也许会有疑问:抢占优先级相同的中断,响应优先级⾼的不可以打断响应优先级低的中断。
两个中断肯定是谁先来了就相应谁,两个中断不可能同时来。
响应优先级⼜有何⽤呢。
其实,响应优先级主要给出了⼀种响应的优先队列。
假设中断的抢占优先级都相同。
如果有多个相同抢占优先级的中断来了,那么他们不会互相打断,但是他们后续的排队会按照响应优先级排队。
也就是说,在第⼀个中断没有执⾏完的期间内,后续的最⾼级的响应优先级是被安排到最⾼等待位处理的。
这为原⼦操作提供了可能,也就是不可被打断的操作。
有何正误,请指!。
STM32-NVIC中断优先级分组-中断优先级设置STM32-中断优先级管理NVIC1.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]分配情况分配结果01110:40位抢占优先级,4位响应优先级11101:31位抢占优先级,3位响应优先级21012:22位抢占优先级,2位响应优先级31003:13位抢占优先级,1位响应优先级40114:04位抢占优先级,0位响应优先级抢占优先级 & 响应优先级区别:⾼优先级的抢占优先级是可以打断正在进⾏的低抢占优先级中断的。
抢占决定了是否能打断别⼈。
查看stm32的SysTick中断的优先级,⽐外设中断优先级⾼吗?默认SysTick中断优先级1//core_cm4.h23 __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)4 {5if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); } /* Reload value impossible */67 SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */8 NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */9 SysTick->VAL = 0UL; /* Load the SysTick Counter Value */10 SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |11 SysTick_CTRL_TICKINT_Msk |12 SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */13return (0UL); /* Function successful */14 }第8⾏设置了SysTick中断的优先级,#define __NVIC_PRIO_BITS 4 /*!< STM32F4XX uses 4 Bits for the Priority Levels */在看NVIC_SetPriority函数:NVIC_SetPriority对中断分了类,分内核中断和外设中断,内核外设中断枚举值⼩于0,普通外设>=0。
stm32中断(NVIC与EXTI) D部有4个从优先级(00 01 10 11)。
1.中断输入与悬起当中断输入脚被置为有效后,该中断就被“悬起”。
所谓“悬起”,也就是等待、就绪的意思。
即使后来中断源撤消了中断请求,已经被标记成悬起的中断也被记录下来。
当某中断的服务程序开始执行时,就称此中断进入了“活跃”状态,并且其悬起位会被硬件自动清除。
在一个中断活跃后,直到其服务例程执行完毕,并且返回后,才能对该中断的新请求予以响应。
当NVIC响应一个中断时,会自动完成以下三项工作,以便安全、准确地跳转到相应的中断服务程序:入栈:把8个寄存器的值压入栈。
当响应中断时,如果当前的代码正在使用PSP,则压入PSP(进程堆栈),否则就压入MSP(主堆栈)。
一旦进入了服务例程,就一直使用主堆栈。
在自动入栈的过程中,将寄存器写入堆栈的顺序与时间顺序无关,CM3会保证正确的寄存器被保存到正确的位置。
取向量:当数据总线(系统总线)进行入栈操作时,指令总线(I-Code总线)正在从向量表中找出正确的中断向量与对应的服务程序入口地址。
更新寄存器。
注意:①如果在某个中断得到响应之前,其悬起状态被清除了,则中断被取消。
②新请求在得到响应时,由硬件自动清零其悬起标志位。
③如果中断源咬住请求信号不放,该中断就会在其上次服务例程返回后再次被置为悬起状态。
④如果某个中断在得到响应之前,其请求信号以若干的脉冲的方式呈现,则被视为只有一次中断请求⑤如果在服务例程执行时,中断请求释放了,但是在服务例程返回前又重新被置为有效,则NVIC会记住此动作,重新悬起该中断。
2.中断返回当中断完成,返回主程序时,NVIC自动完成以下两步:①出栈:先前压入栈中的寄存器在这里恢复。
内部的出栈顺序与入栈时的相对应,堆栈指针的值也改回先前的值。
②更新NVIC 寄存器:伴随着中断的返回,它的活动位也被硬件清除。
对于外部中断,倘若中断输入再次被置为有效,则悬起位也将再次置位,新一次的中断响应序列也会再次开始。
stm32中断嵌套规则
在STM32微控制器中,中断是实现多任务处理和事件驱动程序的关键机制之一。
中断嵌套是指在一个中断服务程序(ISR)执行过程中,另一个中断发生并且
执行相应的ISR。
然而,为了确保中断嵌套的正确执行,需要遵守一些嵌套规则。
首先,在STM32中,不同的中断具有不同的优先级。
中断优先级通过使用相
应的寄存器进行配置,具有较低数值的中断优先级将具有较高的优先级。
这意味着,在一个中断服务程序中,如果发生了比当前正在执行ISR的中断优先级更高的中断,系统将中断当前正在执行的中断并执行较高优先级的中断程序。
其次,如果两个中断具有相同的优先级,则优先级有效性取决于初始的中断请
求时刻的先后顺序。
这称为优先级争夺。
在这种情况下,第一个发生的中断请求将被优先执行,而第二个被挂起,直到第一个中断服务程序执行结束。
此外,在编写中断服务程序时,需要注意中断服务函数(ISF)的执行时间。
较长的中断服务程序将导致较长的响应时间和延迟,从而可能影响系统的实时性。
因此,为了提高系统的实时性和响应能力,应将中断服务程序设计为尽可能短小和高效。
最后,在STM32中,还提供了一种特殊类型的中断服务程序,称为嵌套向量
中断控制器(NVIC)。
NVIC负责管理和控制所有中断请求,并根据其优先级和
嵌套规则决定执行的中断服务程序。
总之,在STM32中,遵循中断嵌套规则非常重要,以确保中断的正确执行和
系统的实时性。
通过正确配置中断优先级、处理争夺情况、优化中断服务程序的执行时间,并合理使用NVIC,可以有效地实现多任务处理和事件驱动的功能。
STM32中断优先级与相关使用概念
一、STM32中断优先级
STM32中断优先级由4位数定义,其中高4位为组优先级(group priority),低4位为子优先级(subpriority),如果两个中断具有相同的组优先级,其中断服务函数将按子优先级的先后顺序进行调度,优先级最高的中断先服务,中断优先级的从高到低分别为:
1.最高优先级:组优先级0位,子优先级0位,实际码值为0X00(其中断服务函数将不受其他的中断影响);
2.高优先级:组优先级1位,子优先级7位,实际码值为0X87;
3.中上优先级:组优先级2位,子优先级6位,实际码值为0X86;
4.中下优先级:组优先级3位,子优先级5位,实际是码值0X85;
5.低优先级:组优先级4位,子优先级4位,实际码值为0X84;
6.最低优先级:组优先级7位,子优先级1位,实际码值为0X81(此类中断服务函数将受其他的中断影响)。
(1)中断优先级的决定
不同的中断有不同的优先级,中断优先级由MCU的硬件决定的,而不是由程序代码来控制的,只有通过程序才能使中断具有不同的优先级。
(2)中断嵌套
对于STM32系列中断系统,在处理中断层次时,中断可以嵌套,即在正在处理的中断服务函数中,又产生新的中断,新产生的中断,如果具有更高的优先级。
STM32⽤FreeRTOS时任务优先级和中断优先级说明下⾯对 FreeRTOS 优先级相关的⼏个重要知识点进⾏下说明,这些知识点在以后的使⽤中务必要掌握牢固。
FreeRTOS 中任务的最⾼优先级是通过 FreeRTOSConfig.h ⽂件中的 configMAX_PRIORITIES 进⾏配置的,⽤户实际可以使⽤的优先级范围是 0 到 configMAX_PRIORITIES – 1。
⽐如我们配置此宏定义为 5,那么⽤户可以使⽤的优先级号是 0,1,2,3,4,不包含 5,对于这⼀点,初学者要特别的注意。
⽤户配置任务的优先级数值越⼩,那么此任务的优先级越低,空闲任务的优先级是 0。
建议⽤户配置宏定义 configMAX_PRIORITIES 的最⼤值不要超过 32,即⽤户任务可以使⽤的优先级范围是0到31。
因为对于CM内核的移植⽂件,⽤户任务的优先级不是⼤于等于32的话, portmacro.h⽂件中的宏定义configUSE_PORT_OPTIMISED_TASK_SELECTION会优化优先级列表中要执⾏的最⾼优先级任务的获取算法(对于 CM 内核的移植⽂件,此宏定义默认是使能的,当然,⽤户也可以在FreeRTOSConfig.h ⽂件中进⾏配置)。
相⽐通⽤的最⾼优先级任务获取算法,这两种⽅式的对⽐如下: 通⽤⽅式,没有优化---配置宏定义 configUSE_PORT_OPTIMISED_TASK_SELECTION 为 0: 所有平台的移植⽂件都可以配置为 0,因为这是通⽤⽅式。
纯 C 编写,⽐专⽤⽅式效率低。
可⽤的优先级数量不限制。
专⽤⽅式,进⾏优化---配置宏定义 configUSE_PORT_OPTIMISED_TASK_SELECTION 为为 1: 部分平台⽀持。
这些平台架构有专⽤的汇编指令,⽐如 CLZ(Count Leading Zeros)指令,通过这些指令可以加速算法执⾏速度。
STM32中断优先级的处理原则1. 引言在嵌入式系统中,中断是一种常用的机制,用于在特定事件发生时打断CPU的正常执行流程,转而执行特定的中断处理程序。
STM32系列微控制器提供了丰富的中断控制功能,并支持多个优先级的中断。
正确设置中断优先级是确保系统稳定性和可靠性的重要步骤。
本文将介绍STM32中断优先级处理原则,包括如何设置优先级、不同类型中断之间的关系以及注意事项等内容。
2. 中断优先级概述STM32微控制器支持多个优先级的中断,其中数字越小表示优先级越高。
当多个中断同时发生时,只有具有最高优先级的中断会被响应。
其他低优先级的中断将被挂起,等待当前正在处理的高优先级中断完成后再进行处理。
每个STM32微控制器都有一个向量表(Vector Table),其中存储了各个中断向量及其对应的ISR(Interrupt Service Routine)。
在初始化过程中,需要将需要使用到的ISR函数指针写入向量表相应位置。
3. 中断优先级设置原则在STM32微控制器上配置和设置各个外设的中断优先级时,需要遵循以下原则:3.1 高优先级中断的响应时间高优先级中断的响应时间应尽量短,以确保系统对紧急事件的及时响应。
通常情况下,系统启动和初始化过程中会配置一些必要的高优先级中断,如系统滴答定时器(SysTick)等。
3.2 低优先级中断的执行时间低优先级中断可能会被高优先级中断打断,在高优先级中断执行期间无法得到处理。
因此,低优先级中断的执行时间应尽量短,以减少对系统性能和实时性的影响。
STM32微控制器支持不同外设之间和相同外设内部的中断嵌套。
在设置嵌套中断时,需要注意以下原则: - 外设之间:不同外设之间的中断嵌套顺序应根据具体需求和业务逻辑进行设置。
- 外设内部:在具有多个可触发相同类型中断源的外设上,需要根据业务需求设置不同源之间的触发次序。
3.4 中断抢占与屏蔽STM32微控制器支持中断的抢占和屏蔽功能。
CM3 内核支持256 个中断,其中包含了16 个内核中断和240 个外部中断,并且具有256级的可编程中断设置。
但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分。
STM32 有84 个中断,包括16 个内核中断和68 个可屏蔽中断,具有16 级可编程的中断优先级。
而我们常用的就是这68 个可屏蔽中断,但是STM32 的68 个可屏蔽中断,在STM32F103 系列上面,又只有60 个
(在107 系列才有68 个)。
在MDK 内,与NVIC 相关的寄存器,MDK 为其定义了如下的结构体:
点击(此处)折叠或打开
1.typedef struct
2.{
3.vu32 ISER[2];
4.u32 RESERVED0[30];
5.vu32 ICER[2];
6.u32 RSERVED1[30];
7.vu32 ISPR[2];
8.u32 RESERVED2[30];
9.vu32 ICPR[2];
10.u32 RESERVED3[30];
11.vu32 IABR[2];
12.u32 RESERVED4[62];
13.vu32 IPR[15];
14.} NVIC_TypeDef;
STM32 的中断在这些寄存器的控制下有序的执行的。
只有了解这些中断寄存器,才能了解STM32 的中断。
下面简要介绍这几个寄存器:
ISER[2]:I SER 全称是:Interrupt Set-Enable Registers,这是一个中断使能寄存器组。
上面说了STM32F103 的可屏蔽中断只有60 个,这里用了 2 个32 位的寄存器,总共可以表示64 个中断。
而STM32F103 只用了其中的前60 位。
ISER[0]的bit0~bit31 分别对应中断0~31。
ISER[1]的bit0~27 对应中断32~59;这样总共60 个中断就分别对应上了。
你要使能某个中断,必须设置相应的ISER 位为1,使该中断被使能(这里仅仅是使能,还要配合中断分组、屏蔽、IO 口映射等设置才算是一个完整的中断设置)。
具体每一位对应哪个中断,请参考stm32f10x_nvic..h 里面的第36 行处。
ICER[2]:全称是:Interrupt Clear-Enable Registers,是一个中断除能寄存器组。
该寄存器组与ISER 的作用恰好相反,是用来清除某个中断的使能的。
其对应位的功能,也和ICER 一样。
这里要专门设置一个ICER 来清除中断位,而不是
向ISER 写0 来清除,是因为NVIC 的这些寄存器都是写 1 有效的,写0 是无效的。
ISPR[2]:全称是:Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。
每个位对应的中断和ISER 是一样的。
通过置1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。
写0 是无效的。
ICPR[2]:全称是:Interrupt Clear-Pending Registers,是一个中断解挂控制寄存器组。
其作用与ISPR 相反,对应位也和ISER 是一样的。
通过设置1,可以将挂起的中断接挂。
写0 无效。
IABR[2]:全称是:Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。
这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。
在中断执行完了由硬件自动清零。
对应位所代表的中断和ISER 一样,如果为1,则表示该位所对应的中断正在被执行。
IPR[15]:全称是:Interrupt Priority Registers,是一个中断优先级控制的寄存器组。
这个寄存器组相当重要!STM32 的中断分组与这个寄存器组密切相关。
因
为STM32 的中断多达60 多个,所以STM32 采用中断分组的办法来确定中断的优先级。
IPR 寄存器组由15 个32bit 的寄存器组成,每个可屏蔽中断占用8bit,这样总共可以表示15*4=60 个可屏蔽中断。
刚好和STM32的可屏蔽中断数相等。
IPR[0]
的[31~24],[23~16],[15~8],[7~0]分别对应中断3~0,依次类推,总共对应60 个外部中断。
而每个可屏蔽中断占用的8bit 并没有全部使用,而是只用了高 4 位。
这 4 位,又分为抢占优先级和子优先级。
抢占优先级在前,子优先级在后。
而这两个优先级各占几个位又要根据SCB->AIRCR 中的中断断分组设置来决定。
这里简单介绍一下STM32 的中断分组:STM32 将中断分为 5 个组,组0~4。
该分组的设置是由SCB->AIRCR 寄存器的bit10~8 来定义的。
具体的分配关系如表
通过这个表,我们就可以清楚的看到组0~4 对应的配置关系,例如组设置为3,那么此时所有的60 个中断,每个中断的中断优先寄存器的高四位中的最高 3 位是抢占优先级,低 1 位是响应优先级。
每个中断,你可以设置抢占优先级为0~7,响应优先级为 1 或0。
抢占优先级的级别高于响应优先级。
而数值越小所代表的优先级就越高。
这里需要注意两点:第一,如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;第二,高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。
使用库函数实现以上中断分组设置以及中断优先级管理,使得我们以后的中断设置简单化。
NVIC 中断管理函数主要在misc.c 文件里面。
首先是中断优先级分组函数NVIC_PriorityGroupConfig,这个函数的作用是对中断的优先级进行分组,这个函数在系统中只能被调用一次,一旦分组确定就最好不要更改。
比如我们设置整个系统的中断优先级分组值为2(2 位抢占优先级,2 位响应优先级”),那么方法是:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
设置好了系统中断分组,那么对于每个中断又怎么确定他的抢占优先级和响应优先级呢?下面看一个重要的函数为中断初始化函数NVIC_Init,其函数申明为:
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
其中NVIC_InitTypeDef 是一个结构体,可以看看结构体的成员变量:点击(此处)折叠或打开
1.typedef struct
2.{
3.uint8_t NVIC_IRQChannel;//定义初始化的是哪个中断,这个我们可以在 stm32f10x.h 中找到每个中断对应的名字。
例如 USART1_IRQn。
4.uint8_t NVIC_IRQChannelPreemptionPriority;//定义这个中断的抢占优先级别。
5.uint8_t NVIC_IRQChannelSubPriority;//定义这个中断的子优先级别。
6.FunctionalState NVIC_IRQChannelCmd;//该中断是否使能。
7.} NVIC_InitTypeDef;
比如我们要使能串口 1 的中断,同时设置抢占优先级为1,子优先级位2,初始化的方法是:点击(此处)折叠或打开
ART_InitTypeDef USART_InitStructure;
2.NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口 1 中断
3.NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为 1
4.NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位 2
5.NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ 通道使能
6.NVIC_Init(&NVIC_InitStructure);。