NVIC中斷優(yōu)先級(jí)的理解 CM3支持硬件中斷嵌套,分為搶占式優(yōu)先級(jí)和亞優(yōu)先級(jí),使用規(guī)則主要有,搶占優(yōu)先級(jí)高級(jí)別的可以打斷低級(jí)別的,同一級(jí)別的搶占優(yōu)先級(jí)同時(shí)發(fā)生時(shí),亞當(dāng)優(yōu)先級(jí)高的先發(fā)生中斷,若是相同,則按硬件排列順序發(fā)生。若是有一個(gè)亞優(yōu)先級(jí)正在執(zhí)行中斷,同一級(jí)別的其它亞優(yōu)先級(jí)發(fā)生時(shí),則先掛起,等此中斷執(zhí)行完再執(zhí)行! 從庫(kù)函數(shù)中找到優(yōu)先級(jí)分組模式: #define NVIC_PriorityGroup_0 ((uint32_t)0x700) /* 0 bits for pre-emption priority 4 bits for subpriority */ #define NVIC_PriorityGroup_1 ((uint32_t)0x600) /* 1 bits for pre-emption priority 3 bits for subpriority */ #define NVIC_PriorityGroup_2 ((uint32_t)0x500) /* 2 bits for pre-emption priority 2 bits for subpriority */ #define NVIC_PriorityGroup_3 ((uint32_t)0x400) /* 3 bits for pre-emption priority 1 bits for subpriority */ #define NVIC_PriorityGroup_4 ((uint32_t)0x300) /* 4 bits for pre-emption priority 0 bits for subpriority */ 從中可以看出第一組只有一個(gè)級(jí)別,16個(gè)亞優(yōu)先級(jí),我可以這樣理解,若是分配成這個(gè)組里,不能發(fā)生嵌套中斷,同時(shí)發(fā)生中斷時(shí),亞優(yōu)先級(jí)高的先發(fā)生,若有中斷執(zhí)行時(shí),必須等中斷執(zhí)行完才能執(zhí)行下一個(gè)中斷。最后一組正好相反,有15個(gè)級(jí)別,若是執(zhí)行一個(gè)中斷,可以最多嵌套15個(gè)中斷執(zhí)行一個(gè)中斷。看下面的例子: NVIC_InitTypeDef NVIC_InitStructure; //定義中斷初始化類型結(jié)構(gòu)體變量 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //配置優(yōu)先級(jí)分組1 2個(gè)兩個(gè)搶占優(yōu)先級(jí) 8個(gè)亞優(yōu)先級(jí) NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //開口外部中斷0 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//配置0號(hào)搶占式優(yōu)先級(jí) NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//亞優(yōu)先級(jí)配置為0號(hào) NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道 NVIC_Init(&NVIC_InitStructure); //對(duì)外部中斷0進(jìn)行初始化配置 NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //開口外部中斷5到9 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//配置1號(hào)搶占式優(yōu)先級(jí) NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//亞優(yōu)先級(jí)配置為1號(hào) NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道 NVIC_Init(&NVIC_InitStructure); //對(duì)外部中斷0進(jìn)行初始化配置 NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn; //ADC1中斷 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//配置1號(hào)搶占式優(yōu)先級(jí) NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//亞優(yōu)先級(jí)配置為1號(hào) NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道 NVIC_Init(&NVIC_InitStructure); //對(duì)外部中斷0進(jìn)行初始化配置 從上面的配置來(lái)看,外部中斷0的優(yōu)先級(jí)最高,可以打斷ADC和外部5到9的中斷,也就說(shuō)可以嵌套發(fā)生,當(dāng)ADC中斷和外部5到9中斷同時(shí)發(fā)生時(shí),它們的搶占優(yōu)先級(jí)別相同,亞優(yōu)先級(jí)別也相同,因?yàn)锳DC1硬件排在更靠前,則先發(fā)生ADC中斷,若是兩者任何一個(gè)中斷正在執(zhí)行,則等此中斷執(zhí)行完,再去執(zhí)行另一個(gè)中斷。 |
|