问题:在调STM32的程序的时候,发现定时器(timer2)比自己设定的中断周期缩小了一倍。设定为10ms中断一次,但实测发现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
}
中断服务函数如下:
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;//位置二
}
原因分析:
如上图代码框架,通过多次试验发现,当中断服务函数中执行较少时,把中断清除操作放到位置二,一般也是没有问题,但当服务函数中执行较多时,会发现进行中断的周期会被缩小一半,当把中断清除操作放到位置一时,会发现定时准了。
根据以上现象的猜想如下:
内核为72MHZ,而外设时钟频率最大为36MHZ,当在中断服务函数执行且未及时清除中断标志时,内核发现还未进行中断,便再次启动了,中断函数,此时便会发生此类现象。此说法仅为臆断,只为更好记住此应用。
结论:在进入中断后首先要清除中断标志。