guolonglee的个人空间 https://passport2.21ic.com/?909388 [收藏] [复制] [RSS]

日志

征服MDK下2240裸机中断

已有 671 次阅读2012-12-11 17:32 |系统分类:ARM| 2440, MDK, 裸机, 中断


MDK下S3C2440裸机中断,断断续续将耗费了我将近了一个月的时间,在贵师大图书馆里几乎翻遍了有关图书,有关这方面的介绍寥寥而过,想必出书的人也未必弄得清楚。网上的资料也五花八门,有些说MDK自带的2440的启动代码有误(确实跟2410的启动代码不同,但经过这段时间的验证,启动代码绝对没有任何问题);有些说必须内存映射到正确的地址,才可以进入相应异常(从NORFLASH启动绝对可以进入IRQ中断);大部分在书写中断服务程序时,__irq关键字都放在函数名的前面(ADS编译器__irq关键之放置在函数名前面,但MDK必须将__irq关键字放在函数最末端);有些说必须修改2440启动代码才能进入中断(没有对启动代码做任何修改,实现了IRQ中断)……

       在这些一大堆乱七八糟的资料中,我差点都放弃了ARM的学习。为了实现IRQ中断而很吃力地学习了ARM汇编,试着修改2440的启动代码;学习了内存管理,试着映射异常向量的地址;如今回过头去看,能挺过来挺欣慰的。为实现简单IRQ中断其实很简单的,真是踏破铁鞋无觅处,得来全不费功夫。

      以下是关键的几点程序说明,希望对后面学习的朋友,有些帮助。

void irq_init()    //irq初始化,这个函数其实比较简单,适当看看2440PDF就应该能设定寄存器了
{
 GPFCON = 0xaaaa;

 SRCPND = 0x17;
 INTMSK &= ~(0x17);
 INTPND = 0x17;

 EINTPEND =(1<<4);
 __asm{nop}

 EINTMASK &=~(1<<4);
 __asm{nop}  

 EXTINT0 = 0x0;
}

 

//这是个很关键的函数,但其实也简单,中断服务函数照着这个形式写应该就能进入IRQ中断了。

void  IRQ_Handler(void) __irq //irq中断函数
{
 int j=0;

 __asm{nop};
 __asm{nop};

 j= INTOFFSET;

 SRCPND = SRCPND | 0x17;
 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_ent4();//外中断4
      irq_init();
     break;
 }
}

       以上两个函数式实现IQR中断的关键函数,能弄清楚上面的两个函数,IRQ中断应该就没什么大问题了。如果你的是TQ2440开发版的话可以到附件下载工程文件,直接烧写hex文件应该就能实现四个按键的IRQ中断了。(千万不要以为我在给TQ2440打广告,其实他们的服务我是不看好的)本人知识能力有限,错误之处欢迎留言指正,感激不尽。

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)