如评论中所述:通常 ISR 应采取措施防止重入。在 PIC 之类的东西中,这可能就像在 ISR 的“顶部”禁用中断并在“底部”启用中断一样简单。M3 的 NVIC 有点复杂。本白皮书 (http://www.arm.com/files/pdf/IntroToCortex-M3.pdf) 在第 7 页陈述如下:
NVIC 支持中断的嵌套(堆栈),允许通过施加更高的优先级来更早地处理中断。它还支持中断的动态重新优先级。优先级可以在运行时由软件更改。在中断服务程序完成之前,正在服务的中断被阻止进一步激活,因此可以更改它们的优先级,而不会出现意外重新进入的风险。
上面的讨论直接解决了相同中断重入的可能性,并且它还引入了优先级的概念来处理中断 ISR 的更高优先级的中断。
这个参考很好:http: //infocenter.arm.com/help/topic/com.arm.doc.dui0552a/DUI0552A_cortex_m3_dgug.pdf。在页。在图 4-9 中,您将找到启用/禁用中断的说明。在第 4-6 页,您将找到对中断清除挂起寄存器的描述。使用这些,您可以确定哪些中断正在挂起。如果您真的想对中断启用/禁用控制感兴趣,请查看 BASEPRI 和 BASEPRO_MAX 寄存器。
话虽如此,我不确定我是否同意您的说法,即您的问题与任何 Cortex-M3 相关。Keil(我的 Cortex-M3 风格)提到 EXTI(外部中断控制器)处理 GPIO 引脚中断。有趣的是,ARM 文档简要讨论了“EXTI”,但并未像 Keil STM32 文档那样将其称为“控制器”。在“STM32 EXTI”上的快速谷歌搜索会产生很多点击,在“Luminary EXTI”上进行类似搜索并不会产生很多结果。鉴于此,我猜这个特定的控制器是 ARM 留给第 3 方的外围设备之一。
本文档支持该观点: http: //www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/REFERENCE_MANUAL/CD00171190.pdf。这里提到了几个 AFIO_EXTI 寄存器。这些允许将 GPIO 线映射到中断。不幸的是,我在 Luminary 文档中找不到类似的东西。
那么这是什么意思?看起来您的中断只有端口级粒度。因此,您的 ISR 必须确定哪个引脚转换(假设您正在寻找边缘)。祝你好运!