1. 结论
STM32部分定时器存在SR标志位清理不及时的问题,如果将清除标志位放在中断函数的某位,则可能存在标志位未及时清理生效而再次进入中断。
20230811更新: 多次调试,猜测还是和国产芯片有关系。通过软件设置标志位来规避了。
2. 解决方法
将清理中断标志位的动作放在中断函数最前部。
3.举例
以一段编码器方向判断的函数为例:
通过调试发现不同的定时器现象不一致,STM32的TIM2/3都具有编码器的外设功能,而TIM3的清理动作无法及时生效,如果放在函数末尾实测会导致连续进入5~25次中断。
void TIM2_IRQHandler(void) //TIM2中断
{
if(TIM2->SR&0x0001)//溢出中断
{
if(TIM2->CNT<1024)position_high++;
else if(TIM2->CNT>64511)position_high--;
}
**TIM2->SR&=~(1<<0);//清除标志位**
}
//建议使用下面的中断函数形式
{
TIM2->SR&=~(1<<0);//清除标志位
if(TIM2->CNT<1024)position_high++;
else if(TIM2->CNT>64511)position_high--;
}