优先级的问题可以分为以下情况:
抢占优先级和响应优先级
(1)抢占优先级高的可以打断抢占优先级低的,形成嵌套.
(2)抢占优先级相同时,看响应优先级.如果两个中断前后发生的话,后来的中断不能打断前一个中断
只能等,如果两个中断同时发生的话,则响应优先级高的先响应.
(3)抢占级别和响应级别都一样时,按照中断的地址来响应,地址低的先响应
这样就解决了优先级的问题.
哪个级别高呢? 0>1>2>......
STM32共有5组分别是0-4组,还是借那个图
可以看到第4组所有的位都用来设置抢占式优先级了(占先式),所以它能嵌套15个中断,然后自身一个中断,一次类推
0组只有响应式优先级,所以它不能嵌套任何中断,也就是这个组别的中断不能打断任何的其他在运行的中断.
配置NIVC的例子
void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //配置组别 /* Enable the EXTI9-5 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel =EXTI9_5_IRQn; //配置哪个中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //优先响应级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能 NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
这里的配置中3个中断的抢占级别是一样的,都是0,所以谁都不能打断谁,优先响应级别是EXTI3_IRQn最高,
EXTI3_IRQn的值是多少呢,在stm32f10x.h中可以看到
STM32学习之路-中断优先级<NIVC(2)>
时间: 2024-11-03 01:32:36