優先級的問題可以分爲以下情況:
搶佔優先級和響應優先級
(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中可以看到