TQ2440之中断

在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);  
}
原文地址:https://www.cnblogs.com/zpehome/p/2841422.html