問題:在調STM32的程序的時候,發(fā)現(xiàn)定時器(timer2)比自己設定的中斷周期縮小了一倍。設定為10ms中斷一次,但實測發(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
}
中斷服務函數(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;//位置二
}
原因分析:
如上圖代碼框架,通過多次試驗發(fā)現(xiàn),當中斷服務函數(shù)中執(zhí)行較少時,把中斷清除操作放到位置二,一般也是沒有問題,但當服務函數(shù)中執(zhí)行較多時,會發(fā)現(xiàn)進行中斷的周期會被縮小一半,當把中斷清除操作放到位置一時,會發(fā)現(xiàn)定時準了。
根據(jù)以上現(xiàn)象的猜想如下:
內(nèi)核為72MHZ,而外設時鐘頻率最大為36MHZ,當在中斷服務函數(shù)執(zhí)行且未及時清除中斷標志時,內(nèi)核發(fā)現(xiàn)還未進行中斷,便再次啟動了,中斷函數(shù),此時便會發(fā)生此類現(xiàn)象。此說法僅為臆斷,只為更好記住此應用。
結論:在進入中斷后首先要清除中斷標志。