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