在TQ2440的中断这里卡了很久,最后看了一位大神的空间把问题解决了,在这里表示一下感谢。
下面我把代码贴出来跟刚学习2440的人分享:
进入ISR后,清除中断的顺序很重要,首先是srcpnd接着是intpnd,如果还需要清除eintpnd的话,要最先清除。
初始化中断:
void irq_init(void) //irq初始化,这个函数其实比较简单,适当看看2440PDF就应该能设定寄存器了 { GPFCON = 0xaaaa; SRCPND = 0x17; INTMSK &= ~(0x17); INTPND = 0x17; EINTPEND =(1<<4); __asm{nop} EINTMASK &=~(1<<4); __asm{nop} EXTINT0 = 0x0; }
中断服务函数,点击按键,相应的灯被点亮:
void IRQ_Handler(void) __irq //irq中断函数 这个函数是关键 { int j=0; __asm{nop}; __asm{nop}; j= INTOFFSET; SRCPND = SRCPND | 0x17; //1 0111 INTPND = INTPND | 0x17; switch(j) { case 0: irq_ent0();//为中断0 break; case 1: irq_ent1();//外中断1 break;
case 2: irq_ent2();//外中断2 break;
case 4: irq_ent3();//外中断4 break; } }
相应的中断处理函数(点击按键相应的灯点亮):
void irq_ent0(void) { SRCPND = 1<<0; INTPND = 1<<0; GPBDAT |= (0x0f<<5); GPBDAT &= ~(1<<8); } void irq_ent1(void) { SRCPND = 1<<1; INTPND = 1<<1; GPBDAT |= (0x0f<<5); GPBDAT &= ~(1<<5); } void irq_ent2(void) { SRCPND = 1<<2; INTPND = 1<<2; GPBDAT |= (0x0f<<5); GPBDAT &= ~(1<<7); } void irq_ent3(void) { EINTPEND = (1<<4); SRCPND = 1<<4; INTPND = 1<<4; GPBDAT |= (0x0f<<5); GPBDAT &= ~(1<<6); }