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

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

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

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

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

谢谢

最佳答案

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

  • Cortex-M3 Devices Generic User Guide , 4.2.9. Level-sensitive and pulse interrupts

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

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

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

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



    我不确定我真的理解你在这里想要什么,但我认为你可以使用 NVIC 的 SETENAxCLRENAx 寄存器来启用/禁用中断。这些工作独立于挂起位,因此即使中断被禁用,中断也可以挂起(或变为挂起)。因此,您可以根据需要推迟处理中断。

    如果这还不够,还请注意,您可以通过软件通过简单地设置相应 SETPENDx 寄存器中的挂起位来使中断挂起 - CPU 将转向 ISR,就像硬件中断被断言一样(假设中断是在 SETENAx 寄存器中启用)。您还可以使用“软件触发中断寄存器”( STIR )通过软件触发中断。

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

    10-09 08:19