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