我对LZ问题的理解: 1.因某种原因的限制,中断必须由低电平触发; 2.响应中断后,外部芯片给出的中断触发信号(低电平)不可以或不允许通过可控方式撤除;
于是,ARM在响应中断以后,中断标志无法清除(或者是清除了但马上有恢复了,因为外部芯片所给触发条件依然存在). 再于是,在ARM退出中断服务函数以后,可能立即又响应中断进入中断服务函数.
可能的解决办法是:
1初始化时设置低电平触发中断---->2外部芯片相关引脚变低电平---->3执行中断函数并在中断函数中设置高电平触发中断---->4退出中断函数------>5外部芯片相关引脚维持低电平(中断函数不会再次执行因为要高电平触发)---->6外部芯片相关引脚变高电平----->7执行中断函数并在中断函数中设置低电平触发中断----->外不芯片相关引脚维持高电平(中断函数不会再次执行因为要低电平触发)---->2,循环.......。3中要完成正常的中断服务功能,7中仅仅更新一下触发方式,注意定义一个全局变量记录当前触发方式,在3和7里根据这个标志就可以确定:当前触发方式是高电平还是低电平,以及是否要完成正常的中断服务功能.
我的基本思路是:低电平触发中断,这是正常要求的中断。 在中断服务函数里,如果判断出本次中断是由低电平触发的,则说明这是正常的中断,需要按要求完成对应的操作,然后再定义下一次由高电平触发中断,目的是防止本次中断退出后引起本次中断的低电平依然存在,从而导致不应该的中断重复响应;
在中断服务函数里,如果判断出本次中断是由高电平触发的,则说明这不是正常的中断,不需要完成对应的操作,只需要定义下一次由低电平触发中断,一方面防止本次中断退出后引起本次中断的高电平依然存在,从而导致不应该的中断重复响应,更重要的是恢复到由低电平触发中断;
|