STM32學習之路-中斷優先順序
阿新 • • 發佈:2019-01-03
優先順序的問題可以分為以下情況:
搶佔優先順序和響應優先順序
(1)搶佔優先順序高的可以打斷搶佔優先順序低的,形成巢狀.
(2)搶佔優先順序相同時,看響應優先順序.如果兩個中斷前後發生的話,後來的中斷不能打斷前一箇中斷
只能等,如果兩個中斷同時發生的話,則響應優先順序高的先響應.
(3)搶佔級別和響應級別都一樣時,按照中斷的地址來響應,地址低的先響應
這樣就解決了優先順序的問題.
哪個級別高呢? 0>1>2>......
STM32共有5組分別是0-4組,還是借那個圖
可以看到第4組所有的位都用來設定搶佔式優先順序了(佔先式),所以它能巢狀15箇中斷,然後自身一箇中斷,一次類推
0組只有響應式優先順序,所以它不能巢狀任何中斷,也就是這個組別的中斷不能打斷任何的其他在執行的中斷.
配置NIVC的例子
這裡的配置中3箇中斷的搶佔級別是一樣的,都是0,所以誰都不能打斷誰,優先響應級別是EXTI3_IRQn最高,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); }
EXTI3_IRQn的值是多少呢,在stm32f10x.h中可以看到