STM32 對(duì)于NVIC中斷優(yōu)先級(jí)的設(shè)置
用STM32做項(xiàng)目已經(jīng)有段時(shí)間了,但是我忽然發(fā)現(xiàn)我對(duì)NVIC其實(shí)一點(diǎn)都不了解,所以今天補(bǔ)習(xí)了一下NVIC的知識(shí)以及我自己對(duì)NVIC中斷優(yōu)先級(jí)設(shè)置的了解,希望對(duì)大家有所幫助:
對(duì)于NVIC中斷優(yōu)先級(jí)的設(shè)置一直都不是很清楚;
具體函數(shù)如下:
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); // 優(yōu)先級(jí)組設(shè)置
/* Timer2中斷*/
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //通道設(shè)置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //搶占優(yōu)先級(jí)設(shè)置
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //響應(yīng)優(yōu)先級(jí)設(shè)置
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
上面就是簡(jiǎn)單的一個(gè)中斷使能及優(yōu)先級(jí)設(shè)置過(guò)程。
其中NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); 是優(yōu)先級(jí)組設(shè)置
對(duì)于STM32只支持4位即5種模式的優(yōu)先級(jí)組設(shè)置,而在CM3的權(quán)威指南里說(shuō)了他支持8位即256個(gè)分級(jí)
這說(shuō)明STM32刪減了CM3的優(yōu)先級(jí)別;
STM32中描述的分別為:
NVIC_PriorityGroup_0 (0位的搶占優(yōu)先級(jí),4 位響應(yīng)優(yōu)先級(jí))
NVIC_PriorityGroup_1 (1位的搶占優(yōu)先級(jí),3 位響應(yīng)優(yōu)先級(jí))
NVIC_PriorityGroup_2 (2位的搶占優(yōu)先級(jí),2 位響應(yīng)優(yōu)先級(jí))
NVIC_PriorityGroup_3 (3位的搶占優(yōu)先級(jí),1 位響應(yīng)優(yōu)先級(jí))
NVIC_PriorityGroup_4 (4位的搶占優(yōu)先級(jí),0 位響應(yīng)優(yōu)先級(jí))
(上面關(guān)于 PriorityGroup 的說(shuō)法與 CM3 權(quán)威指南上的 Group 不同,STM 把這個(gè) group 重新做了定義。)
這里需要介紹下:
0位搶占優(yōu)先級(jí)說(shuō)明,沒(méi)有搶占優(yōu)先級(jí)只有響應(yīng)優(yōu)先級(jí),并且也支持此2的4次方16個(gè)優(yōu)先級(jí)別
在這16個(gè)優(yōu)先級(jí)別里沒(méi)有搶占試優(yōu)先級(jí)都是,響應(yīng)優(yōu)先級(jí),也就是說(shuō)優(yōu)先級(jí)沒(méi)有嵌套能力,中斷來(lái)了只能按照
響應(yīng)優(yōu)先級(jí)的順序排列執(zhí)行;
0位響應(yīng)優(yōu)先級(jí)說(shuō)明16個(gè)優(yōu)先級(jí)都是搶占優(yōu)先級(jí),無(wú)論當(dāng)前是哪個(gè)中斷只要來(lái)了比他優(yōu)先級(jí)高的中斷進(jìn)來(lái)都可以實(shí)現(xiàn)中斷嵌套,嵌套層數(shù)為16;
舉例說(shuō)明:
對(duì)于系統(tǒng)中的兩個(gè)中斷設(shè)置如下:
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Timer2中斷*/
/*
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
*/
/* UART5中斷*/
NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
因?yàn)橄胍猅IM2的優(yōu)先級(jí)高于UART5的優(yōu)先級(jí)不能設(shè)置NVIC_PriorityGroup_0
只能設(shè)置1,2,3,4組,該例子中設(shè)置組1則 他有兩個(gè)搶占優(yōu)先級(jí)別,所以在兩個(gè)中斷中一個(gè)搶占優(yōu)先級(jí)寫(xiě)0,一個(gè)寫(xiě)1,寫(xiě)0的優(yōu)先級(jí)高于寫(xiě)1的 ,然后對(duì)于響應(yīng)優(yōu)先級(jí)有2的3次方8個(gè)響應(yīng)優(yōu)先級(jí),這樣既可達(dá)到要求