J-Link + ADS + mini2440调试中断问题

来源:互联网 发布:飞凡网络线路 编辑:程序博客网 时间:2024/06/05 02:00

 在RAM中在线调试,一般什么跑马灯啊,蜂鸣器的程序都可以。今天调一个中断的程序就不行。
   就是一个简单的外部中断,通过按键获取外部中断,可是中断一直进不去(通过设置断点,按键按了也不能跳进去)。找了网上的一些资料看,说要设置中断向量?
   “因为调试过程中没有开中断,开中断则要正确设置异常向量。”这句话小弟有点不太理解。
   下面我把代码贴上来,大伙帮我看看,感谢致敬!

#include "def.h"                    //所要包含的头文件
#include "option.h"
#include "2440addr.h"     
#include "2440lib.h"
#include "2440slib.h"      
//**************************************************
#define KEY1 (1 << 0)//GPG0,EINT8
#define KEY2 (1 << 3)//GPG3,EINT11
#define KEY3 (1 << 5)//GPG5,EINT13
#define KEY4 (1 << 6)//GPG6,EINT14

#define LED1 (1 << 5)//GPB5
#define LED2 (1 << 6)//GPB6
#define LED3 (1 << 7)//GPB7
#define LED4 (1 << 8)//GPB8

void dely(U32 tt)                //延时子函数
{
   U32 i;
   for(;tt>0;tt--)
   {
     for(i=0;i<10000;i++){}
   }
}

void __irq IRQ_KEY(void)   
{

ClearPending(BIT_EINT8_23);
rEINTPEND = 0xFFFFFFFF;
rGPGCON &= ~((3<<0)|(3<<6)|(3<<10)|(3<<12));  //设置为输入
   //采取位判断,判断是0还是1.
    if(rGPGDAT & KEY1)   //判断按键1是否按下
      { rGPBDAT |= LED1;    //否,LED1灭
       // dely(120);
       }
    else   
      { rGPBDAT &= ~LED1;    //是 LED1亮
       // dely(220);
      }
      
      
    if(rGPGDAT & KEY2)   //判断按键2是否按下
      { rGPBDAT |= LED2;    //00001101左移5位,LED2亮
       // dely(120);
    }
    else 
      { rGPBDAT &= ~LED2;    
      // dely(220);
      }
   
   
    if(rGPGDAT & KEY3)   //判断按键3是否按下
      { rGPBDAT |= LED3;    //00001011左移5位,LED3亮
      //  dely(120);
      }
    else
         { rGPBDAT &= ~LED3;    //是 LED1亮
       // dely(220);
      }
         
         
         
    if(rGPGDAT & KEY4)   //判断按键4是否按下
      { rGPBDAT |= LED4;    //00000111左移5位,LED4亮
       // dely(120);
      }
    else  
          { rGPBDAT &= ~LED4;    //是 LED4亮
      //  dely(220);
      }
          
 rGPGCON |= ((2<<0)|(2<<6)|(2<<10)|(2<<12)); //GPG配置第二功能,外部中断功能 
}

void EINT_Init(void)
{
    rGPGCON &= ~((3<<0)|(3<<6)|(3<<10)|(3<<12));  //设置为输入
rGPGCON |= ((2<<0)|(2<<6)|(2<<10)|(2<<12)); //GPG配置第二功能,外部中断功能 

rEXTINT1 &=~((7<<0)|(7<<12)|(7<<20)|(7<<24))|((6<<0)|(6<<12)|(6<<20)|(6<<24));
//EINT8,11,13,14 下降沿中断
pISR_EINT8_23 = (U32)IRQ_KEY;
rPRIORITY = 0x00000000;
ClearPending(BIT_EINT8_23); //清除中断标志
rEINTPEND = 0xFFFFFFFF;
rINTMOD = 0x00000000; //所有中断均为IRQ中断
rINTMSK &= (~BIT_EINT8_23); //使能外部中断8_23
rEINTMASK &= ~((1<<8)|(1<<11)|(1<<13)|(1<<14)); //使能外部中断8,11,13,14

}

void Main(void)        //主函数
{
          //这里只讨论按键与IO口的使用,其余的做成子函数,直接调用,可暂时不深究。
U8 key;
U32 mpll_val=0;

  
mpll_val = (92<<12)|(1<<4)|(1);

ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);   //设置主时钟频率405MHZ
ChangeClockDivider(key, 12);      //设置时钟驱动频率的函数   
    
    MMU_DisableICache();    //对内存管理单元MMU的设置
    MMU_DisableDCache(); 
                                                 
    rGPBCON = rGPBCON&(~(0xFF<<5))|(0x55<<5);    //设置为输出GPB5,6,7,8

    EINT_Init();
    while(1);     
  
}