Embedded stm32f427中断清除挂起位

Embedded stm32f427中断清除挂起位,embedded,stm32,stm32f4discovery,Embedded,Stm32,Stm32f4discovery,我是新来的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 */ /* Clea

我是新来的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);
}
} 
正如大家所解释的,这个处理程序需要在内部执行您需要的任何操作,并且在退出中断时必须清除挂起标志,人们声称挂起位就是中断标志

然而,在我的例子和许多类似的例子中,他们首先清除这个位,但是许多人声称这样做会破坏中断功能,因为一旦你得到它,你就会清除这个位。然而,事实并非如此,而且,情况完全相反。如果我不先清除,我的代码就永远不会工作


我想找出背后的原因。有人能解释一下吗?

应该在开始时清除标志。清除操作需要一些时间在总线上传播。如果在退出处理程序之前清除它,则需要使用barrier指令,读回该标志(在某些情况下它不起作用),或者留出足够的时间让操作传播。否则你可能会被“鬼魂”打断

如前所述,清除中断标志不会立即执行。换句话说,在中断标志最终清除之前,命令需要几个时钟周期才能到达中断控制器。与此同时,CPU继续并行执行中断处理程序的代码。因此,如果您在调用EXTI_ClearITPendingBit(…)后立即退出ISR,则ISR将在中断标志实际清除之前离开。不幸的是,由于中断标志尚未清除,因此中断处理程序将立即再次被调用。事实上,中断处理程序将被精确地调用两次,因为中断标志肯定会在第二次调用后被清除。
几年前我也有同样的问题,我花了一些时间才弄明白原因。作为最佳实践,我建议在ISR开始时清除中断标志。在STM32x设备上执行此操作并不意味着终止中断功能(明确地说:这不是一般建议)。CORTEX-M内核“知道”它在ISR中,并且在清除中断标志后不会“忘记”它。详细解释这一点超出了本回答的范围。但如果您这样做,您完全可以确保您的ISR执行正确。为了让您知道,我(连续)与STM32控制器合作了大约15年。

您所清楚的顺序取决于系统。我强烈建议您从轮询cpu开始,然后最终启用内核本身的中断(cpsie)。具体来说,这样你就可以以一种缓慢而可控的方式看到正在发生的事情。外围设备做什么,清除外围设备需要什么。是否有一个中断控制器,重复,核心中是否有更深层次的东西需要处理?或者在你用来检测的核心中,使用cortex-m,每个中断都有单独的向量,所以你要问外设,但对于其他架构或核心,您必须在isr中询问是谁导致了它,然后将其展开以查找外围设备。通常,您希望从外围设备清除到cpu,无论您做的是第一件事还是最后一件事,在某种程度上都是一件软件设计的事情,架构是否会再次中断您的工作?如果是这样的话,如果你花的时间太长(对于那个中断或其他优先级),你是否希望这样做。即使你有所有可用的文档,你仍然应该做一些测试/黑客攻击,不管你喜欢什么,专门的测试是为了了解正在发生的事情以及如何反应。故意不返回例如,它是否再次打断您?你到底有没有清除它?uart对所有这一切都很有帮助,通常在isr中打印是个坏主意,但对于这种事情,打印然后进入无限循环,查看您在进入isr时看到的内容。谢谢您的评论,老定时器。我在调试模式下执行了中断操作,所以我看到有一个exti_pr寄存器,所有挂起的位都是根据您的exti行设置/重置该位。软件可能是一个问题,如果可以肯定的话,我很高兴,只要我知道这是一个问题。当软件跳转到断点并切换我的LED时,我看到它首先清除该位,所以它肯定是首先执行清除。因此,根据文档,它混淆了pr位的工作原理。您刚刚重新填写了我的答案。顺便说一句,Cortex没有
EXTI_ClearITPendingBit(…)
指令。在处理器级答案中使用高级库函数是错误的。如果库的作者将添加readback或barrier指令,该怎么办。那么你的答案将是100%错误我没有重复你的答案。我只是解释得更详细了。我的答案100%正确。我不是在讨论“如果”的情况。