STM32定時(shí)器中斷關(guān)于何時(shí)清除中斷的總結(jié)
問(wèn)題:在調(diào)STM32的程序的時(shí)候,發(fā)現(xiàn)定時(shí)器(timer2)比自己設(shè)定的中斷周期縮小了一倍。設(shè)定為10ms中斷一次,但實(shí)測(cè)發(fā)現(xiàn)5ms便中斷了一次。
初始化代碼如下:
void InitTimer2(void)
{
RCC->APB1ENR|=0x01; //enable clock,max clock=36M
TIM2->PSC=71; // counter clock CK_CNT=72M/(71+1)=1M
TIM2->ARR=10000; // 10000*1us=10ms
TIM2->CR1 |=0x0080; //Auto-reload preload enable
TIM2->EGR |=0x0001; //Re-initialize the counter and generates an update of the registers.
TIM2->DIER|= 0x0001; //Update interrupt enabled
TIM2->CR1 |=0x01; //enable timer2
}
中斷服務(wù)函數(shù)如下:
void TIM2_IRQHandler(void)
{
TIM2->SR&=0xfffe;//位置一
DS[1].js++;
if(DS[1].js>500)
{
DS[1].en=1;
DS[1].js=0;
}
//TIM2->SR&=0xfffe;//位置二
}
原因分析:
如上圖代碼框架,通過(guò)多次試驗(yàn)發(fā)現(xiàn),當(dāng)中斷服務(wù)函數(shù)中執(zhí)行較少時(shí),把中斷清除操作放到位置二,一般也是沒(méi)有問(wèn)題,但當(dāng)服務(wù)函數(shù)中執(zhí)行較多時(shí),會(huì)發(fā)現(xiàn)進(jìn)行中斷的周期會(huì)被縮小一半,當(dāng)把中斷清除操作放到位置一時(shí),會(huì)發(fā)現(xiàn)定時(shí)準(zhǔn)了。
根據(jù)以上現(xiàn)象的猜想如下:
內(nèi)核為72MHZ,而外設(shè)時(shí)鐘頻率最大為36MHZ,當(dāng)在中斷服務(wù)函數(shù)執(zhí)行且未及時(shí)清除中斷標(biāo)志時(shí),內(nèi)核發(fā)現(xiàn)還未進(jìn)行中斷,便再次啟動(dòng)了,中斷函數(shù),此時(shí)便會(huì)發(fā)生此類(lèi)現(xiàn)象。此說(shuō)法僅為臆斷,只為更好記住此應(yīng)用。
結(jié)論:在進(jìn)入中斷后首先要清除中斷標(biāo)志。