我正在使用Luminary LM3S8962微控制器及其附带的库指南,但这应该与任何具有嵌套矢量中断的ARM Cortex-M3相关。
您只能在整个GPIO端口注册一个中断服务程序功能。 GPIO端口通常有8个引脚,每个引脚都可以配置一个中断。对于每个引脚,您可以测试中断是否“发生”(正在等待),对吗?并且对于每个引脚,您可以清除待处理的中断,对吧?
如果GPIO端口上的引脚触发ISR,则处理器位于ISR中。那么当我们在ISR中时,如果同一端口上的另一个引脚触发中断会发生什么?我们假设代码检测到哪些引脚有待处理的中断。 - 这个ISR是否被中断并且新的一个开始,使用相同的代码,但更新的PinInterruptStatus寄存器? (我希望不是) - ISR是否执行直到完成,之后立即执行另一个引脚的中断? (我知道ARM Cortex M3实现了中断的尾链接) - 或者必须有一个循环,循环直到所有引脚都被清除,在处理完引脚后清除它?
也许这会有所帮助:
答案 0 :(得分: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。在p。 4-9,您将找到启用/禁用中断的说明。在第4-6页,您将找到中断清除挂起寄存器的说明。使用这些,您可以确定哪些中断挂起。如果您真的想要了解中断启用/禁用控制,请查看BASEPRI和BASEPRO_MAX寄存器。
话虽如此,我不确定我同意您的陈述,即您的问题与任何Cortex-M3相关。 Keil(我的Cortex-M3的味道)提到EXTI(外部中断控制器)处理GPIO引脚中断。有趣的是,ARM文档简要讨论了“EXTI”,但没有像Keil STM32文档那样将其称为“控制器”。关于“STM32 EXTI”的快速谷歌有很多点击,对“Luminary EXTI”的类似搜索并没有产生太大的影响。鉴于此,我猜这个特定的控制器是ARM留给第三方的外围设备之一。
本文件 支持观点:http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/REFERENCE_MANUAL/CD00171190.pdf。这里提到了几个AFIO_EXTI寄存器。这些允许将GPIO线映射到中断。不幸的是,我在Luminary文档中找不到类似的东西。
那么......这是什么意思?看起来您的中断只有端口级粒度。因此,您的ISR必须确定哪个引脚已转换(假设您正在寻找边缘)。祝你好运!
答案 1 :(得分:0)
在Cortex-M3中,如果两个中断具有相同的优先级(对于所有GPIO引脚),则前者不会被中断。稍后中断将处于暂挂状态。
当发生GPIO中断时,您可以检查相应位的上升/下降IO0IntEnR / IO0IntEnF(取决于)的GPIO中断状态,以找到导致中断的引脚。