stm32 中斷嵌套NVIC的理解
1、NVIC_InitStructure結(jié)構(gòu)體在misc.h文件中進(jìn)行定義,編程時(shí)可查看。關(guān)于NVIC的函數(shù)都在misc.h文件中進(jìn)行定義。
2、中斷服務(wù)函數(shù)入口名稱在startup_stm32f10x_hd.s文件中。
3、 中斷結(jié)構(gòu)參數(shù)NVIC_InitStructure.NVIC_IRQChannel的值在stm32f10x.h文件中查找。
4、中斷服務(wù)函數(shù)名稱必須按照startup_stm32f10x_hd.s文件中中斷向量表的名稱進(jìn)行編寫,中斷服務(wù)函數(shù)可以放在任意一個(gè)文件夾中,與存放位置無關(guān)。
NVIC對中斷優(yōu)先級進(jìn)行管理,并且設(shè)置中斷線。
NVIC_IRQChannelPreemptionPriority:先占優(yōu)先級
NVIC_IRQChannelSubPriority:從優(yōu)先級
高先占優(yōu)先級中斷可以打斷低先占優(yōu)先級的中斷,即可中斷嵌套。
先占優(yōu)先級號碼越小優(yōu)先級越高,當(dāng)先占優(yōu)先級號碼相同時(shí),從優(yōu)先級號碼起作用。
同先占優(yōu)先級下的中斷是不能進(jìn)行嵌套的,只能根據(jù)從優(yōu)先級的號碼進(jìn)行排隊(duì),從優(yōu)先級號碼即為排隊(duì)號碼,號碼越低越靠前。
如買火車票一樣,系統(tǒng)中設(shè)置學(xué)生、軍人的優(yōu)先級(先優(yōu)先級)高于普通群眾,學(xué)生、軍人可以搶占系統(tǒng)通道,得到優(yōu)先買票的權(quán)力,但學(xué)生、軍人之間是不能進(jìn)行搶占的,只能根據(jù)排隊(duì)(從優(yōu)先級)來決定誰可以先買到票。
先用函數(shù)NVIC_PriorityGroupConfig(NVIC_PriorityGroup_x)決定有幾個(gè)先占優(yōu)先級和從優(yōu)先級。NVIC_PriorityGroup_x可取如下值。
NVIC_PriorityGroup_0 => 選擇第0組
NVIC_PriorityGroup_1 => 選擇第1組
NVIC_PriorityGroup_2 => 選擇第2組
NVIC_PriorityGroup_3 => 選擇第3組
NVIC_PriorityGroup_4 => 選擇第4組
舉例:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel= EXTI0_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//指定搶占式優(yōu)先級別0,可取0-1
NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;//使能中斷
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel= SPI1_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//指定搶占式優(yōu)先級別1,可取0-1
NVIC_InitStructure.NVIC_IRQChannelSubPriority= 0; // 指定從優(yōu)先級別0,可取0-7NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority= 1; // 指定從優(yōu)先級別1,可取0-7NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
EXTI0_IRQChannel先占優(yōu)先級比SPI1_IRQChannel、USART1_IRQChannel高,所以EXTI0_IRQChannel中斷可以打斷正在執(zhí)行的 SPI1_IRQChannel/USART1_IRQChannel中斷,實(shí)現(xiàn)中斷嵌套。
SPI1_IRQChannel、USART1_IRQChannel先占優(yōu)先級相等,不能相互打斷,即在執(zhí)行SPI1_IRQChannel/USART1_IRQChannel中斷時(shí)USART1_IRQChannel/SPI1_IRQChannel中斷無法打斷。同時(shí)產(chǎn)生SPI1_IRQChannel、USART1_IRQChannel中斷時(shí),要根據(jù)從優(yōu)先級進(jìn)行排隊(duì),SPI1_IRQChannel從優(yōu)先級比較高,所以先執(zhí)行SPI1_IRQChannel中斷。