STM32清除中断标志的正确方法

The right way to clear an interrupt flag on STM32

我正在 STM32L4 上开发一个裸机项目,我是从现有代码库开始的。

ISR 已通过以下方式实现:

  1. 读取外设中的中断状态以了解引发中断的事件
  2. 做点什么
  3. 清除开头读取的标志。

清除标志的方法正确吗?不应该在 ISR 的一开始就清除标志吗?我的理解是,如果在第 2 步中第二次发生相同的外围事件,它不会引发第二个 IRQ,因此它会丢失。另一方面,如果您尽快清除标志,则第二个事件将触发中断,其在 CPU 中的状态将更改为 "pending and active":将发生第二个 IRQ。

PS:我从 STM32 处理器编程手册中读到:"STM32 interrupts are both level-sensitive and pulse-sensitive"。

肯定是在开始(除非您在程序逻辑中有特殊原因),因为实际写入标志清除寄存器以通过总线传播需要一些时间。

如果你出于某种原因决定把它放在中断的末尾你应该留下一些指令,放置屏障指令或在中断程序之前回读寄存器return以确保清除操作已传播到总线上。否则你可能有一个 "phantom" 重复的例程调用。