STM32系統(tǒng)的中斷
關(guān)于中斷分組:
STM32有多種中斷分組,各系列可能分組方式不一樣。但是,分組一般就是規(guī)定了本組有幾個(gè)搶占優(yōu)先級(jí),幾個(gè)子優(yōu)先級(jí)。在組設(shè)置寄存器中設(shè)置好組號(hào)后,所有的中斷都要按照這個(gè)來(lái)設(shè)置。如果更改了組號(hào),那么其他的中斷也都要按照這個(gè)組號(hào)來(lái)配置了。所以,設(shè)置好組號(hào)后不要再隨便改了,如果要改,就要看看已經(jīng)配置好的中斷是否滿足設(shè)置需求,是否優(yōu)先級(jí)數(shù)值超出了規(guī)定值。
另外:一個(gè)組的搶占優(yōu)先級(jí)和子優(yōu)先級(jí)之積是16.因?yàn)橐还彩?個(gè)位。搶占優(yōu)先級(jí)0位(1個(gè)),子優(yōu)先級(jí)就4位(16個(gè));搶占優(yōu)先級(jí)1位(2個(gè)),子優(yōu)先級(jí)就3位(8個(gè)),以此類推。
搶占優(yōu)先級(jí) 代表的優(yōu)先級(jí)最高,高優(yōu)先級(jí)可以嵌套低優(yōu)先級(jí)的中斷。子優(yōu)先級(jí)不能嵌套,需要等上一個(gè)中斷完成后再優(yōu)先響應(yīng)。
兩個(gè)中斷,搶占優(yōu)先級(jí)高的先執(zhí)行,如果搶占優(yōu)先級(jí)相同,看子優(yōu)先級(jí)的高低,如果子優(yōu)先級(jí)也相同,就按照中斷向量地址(默認(rèn)的優(yōu)先級(jí),地址低的先執(zhí)行)來(lái)執(zhí)行。
注意:我有一個(gè)程序,設(shè)置一個(gè)中斷的搶占優(yōu)先級(jí)高于其他中斷,發(fā)現(xiàn)程序出現(xiàn)奇怪的現(xiàn)象(懷疑搶斷優(yōu)先級(jí)高的打斷了較低中斷的重要時(shí)序)。改成同等搶占優(yōu)先級(jí),而子優(yōu)先級(jí)較高時(shí)就正常。我想,還是很不要亂提高搶占優(yōu)先級(jí)的好??鄲?!
STMF1系列的外部中斷,0-4號(hào)外部中斷有單獨(dú)的中斷處理函數(shù),而后面的就是5-9,10-15分別共用一個(gè)中斷處理函數(shù)了。
可以在中斷處理函數(shù)里再判斷是哪個(gè)中斷源產(chǎn)生的中斷,做響應(yīng)的處理。
如:
//外部中斷15~10服務(wù)程序
void EXTI15_10_IRQHandler(void)
{
if((EXTI->PR&0x00008000)&&(EXTI->IMR&0x00008000))//PB15中斷處理部分程序
{
//if(CollecFlag == 1) TIM3->CR1|=0x01;//使能定時(shí)器3,開(kāi)始采集數(shù)據(jù)
//SFlag = 1;
EXTI->PR=1<<15; //清除LINE15上的中斷標(biāo)志位
}
if((EXTI->PR&0x00002000)&&(EXTI->IMR&0x00002000))//PB13中斷處理部分程序
{
if(CollecFlag == 1) TIM3->CR1|=0x01;//使能定時(shí)器3,開(kāi)始采集數(shù)據(jù)
SFlag = 1;
EXTI->PR=1<<13; //清除LINE13上的中斷標(biāo)志位
}
//編制程序段
}
通過(guò)判斷EXTI->PR和EXTI->IMR,兩個(gè)寄存器的值來(lái)判定是哪個(gè)中斷源產(chǎn)生的中斷。