对于这 4bit 的中断优先级控制位还必须分成 2 组看:从高位开始,前面是定义抢先式优
先级的位,后面用于定义子优先级(即所谓的响应优先级)。4bit 的分组组合可以有以下几种形式:
编 号 分配情况
0:4 无抢先式优先级,16 个子优先级
1:3 2 个抢先式优先级,8 个子优先级
2:2 4 个抢先式优先级,4 个子优先级
3:1 8 个抢先式优先级,2 个子优先级
4:0 16 个抢先式优先级,无子优先级
上电 Reset 后,寄存器 AIRC 中 PRIGROUP[10:8]的值为 0(编号 0) ,因此此时系统使用 16 个抢先优先级,无子优先级。另外由于所有外部中断通道的优先级控制字 PRI_n 也都是 0,所以根据上面的定义可以得出,此时 68 个外部中断通道的抢先优先级都是 0 号,没有子优先级的区分。故此时不会发生任何的中断嵌套行为,谁也不能打断当前正在执行的中断服务。当多个中断出现后,则看它们的中断向量地址:地址越低,中断级别越高,STM32优先响应。
如果在你的系统中使用了
TIME2(中断通道 28)和 EXTI0(中断通道 6)两个中断,而TIME2 中断必须优先响应,而且当系统在执EXIT0 中断服务时也必须打断(抢先、嵌套),就必须设置
TIME2 的抢先优先级比 EXTI0 的抢先优先级要高(数目小) 。假定 EXTI0 为 2 号抢先优先级,那么 TIME2 就必须设置成 0 或 1 号抢先优先级。这些工作需要在 AIRC 中的PRIGROUP
设置完成,确定了整个系统所具有的优先级个数后,再分别对每个中断通道(设备)进行设置。
具体优先级的确定和嵌套规则。ARM cortex_m3(STM32)规定 a/
只能高抢先优先级的中断可以打断低抢先优先级的中断服务,构成中断嵌套。 b/ 当 2(n)个相同抢先优先级的中断出现,它们之间不能构成中断嵌套,但 STM32 首先响应子优先级高的中断。 c/
当 2(n)个相同抢先优先级和相同子优先级的中断出现,STM32 首先响应中断通道所对应的中断向量地址低的那个中断(见 ROM0008,表52) 。
具体一点:
0 号抢先优先级的中断,可以打断任何中断抢先优先级为非 0 号的中断;1 号抢先优先级的中断,可以打断任何中断抢先优先级为
2、3、4 号的中断;……;构成中断嵌套。 如果两个中断的抢先优先级相同,谁先出现,就先响应谁,不构成嵌套。如果一起出现(或挂在那里等待),就看它们
2 个谁的子优先级高了,如果子优先级也相同,就看它们的中断向量位置了。