Cortex : NVIC,请演示如何通过软件使其电平或边缘检测

标签 c embedded arm

我已经阅读了有关 Cortex-M3(或 M0)的 ARM 文档,它说它可以用作 NVIC Controller 内的电平感应或脉冲(边沿)中断。问题是,如果这是通过软件完成的,那么如何做到这一点相当模糊。

我没有看到 NVIC 中有任何类型的寄存器或控制中断类型的寄存器(通过调整寄存器位来选择边沿或电平)。所以某些事情必须由处理程序中的软件完成,但在这个领域又很模糊。

我喜欢听到任何人有办法通过软件使其边缘或电平触发中断。

请在处理程序代码(如果此控制它)中演示如何检测电平或脉冲。

如果这是电平检测,我可以保持中断处于事件状态并由处理程序禁用,直到通过外部代码恢复,它会重新执行中断。这就是我想要做的,但如果这是脉冲检测类型,它将无法工作。

谢谢

最佳答案

可在此处找到描述 Cortex-M3 NIVC 如何处理电平或边沿(脉冲)触发中断的文档:

这很可能就是您在问题中提到的文件。 Joseph Yiu 的书“The Definitive Guide to the ARM Cortex-M3”也有很好的描述。

对于这两种中断信号类型,NVIC 没有特定的配置 - 它可以处理任何一种。本质上,当中断被断言(基于电平或边沿触发)时,NVIC 将该状态锁存在 SETPENDx 寄存器中。当该中断的 ISR 被引导至时,ACTIVEx 寄存器中的相应位将被设置,而 SETPENDx 寄存器中的位将被清除。

当中断处于事件状态时,如果中断线从非事件状态转换为事件状态,挂起位将再次打开,并且在从当前事件的 ISR 实例返回时,将再次处理中断。这会处理边沿触发的中断情况。

此外,当 ISR 返回(并且 NVIC 清除“事件”位)时,NIVC 将重新检查中断线的状态 - 如果它仍然有效,它将再次设置挂起位(即使没有是从不活跃到活跃的转变)。这处理了中断是电平触发的情况,并且 ISR 没有设法使中断被取消断言(也许共享 IRQ 线上的第二个设备在关键时刻断言了它的中断,所以没有时间当中断线处于非事件状态时)。

If this is level detect, I can hold interrupt active and disable by the handler, until restore by external code for which it re-execute the interrupt.

我不确定我是否真的理解你在这里的目的,但我认为你可以使用 NVIC 的 SETENAxCLRENAx 来做你想做的事> 注册以启用/禁用中断。它们独立于挂起位工作,因此即使中断被禁用,中断也可以挂起(或变为挂起)。因此,您可以根据需要延迟处理中断。

如果这还不够,另请注意,您可以通过软件将中断挂起,只需在相应的 SETPENDx 寄存器中设置挂起位 - CPU 将指向 ISR,就好像断言了硬件中断(假设在 SETENAx 寄存器中启用了中断)。您还可以使用“软件触发中断寄存器”(STIR) 通过软件触发中断。

关于Cortex : NVIC,请演示如何通过软件使其电平或边缘检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6785253/

相关文章:

c - 寻找一个好的 C 哈希表实现

c++ - 嵌入式 C++ 项目 - 需要支持智能指针。可能的可移植性问题?

embedded - PIC32 UART 丢弃字节

调试 ARM Cortex-M4 中的硬故障

assembly - (ARM 汇编)将寄存器右移 1 将所有位设置为零

gcc - 从 gcc4.7.x 中删除 crt0.o 背后的基本原理是什么?

c - 参数中的指针出现问题..c 中的冒泡排序

c - 为什么 tv_sec 和 tv_usec 在确定计时器的持续时间方面都很重要?

c - 如何预定义结构数组

android - 在 BeagleBone Black 上构建 rowboat-android