Cortex:NVIC,请说明如何通过软件检测水平或边缘

ris*_*scy 4 c embedded arm

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

我没有在NVIC中看到任何类型的寄存器或控制中断类型(通过调整寄存器位来选择边沿或电平).因此必须由处理程序内的软件完成某些操作,但在此领域中它仍然模糊不清.

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

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

如果这是电平检测,我可以保持中断激活并由处理程序禁用,直到通过外部代码恢复它为其重新执行中断.这是我正在尝试做的,但如果这是脉冲检测类型,它将无法工作.

谢谢

Mic*_*urr 6

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

这可能是您在问题中提到的文档.Joseph Yiu的书"ARM Cortex-M3的权威指南"也有很好的描述.

这两种中断信号类型没有特定的NVIC配置 - 它可以处理任何一种.实质上,当中断被置位(基于电平或边沿触发)时,NVIC将该状态锁存在SETPENDx寄存器中.当该中断的ISR被向量传送时,ACTIVEx寄存器中的相应位将置1,SETPENDx寄存器中的位将被清零.

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

此外,当ISR返回(并且NVIC清除'有效'位)时,NIVC将重新检查中断线的状态 - 如果它仍然有效,它将再次设置挂起位(即使没有转换)从非活动到活动).这处理中断被电平触发的情况,并且ISR没有设法导致中断被置低(可能共享IRQ线上的第二个设备在关键时刻断言它的中断所以没有时间当中断线无效时).

如果这是电平检测,我可以通过处理程序保持中断激活和禁用,直到通过重新执行中断的外部代码恢复.

我不确定我真的明白你在这之后会发生什么,但我认为你可以使用NVIC SETENAxCLRENAx寄存器来做你想做的事情来启用/禁用中断.这些工作独立于挂起位,因此即使中断被禁用,中断也可以挂起(或变为挂起).因此,您可以根据需要暂缓处理中断.

如果这还不够,还要注意通过简单地设置相应SETPENDx寄存器中的挂起位,可以通过软件导致中断挂起- CPU将向ISR传送,就像硬件中断被置位一样(假设中断已启用)在SETENAx寄存器中).您也可以使用"软件触发中断寄存器"(STIR)通过软件触发中断.