Cortex-M3 内核的中断优先级

第一步:分组(一次)
第二步:根据每个中断,设置抢占优先级(根据分组可以知道可以几位设置),然后子优先级。
1. 中断编号
ARM 为 Cortex-M3 内核 一共设计了 255 个中断,编号为 1~255,而 0 表示没有异常
这里的编号单纯只是这些中断的一个序号,而不是优先级
编号 1-15 是内核中产生的、而 16-255 属于来自内核外
2. 中断优先级
对于编号为 1-3 的中断,其优先级是固定的,从 -3 到 -1
编号为 4-255 的中断,其优先级都是可以编程的
Cortex-M3 内核的中断优先级_第1张图片
Cortex-M3 内核的中断优先级_第2张图片
Cortex-M3 内核的中断优先级_第3张图片

中断优先级

(1)中断优先级分为两种,可编程和不可编程,可编程的表示可以自己修改中断优先级,不可编程的就不能修改

(2)对于STM32中断优先级,决定着内核优先响应谁的中断请求

(3)小值优先原则,中断优先级数值越小,中断就会被优先相应

(4)中断优先级按照优先级分组配置

  1. 优先级配置寄存器

对于组0,抢占优先级为0,表示他没有抢占优先级,4个bit全部用来表示子优先级。对于组1,抢占优先级为0-1,用1个bit表示抢占优先级,其余3个bit表示子优先级…

(1)通过优先级分组,可以管理中断的响应顺序

(2)只有抢占优先级才由抢占中断权限,发生中断嵌套,打断就发生中断嵌套,没有能力打断,那就被挂起

假如事件A抢占优先级为0,B的抢占优先级为10,在B执行过程中,A发出中断请求,则会抢过B中断的使用权,等A执行完毕再继续执行B(ps:如果A并不能打断事件B,A就会被挂起)

(3)如果中断抢占优先级相同,不发生抢占

(4)如果多个挂起的中断具有相同的抢占优先级,则子优先级高的先行,如果子优先级相同,则IRQ(通常指外部中断请求)编号小的先行(IRQ来源例如:stm32f103xe.h)

抢占优先级(组)>子优先级(响应优先级)>IRQ编号

Cortex-M3 内核的中断优先级_第4张图片
系统运行后,先设置中断优先级分组
调用函数: void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
系统执行过程中,只设置一次中断分组

针对每个中断,设置对应的抢占优先级响应优先级
调用函数:void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可

即我们在上电初始化进行一次配置即可,正常是配置分组
Cortex-M3 内核的中断优先级_第5张图片

你可能感兴趣的:(FW,其他)