mini2440外部irq中断实验

来源:互联网 发布:济南汇通达网络 编辑:程序博客网 时间:2024/05/16 06:16

mini2440外部irq中断实验

上图为中断控制流程图,SUBSRCPND为子中断状态寄存器,当中断发生时相应位被置一,清除中断标志位需要向该寄存器写1,因为它是只读存储器,只要向里面写就可以清除相应的位,而不是真的写进去了。SUBMASK为子中断屏蔽寄存器,向相应位写1代表屏蔽该中断,SRCPND为一类中断的状态寄存器,MASK为一类中断的屏蔽寄存器,INTPND为总的状态寄存器,这些寄存器与前面的功能相同,MODE寄存器是模式选择寄存器,0为IRQ模式,1为快速模式。通过按键1GPG0触发低电平引起ENIT8中断,蜂鸣器响。具体实验代码如下(放入src目录下的main函数中可直接在线仿真):

#define    GLOBAL_CLK              1

#include <stdlib.h>

#include <string.h>

#include "def.h"

#include "option.h"

#include "2440addr.h"

#include "2440lib.h"

#include "2440slib.h"

#include "mmu.h"

#include "profile.h"

#include "memtest.h"

 

void delay(int times)//延时函数

{

    int i;

    for(;times>0;times--)

      for(i=0;i<400;i++);

}

 

void beep_init(void)//蜂鸣器初始化

{

   rGPBCON =1<<0;// 设置GPB0为输出端口

   rGPBUP=1<<0;//禁止GPB0上拉功能

}

 

void beep(void)

   

    beep_init();//初始化蜂鸣器

    rGPBDAT =0x1;//蜂鸣器响

    delay(3000);

    rGPBDAT=0x0;//蜂鸣器不响

    delay(3000);

   

 

void key1_init() //按键1初始化

{

       rGPGCON &=~(0x3<<0);

       rGPGCON |=0x2<<0;   //设置GPG0为中断模式

       rGPGUP|=1<<0;//禁止GPG0上拉

}

 

static void __irq Key1_ISR(void)   //EINT8

 

{

       if(rINTPND & (1<<5))

       {

      

       if(rEINTPEND & (1<<8))

       {

              rEINPEND |=1<<8;//清除子子中断器标记位

              beep();//蜂鸣响

       }

       rSRCPND |=(1<<5);

       rINTPND |=(1<<5);

       }

         

}

 

      

void inter_init()

{

   

   

       rINTMSK &=~(1<<5); //屏蔽EINT8_23以外的中断源

       rEINTMASK &=~(1<<8);//允许EINT8中断

       rINTMOD &=~(1<<5);//把GPG0中断设为IRQ模式

       pISR_EINT8_23 = (U32)Key1_ISR;//将中断服务函数的地址传给对应的中断向量表位置

}

 

void Main(void)

      

       MMU_Init();//初始化MMU,解决中断向量表入口地址与内存地址之间不一样的矛盾,进行地址的重映射

      

       key1_init();//初始化按键

   

       inter_init();//初始化中断

 

       while(1); //死循环等待中断发生

 

}

 

注意:第一次接触arm的中断,这个程序花了一天的时间,有两个问题值得注意!

1.       中断清除顺

原创粉丝点击