zoukankan      html  css  js  c++  java
  • 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);  
    }
  • 相关阅读:
    ios手机和Android手机测试点区别
    业务下的测试总结
    Mac下web自动化环境部署
    Mac下查找python的安装位置以及第三方库
    简易计算器
    递归
    可变参数
    方法的重载
    方法
    三角形
  • 原文地址:https://www.cnblogs.com/zpehome/p/2841422.html
Copyright © 2011-2022 走看看