先上代码 TIM2->DIER = TIM_DIER_UIE; TIM2->PSC = 8399; TIM2->ARR = 4999; TIM1->CR1 = TIM_CR1_CEN; 以上为定时器的初始化代码,84MHz的时钟,开启更新中断。 void TIM2_IRQHandler(void) { GPIOB->ODR ^= 1; TIM2->SR &= ~TIM_SR_UIF; } 401RC的工程,一个TIM2的更新中断执行上面代码会出现一次中断重复进入服务程序的问题。GPIOB.0控制一个LED,应该每0.5秒进入一次中断服务服务程序,LED闪烁。但实际上LED状态是不变的,要么恒亮,要么恒灭。中断服务中用断点调试再单步调试可以看到LED的状态反转,在程序中加一个计数器,发现连续运行时计数器总是偶数状态。后来,将语句顺序调整为: void TIM2_IRQHandler(void) { TIM2->SR &= ~TIM_SR_UIF; GPIOB->ODR ^= 1; } 即先清除SR中的标志,中断响应就完全正常了。请问,语句顺序有那么大的作用吗。 |
void TIM2_IRQHandler(void)只是中断入口
内部需要判断发生的是啥中断
需判断是否为updata中断建议用库
评分
查看全部评分
评分
查看全部评分
1、先判断标志;2、在清标志;3、在干活
你可以在清标志后面,加一小点延时。
评分
查看全部评分
我也有这样的疑虑,就是担心清除表之后内核延迟,导致系统再次进入中断。
这代码不是工作用的,是临时在网上输入的。
习惯用寄存器方式。通过实验发现,用判断标志在进行相关操作,最后再清除标志也是不会错。但是,中断服务程序还是会重复进入,在判断执行区域内和外各设一个计数器,就会发现两个计数器的值不一样。