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