微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > MDK下的裸机中断编程

MDK下的裸机中断编程

时间:10-02 整理:3721RD 点击:

       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打广告,其实他们的服务我是不看好的)本人知识能力有限,错误之处欢迎留言指正,感激不尽。
欢迎访问原地址:http://user.qzone.qq.com/605678913/infocenter#!app=2&via=QZ.HashRefresh&pos=1340535650




谢谢小编分享

我要下载不要扣分

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top