在单片机中,STM32系列对中断优先级的管理算是相对比较容易的,优先级的数量也相对较少。
STM32F40X的中断优先级和STM32F10X的设置是完全一样的,具体情况STM32F10X可参考ST官网的编程手册PM0056, STM32F40X可参考PM0214,其中SCB->AIRCR的PRIGROUP配置表是这样的,
这里的Group priority就是我们通常说的抢占优先级(preemption priority),参与嵌套的必须是抢占优先级。如果某个中断A正在进行中,同个Group的是无法抢占的,只有更高(数字更小)的优先级比如B才能打断这个A中断完成抢占,B干完后,再把资源还给A中断。
组内的子优先级,通常也称响应优先级,则是根据序号排队,谁小谁先进中断;但不许抢,已经进去的哪怕是低优先级,也得让人把活干完让出资源后才能轮到下一个高优先级中断。
上面这个表的理解也比较简单,我们发现0,1,2,3这低4位是没有用到的,所以读写都会被忽略,不用管。用到的只有第4,5,6,7高4位,取决于SCB->AIRCR[2:0]的配置,而且不管怎么配置,都只有16个优先级(Group*Sub)。
SCB->AIRCR[2:0] =
(1) 0b111 就是4位都用来设置成响应优先级,2^4=16位都是响应优先级
(2) 0b110 分为2 两个抢占优先级,在这两个抢占优先级里面,每个有8个子响应优先级
(3)0b101 分为4个抢占优先级,在这四个抢占优先级里面每个有4 四个响应优先级
(4)0b100分为8个抢占优先级,在这八个抢占优先级里面每个有2 两个响应优先级
(5)0b0xx分为16个抢占优先级