【STM32】NVIC中断优先级的理解

大千世界,无所不有,而前后顺序,等级顺序,则一直伴随左右。而STM32也不例外。

 

我们在学习STM32中串口啊,定时器啊等等,都会遇到设置相应的优先级。下面来揭下这个神秘的面具。

我们知道优先级有两种:抢占式优先级PreemptionPriority 和 子优先级(响应优先级)SubPriority。

具有高优先级的中断可以在低优先级正在运行时打断其运行,然后执行自己的程序,运行完后再回来继续运行低优先级。是不是有点像弱肉强食的现象,没错!!!    而这个有个专业的名称,叫做中断嵌套

当两个中断的优先级是相同的话,就要看先来后到。比如:一个中断正在执行时,刚好另外一个中断来了,肯定是先将正在执行的运行完后才执行新来的中断。如果两个中断的抢占优先级相同的话,而正好同时要运行,(这不是想把处理器逼疯么?)这时候就要出动另外一个大哥响应优先级了,根据响应优先级的高低去决定处理哪一个。又如果抢占优先级和响应优先级都相同怎么办?(处理器已哭晕)这时候就要根据他们在中断向量中的排列顺序来决定处理哪一个。

注:  抢占优先级高的是可以打断抢占优先级低执行,但是响应优先级高的是不可以打断响应优先级低的。(这时候就会有疑惑,那到底响应优先级有什么用呢,响应优先级高低是用在当抢占优先级相同时,谁的响应优先级谁先执行  )

中断向量表:

《【STM32】NVIC中断优先级的理解》

《【STM32】NVIC中断优先级的理解》

《【STM32】NVIC中断优先级的理解》

《【STM32】NVIC中断优先级的理解》

CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256级的可编程中断设置。但 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。而我们常用的就是这 68 个可屏蔽中断,但是 STM32 的 68 个可屏蔽中断,在 STM32F103 系列上面,又只有 60 个(在 107 系列才有 68 个)。

 

介绍完优先级的前世今生,下面介绍下优先级都有哪些设置。

我们在代码中都会发现有一个名为NVIC优先级分组(NVIC_PriorityGroup)的概念

:我们设置中断优先级分组只设置一次,在代码开头处设置,设置完分组后不要随意更改,避免中断管理混乱

《【STM32】NVIC中断优先级的理解》

注:0是最高,15是最低

通过上面的表格,我们可以发现NVIC中断优先级分组可以分为5组,就那分组2为例:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//在misc.c文件中

则表示有2位抢占优先级2位响应优先级

抢占优先级PreemptionPriority   可以设置为 0,1,2,3

    响应优先级Subpriority               可以设置为 0,1,2,3

 

举个例:

①假如设置中断优先级分组为2timer中断抢占优先级为0,响应优先级为1,而uart中断抢占优先级为1,响应优先级为0

我们可以发现timer中断的抢占优先级高

则当uart中断在执行的时候,timer中断刚好也来了,这时由于timer中断的抢占优先级比uart中断的抢占优先级高,因此可以打断其运行而执行自己的代码。

②假如设置中断优先级分组为2timer中断抢占优先级为0,响应优先级为1,而uart中断抢占优先级为0,响应优先级为0

我们可以发现两者中断的抢占优先级相同,而uart中断的响应优先级高

则当timer中断在执行的时候,uart中断来了,是不能打断timer中断执行的,

而当timer中断和uart中断同时来的时候先执行响应优先级高的uart中断

 

这样的话,我们就可以设置我们的优先级啦~

比如

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组为2

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //抢占优先级为3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级为3                

 

 

下面讲讲中断的相关寄存器:%3

点赞