高级会员
- 积分
- 842
- 金钱
- 842
- 注册时间
- 2021-12-23
- 在线时间
- 202 小时
|
楼主 |
发表于 2023-5-22 14:33:26
来自手机
|
显示全部楼层
我使用的定时器中断的时候,定时器不是一直处于开启状态, 而且关闭时候是在中断里关闭。
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
//要处理的事件内容。。。。
TIM_Cmd(TIM3, DISABLE); //失能(函数外使能)
}
}
看似没错,而且也看似正常。但是,处理的事件内容出现了很多未知错误,无法正常执行。通过后来的调试中发现,发现是:TIM_Cmd(TIM3, DISABLE); 扰乱了时序关系。当失能后,其实中断并没有真正失能,还会再进入一次中断,因此事件又被执行了一次,在失能前面加了句清除中断标志位,或将清除中断标志位语句放到最后都可解决重入问题
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{
//要处理的事件内容。。。。
TIM_Cmd(TIM3, DISABLE); //失能(函数外使能)
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
}
|
|