-
STM32d的中断优先级由NVIC_IPRx寄存器来配置,IPR的宽度为8bit所以原则上每个中断可配置的优先级为0~255,数值越小优先级越高,但对于大部分的 Cortex-M3芯片都会精简设计,导致实际上支持的优先级数量更少。在STM32中只使用了IPR寄存器的高四位,低四位读回都为0。
-
用于表达优先级的这四位又被分组为5组0~4,当配置中断优先级时要先选择你要将中断优先级分为哪一组,一个组又分成了抢占优先级和子优先级。具体如下图
所以由上图可知当选择中断优先级为组0时,主优先级可选值只有0,子优先级可选值为0~15。其余4组以此类比。当不同组别的优先级需要比较时,就直接比较IPR寄存器的高四位的值,越小优先级越高。 -
当中断优先级配置完成后,若多个中断同时发生则先比较抢占优先级谁的值小谁先进行,若抢占优先级相同则比较子优先级谁的值小谁先进行,若两者都相同,就比较硬件中断编号(该编号由硬件自身决定),值得注意的是当一中断正在进行时又一中断发生若后者的抢占优先级的值比前者小则后者可以打断正在发生的中断执行后者的中断进程,需要注意若后者的抢占优先级与前者相等但子优先级的值比前者小此时后者不能打断正在发生的中断必须等其完成后才能进行,至于后者的优先级比正在发生的中断优先级低的情况,那就肯定是等待正在进行的中断完成后再进行。
学了32两年时间了,现在想开始总结下写写博文,有问题可以给我留言。