您的位置 首页 模拟

STM32中NVIC的个人了解

STM32有43个channel的settable的中断源;AIRC(ApplicationInterruptandResetRegister)寄存器中有用于指定优先级的4bits。这4个bi…

STM32有43个channel的settable的中止源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先
级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中界说如下
/* Preemption Priority Group ————————————————-*/
#define NVIC_PriorityGroup_0 ((u32)0x700) /* 0 bits for pre-emption priority
4 bits for subpriority */
#define NVIC_PriorityGroup_1 ((u32)0x600) /* 1 bits for pre-emption priority
3 bits for subpriority */
#define NVIC_PriorityGroup_2 ((u32)0x500) /* 2 bits for pre-emption priority
2 bits for subpriority */
#define NVIC_PriorityGroup_3 ((u32)0x400) /* 3 bits for pre-emption priority
1 bits for subpriority */
#define NVIC_PriorityGroup_4 ((u32)0x300) /* 4 bits for pre-emption priority
0 bits for subpriority */
形象化的了解是:
你是天主,
造了43个人,这么多人要分社会阶级和社会阶级了;
由于“阶级”的词性比较重;”阶级”比较中性,
所以preemption优先级->阶级;每个阶级内部,有一些阶级,sub优先级->阶级;
假如依照NVIC_PriorityGroup_4这么分,就分为了16个阶级(1个阶级便是1个preemption优先级),0个阶级;高阶级的
人,能够打断低阶级的正在干事的人(嵌套),最多能够完结1个中止和15级嵌套。
每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“
阶级8”,则
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; // 指定抢占式优先等级1,可取0-15
别的,在同一阶级内部,一个人在干事的时分,别的一个人不能打断他;(preemption优先等级相同的中止源之间没有嵌
套联系)
还有,假如他们两个一起想干事,由于没有阶级,那么就依据Vector table中的物理排序,让排名靠前的人去做;
又有1个人SPI1_IRQChannel,设定如下
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先等级1,可取0-15
SPI1_IRQChannel的阶级高,EXTI0_IRQChannel干事的时分能够打断(嵌套)。
假如依照NVIC_PriorityGroup_3这么分,就分为了8个阶级(1个阶级是1个preemption优先级),每个阶级内有2个阶级(
sub优先级);高阶级的人,能够打断低阶级的正在干事的人(嵌套),最多能够完结1个中止和7级嵌套。
每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“
阶级3”,则:
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先等级1,可取0-7
还需要指定他的阶级:
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定呼应优先等级0,可取0-1
还有1个人叫EXTI9_5_IRQChannel,他的阶级和阶级设定如下
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先等级0,可取0-7
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定呼应优先等级1
那么这两个人是同一阶级的兄弟,一个人在干事的时分,别的一个人不能打断他;(preemption优先等级相同的中止源之
间没有嵌套联系)
假如他们两个一起想干事,由于前者的阶级高,所以前者优先。
还有一个人叫USART1_IRQChannel,他的阶级和阶级设定如下
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先等级0,可取0-7
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定呼应优先等级1
USART1_IRQChannel的优先级最高,当前面两个人干事的时分,他都能够打断(嵌套)。
以下的类推。
假如依照NVIC_PriorityGroup_0这么分,那么没有阶级,只要16个阶级了。
需要给各个人指定阶级编号。sub优先级的规模0-15
当一个人干事的时分,别的的人不能打断他(就没有嵌套了);当多人一起想干事的时分,依照阶级编号的排序,排名靠前的先干事。
阶级编号相同的人一起想干事,那么依照Vector Table硬件排序,排名靠前的先做。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/276601.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部