我是stm32f427板的新手,我正在深入挖掘。 我认为在互联网上,尤其是stackoverflow,人们对此表示赞同,只是一个例子:
void EXTI9_5_IRQHandler(void) {
/* Make sure that interrupt flag is set */
if (EXTI_GetITStatus(EXTI_Line5) != RESET) {
/* Do your stuff when PB5 is changed */
/* Clear interrupt flag */
EXTI_ClearITPendingBit(EXTI_Line5);
}
}
每个人都解释过,这个处理程序需要在内部执行任何操作,并且必须在退出中断时清除挂起的标志,并且人们声称挂起的位是中断标志。
然而,在我的情况下以及here之类的许多情况下,他们首先清除了这一点,但很多人声称这样做会终止你的中断功能,因为你一旦得到它就会清除它。然而,情况并非如此,此外,它完全相反。如果我先不清楚,我的代码就永远无法运作。
我想找出背后的原因。有人可以解释一下吗?
答案 0 :(得分:0)
如前所述,清除中断标志不会立即执行。换句话说,在最终清除中断标志之前,该命令需要几个时钟周期才能到达中断控制器。同时,CPU继续并行执行中断处理程序 的代码。因此,如果您在调用EXTI_ClearITPendingBit(...)之后立即退出ISR,则ISR会在之前保留,实际上会清除中断标志。不幸的是,由于尚未清除中断标志,因此中断处理程序将立即再次被调用。实际上,中断处理程序将被精确调用两次,因为肯定会在第二次调用后清除中断标志。 几年前,我遇到了同样的问题,花了一些时间弄清原因。作为最佳实践,我建议您在ISR的开始处清除中断标志。通过在STM32x 设备上执行此操作来杀死中断功能是不正确的(明确地说:这不是一般建议)。清除中断标志后,CORTEX-M内核“知道”它在一个ISR中,并且不会“忘记”它。详细解释这一点将超出此答案的范围。但是,您可以绝对确定,如果正确执行了ISR。让您知道,我(连续)使用STM32控制器已有大约15年的时间。
答案 1 :(得分:-1)
应该在开头清除标志。清除操作需要一些时间在总线上传播。如果在退出处理程序之前清除它,则需要使用屏障指令,读回标志(在某些情况下它不起作用)或留出足够的时间来传播操作。否则你可能会得到“鬼”中断。