[ZLG-ARM] 向量IRQ中断实验,为何不进入中断程序?

[复制链接]
4099|8
 楼主| charleszha 发表于 2007-7-22 11:08 | 显示全部楼层 |阅读模式
/****************************************************************************<br />*&nbsp;文件名:EINT03_VECT.C<br />*&nbsp;功能:使能外部中断0和外部中断3,当外部中断0有效时,控制LED1取反;当外部中断3有效时,<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;控制取反LED4。使用向量中断方式。<br />*&nbsp;说明:将跳线器JP4_LED1、JP4_LED4短接,然后按下/放开KEY1,使EINT0为低/高电平;按<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下/放开KEY5,使EINT3为低/高电平。<br />****************************************************************************/<br />向量IRQ中断实验,为何不进入中断程序?代码如下:<br />#include&nbsp;&nbsp;&quot;config.h&quot;<br />#define&nbsp;&nbsp;&nbsp;LED1CON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&lt&lt22)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;P0.22口为LED1控制端&nbsp;*/<br />#define&nbsp;&nbsp;&nbsp;LED4CON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&lt&lt25)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;P0.25口为LED4控制端&nbsp;*/<br /><br />/****************************************************************************<br />*&nbsp;名称:IRQ_Eint0()<br />*&nbsp;功能:外部中断EINT0服务函数,取反LED1。<br />*&nbsp;入口参数:无<br />*&nbsp;出口参数:无<br />****************************************************************************/<br />void&nbsp;&nbsp;&nbsp;__irq&nbsp;IRQ_Eint0(void)<br />{&nbsp;&nbsp;uint32&nbsp;&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;IO0SET;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读取当前LED1控制值<br />&nbsp;&nbsp;&nbsp;if(&nbsp;(i&LED1CON)==0&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;控制LED1输出<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;IO0SET&nbsp;=&nbsp;LED1CON;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;IO0CLR&nbsp;=&nbsp;LED1CON;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;EXTINT&nbsp;=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清除EINT0中断标志<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;<br />}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br /><br />/****************************************************************************<br />*&nbsp;名称:IRQ_Eint3()<br />*&nbsp;功能:外部中断EINT3服务函数,取反LED4。<br />*&nbsp;入口参数:无<br />*&nbsp;出口参数:无<br />****************************************************************************/<br />void&nbsp;&nbsp;&nbsp;__irq&nbsp;IRQ_Eint3(void)<br />{&nbsp;&nbsp;uint32&nbsp;&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;IO0SET;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读取当前LED4控制值<br />&nbsp;&nbsp;&nbsp;if(&nbsp;(i&LED4CON)==0&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;控制LED4输出<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;IO0SET&nbsp;=&nbsp;LED4CON;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;IO0CLR&nbsp;=&nbsp;LED4CON;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;EXTINT&nbsp;=&nbsp;0x08;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清除EINT3中断标志<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00;<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />/****************************************************************************<br />*&nbsp;名称:main()<br />*&nbsp;功能:初始化外部中断0、3为向量中断,并设置为下降沿触发模式,然后等待外部中断。<br />*&nbsp;说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。<br />****************************************************************************/<br />int&nbsp;&nbsp;main(void)<br />{&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;0x00000000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;PINSEL1&nbsp;=&nbsp;0x00000301;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置管脚连接,P0.16设置为EINT0,P0.20设置为EINT3<br />&nbsp;&nbsp;&nbsp;IO0DIR&nbsp;=&nbsp;LED1CON|LED4CON;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置B1控制口为输出,其它I/O为输入<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;EXTMODE&nbsp;=&nbsp;0x0F;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置EINT0、EINT3中断为边沿触发模式<br />&nbsp;&nbsp;&nbsp;EXTPOLAR&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置EINT0、EINT3中断为下降沿触发<br />&nbsp;&nbsp;&nbsp;//EXTMODE&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置EINT0、EINT3中断为电平触发模式<br />&nbsp;&nbsp;&nbsp;//EXTPOLAR&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置EINT0、EINT3中断为低电平触发<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;打开EINT0、EINT3中断(设置向量控制器,即使用向量IRQ)&nbsp;*/<br />&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;=&nbsp;0x00000000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置所有中断分配为IRQ中断<br />&nbsp;&nbsp;&nbsp;VICVectCntl0&nbsp;=&nbsp;0x20|14;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;分配EINT0中断到向量中断0<br />&nbsp;&nbsp;&nbsp;VICVectAddr0&nbsp;=&nbsp;(int)IRQ_Eint0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置中断服务程序地址<br />&nbsp;&nbsp;&nbsp;VICVectCntl1&nbsp;=&nbsp;0x20|17;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;分配EINT3中断到向量中断1<br />&nbsp;&nbsp;&nbsp;VICVectAddr1&nbsp;=&nbsp;(int)IRQ_Eint3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置中断服务程序地址<br />&nbsp;&nbsp;&nbsp;EXTINT&nbsp;=&nbsp;0x09;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清除EINT0、EINT3中断标志&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;(1&lt&lt14)|(1&lt&lt17);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能EINT0、EINT3中断<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;while(1);//&nbsp;等待中断,按KEY1或者KEY5都没有办法进入相应中断程序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//改成电平触发,也是不能进入中断程序执行,很郁闷<br />&nbsp;&nbsp;&nbsp;return(0);<br />}<br />请问大家是哪里有问题呀?谢谢
HotPower 发表于 2007-7-22 23:40 | 显示全部楼层

I没打开吧~~~

  
 楼主| charleszha 发表于 2007-7-23 16:51 | 显示全部楼层

向量IRQ中断实验,为何不进入中断程序?

还是不清楚中断了为什么就是不执行void&nbsp;&nbsp;&nbsp;__irq&nbsp;IRQ_Eint0(void)&nbsp;和&nbsp;void&nbsp;&nbsp;&nbsp;__irq&nbsp;IRQ_Eint3(void)?<br />郁闷···
zlgARM 发表于 2007-7-23 16:56 | 显示全部楼层

charleszha

您好:<br />&nbsp;&nbsp;&nbsp;&nbsp;Hotpower的回复您看明白了吗?如果看明白,是否有就此进行测试?请使能IRQ。
 楼主| charleszha 发表于 2007-7-23 18:01 | 显示全部楼层

向量IRQ中断实验

刚刚另外一个程序调试的时候发现了这个问题,在target.c中&nbsp;VICIntEnClr&nbsp;=&nbsp;0x00000000;就可以了,谢谢hotpower、zlgARM指点!!!!!
胡永江 发表于 2007-11-16 13:48 | 显示全部楼层

发现一个问题

我刚学ARM<br />现在正在做外部中断的实验<br />发现一个问题:<br />原来void&nbsp;__irq&nbsp;IRQ_Eint1()<br />是两个下划线,不是一个,无意间发现的<br />难怪之前弄都是错!<br />
胡永江 发表于 2007-11-16 17:51 | 显示全部楼层

ding

ding
kukucat 发表于 2007-11-18 13:15 | 显示全部楼层

这都被你发现了,顶

  
Atmel51 发表于 2007-11-21 16:12 | 显示全部楼层

ARM学习中

比较难!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

7

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部