我读过关于Cortex-M3 (或M0)的ARM文档,上面说它可以用作NVIC控制器中的电平敏感或脉冲(边沿)中断。问题是,如果这是由软件完成的,那么它在如何做到这一点上相当模糊。
我在NVIC中看不到任何控制中断类型的寄存器(通过调整寄存器位来选择边沿或电平)。因此,在处理程序中必须通过软件来完成一些工作,但在这个领域中仍然是模糊的。
我喜欢听到任何人有办法通过软件使其边沿或电平触发中断。
请在处理程序代码中演示(如果此代码控制它),使其检测电平或脉冲。
如果这是电平检测,我可以保持中断激活并被处理程序禁用,直到被外部代码恢复,它为其重新执行中断。这就是我正在尝试做的,但如果这是脉冲检测类型,它将不起作用。
Thx
发布于 2011-07-22 12:50:24
描述Cortex-M3 NIVC如何处理电平或边沿(脉冲)触发中断的文档可在此处找到:
这很可能就是您在问题中提到的文档。姚的书“ARM Cortex-M3的最终指南”也有很好的描述。
对于这两种中断信号类型,NVIC没有特定的配置-它可以处理这两种中断信号。本质上,当一个中断被断言(基于电平或边沿触发)时,NVIC将该状态锁存到SETPENDx寄存器中。当该中断的ISR被引导至时,ACTIVEx寄存器中的相应位将被设置,而SETPENDx寄存器中的位将被清除。
当中断处于活动状态时,如果中断线路从非活动状态转变为活动状态,则挂起位将再次打开,并且在从当前活动ISR实例返回时,将再次处理中断。这将处理边沿触发中断情况。
此外,当ISR返回时(并且NVIC清除'active‘位),NIVC将重新检查中断线路的状态-如果它仍然被断言,它将再次设置挂起位(即使没有从inactive到active的转换)。这将处理中断被电平触发的情况,并且ISR没有设法使中断被解除断言(可能共享IRQ线路上的第二个设备仅在关键时刻断言其中断,因此没有中断线路处于非活动状态的时间)。
如果这是电平检测,我可以保持中断激活,并由处理程序禁用,直到被外部代码恢复,并重新执行中断。
我不确定我是否真的理解您在这里要做什么,但我认为您也许能够使用NVIC的SETENAx和CLRENAx寄存器来启用/禁用中断。它们独立于挂起位工作,因此即使中断被禁用,中断也可以是挂起的(或变为挂起的)。所以你可以把处理中断的时间推迟到你想要的时间。
如果这还不够,还请注意,您只需设置相应SETPENDx寄存器中的挂起位,即可通过软件使中断挂起- CPU将引导至SETPENDx,就像硬件中断被断言一样(假设中断在SETENAx寄存器中被使能)。您也可以使用“软件触发中断寄存器”(STIR)通过软件触发中断。
https://stackoverflow.com/questions/6785253
复制相似问题