STM32定时器中断关于何时清除中断的总结

时间:2021-11-13 23:21:24
问题:在调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,当在中断服务函数执行且未及时清除中断标志时,内核发现还未进行中断,便再次启动了,中断函数,此时便会发生此类现象。此说法仅为臆断,只为更好记住此应用。 结论:在进入中断后首先要清除中断标志。