在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);
}
上一篇:基于SmartARM2300开发板的ADS工程移植keil5工程
下一篇:为mini2440开发板建立Keil MDK/Jlink开发调试环境