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