您的位置:首页 > 其它

mini2440外部irq中断实验

2011-09-26 13:38 375 查看




上图为中断控制流程图,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. 中断清除顺
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: