永发信息网

最近学习ARM7的中断。对于进入中断服务程序后的清除中断标志不是很明白,望解答!

答案:1  悬赏:20  手机版
解决时间 2021-02-05 17:35
  • 提问者网友:心牵心
  • 2021-02-05 12:11
最近学习ARM7的中断。对于进入中断服务程序后的清除中断标志不是很明白,望解答!
最佳答案
  • 五星知识达人网友:往事埋风中
  • 2021-02-05 13:19
EXTINT 里面包含多个中断标志位的状态,每个位对应一种中断。如果有中断产生,里面的状态位就会置1。按你的代码是检查低位数过来第2位是否有中断产生。你看看那个位的中断标志是什么意思就知道是什么引起中断了。IO口产生的中断一般有两种,一种是边沿触发,一种是电平触发。你可以百度一下这两种区别,看你的提问,估计你是不了解这两者区别了,打起字来好累的!!!追问谢谢你的回答。是这样,这里是使用外部中断1(也就是低位数第二位就是)。使用电平触发。向EXTINT相应位置1是清除中断标志。按你的说法,检测这一位如果有中断产生,那么相应位就置1了,那么还将EXTINT= 0x02再置1有什么特殊的用处?
这里我疑问的是,电平触发时,在中断服务函数里,为什么这么清除中断标志。追答你看看芯片资料上面是怎么清中断标志的,往EXTINT相应位写1看看是不是清中断标志位。按理说应该有其它专门的寄存器清标志的。
如果你不清这个标志位,一但退出中断程序,又会马上跳进去。清了的话,就会等到下次被置位(触发)才进去。
如果外部一直是低电平,就算你清了也没用,一但退出中断程序,中断标志又被置位,这样又会进去了。追问


while((EXTINT&0x02)!=0) 
 { EXTINT=0x02; 
 }
程序就是说EXTINT的相应位置1时,才执行EXTINT= 0x02即再重新置1,这是什么道理呢?可能我还是哪里没理解吧,先调试调试
追答那里不就清清楚楚写着 “可向该位写入1将该位清零” 么 !!!

执行EXTINT= 0x02 就是清零

EINT1 置1是由硬件完成,并不是你软件能改变的。
EXTINT= 0x02 这句看上去像是把那个位置1,但这个写操作准确来说是清零。追问对啊,是清零啊。但是我有问题的是清零的条件,while((EXTINT&0x02)!=0)追答EXTINT&0x02)!=0 这个是一个读操作,如果你检查到那个位被置1了,你当然要去处理这个中断,你读的是一种状态。进去中断后,你要手动清除这种状态,就是那个清零的操作。否则你可以想像,在你退出中断之后,虽然你处理了一些事情,但是那个状态还没清除,那么硬件又会跳进去你的中断程序,继续处理。清除那个标示,就是告诉硬件,我已经做完了要做的,我清除标志了。追问不好意思,我没看完就追问了。估计我懂你的意思了。
就是说,外部电平变低,产生中断后,硬件置1EXTINT的相应位。程序里不断检测EXTINT相应位是否为1,如果为1,那么软件进行的写操作EXTINT= 0x02,将其中的位清零。这里的写操作实际上是将寄存器相应位清零是吧?这里就是我之前没理解的地方了追答是的就是那样。当然,真正写程序还不仅仅要清零,还要加入你自己要做的事情追问真的很感谢你耐心的解答,很赞。虽然我反反复复追问,但你的回答都很及时!耽误你的时间了,再次谢谢你!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯