1

我正在使用 Luminary LM3S8962 微控制器及其包含的库指南,但这应该与任何具有嵌套向量中断的 ARM Cortex-M3 相关。

整个 GPIO 端口只能注册一个中断服务例程函数。一个 GPIO 端口通常有 8 个引脚,每个引脚都可以配置一个中断。对于每个引脚,您可以测试其上是否“发生”中断(待处理),对吗?对于每个引脚,您都可以清除挂起的中断,对吗?

如果 GPIO 端口上的引脚触发了 ISR,则处理器处于 ISR 中。那么当我们在 ISR 中时,如果同一端口上的另一个引脚触发中断会发生什么?我们假设代码检测到哪些引脚有待处理的中断。- 这个 ISR 是否被中断并开始新的 ISR,使用相同的代码,但更新了 PinInterruptStatus 寄存器?(我希望不会) - 这个 ISR 是否一直执行到完成,然后立即执行另一个引脚的中断?(我知道 ARM Cortex M3 实现了中断的尾链) - 或者是否必须有一个 while 循环循环直到所有引脚都被清除,在处理完一个引脚后清除它?

也许这会有所帮助:

http://www.ti.com/lit/gpn/lm3s8962

4

2 回答 2

3

如评论中所述:通常 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 必须确定哪个引脚转换(假设您正在寻找边缘)。祝你好运!

于 2012-05-17T21:50:19.737 回答
0

在 Cortex-M3 中,如果两个中断的优先级相同(对于所有 GPIO 引脚),则前者不会被中断。稍后到来的中断将处于挂起状态。

当发生 GPIO 中断时,您可以检查 GPIO 的 Rising/Falling IO0IntEnR/IO0IntEnF 中断状态(取决于 )以查找相应位以找到导致中断的引脚。

于 2013-12-25T06:44:33.477 回答