ARM9外部中断裸机实验

S3C2440一共有60个中断源,其中有15个子中断源,它们与SUBSRCPND寄存器中的每一位相对应,其他45个中断源与SRCPND中的每一位相对应。要注意的是EINT4~7对应的是同一位SRCPND[4],而EINT8~23对应的也是SRCPND[5]一位。

本代码是在mini2440开发板实验的,采用外部中断方式,K1按下亮LED1,K2按下亮LED2;

如下是主程序main.c

程序中出现的MMU_Init(),ClearPending()函数都在头文件中已经申明的
**************************************************************/

#define GLOBAL_CLK  1
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"

/******************************************************************************
函数名称:中断处理函数
函数关键字:__irq
   
******************************************************************************/
static void __irq Key_ISR(void)                //中断处理函数
{
// U32 r;
// EnterCritical(&r);                          //函数头尾的这行代码,别人写的,作用不明
 if(rINTPND&BIT_EINT8_23)                         
 {
  ClearPending(BIT_EINT8_23);                //rSRCPND,rINTPND里的位置写1来清零
   if(rEINTPEND&(1<<8))                      //如果k1被按下
  {   
    rEINTPEND &=~ (1<< 8);                   //清外部中断挂起寄存器
      rGPBDAT = 0XFFFFFFDF;                 //点亮LED1,GPB5输出0;
                                                
  }
  if(rEINTPEND&(1<<11))                     //如果k2被按下
  {                                          
     rEINTPEND &= ~(1<< 11);  
      rGPBDAT = 0XFFFFFFBF;                 //点亮LED2,GPB6输出0;
  }
   
          
 }
//ExitCritical(&r);
}
/******************************************************************************
函数名称:       中断函数初始化
函数初始化:     顺序为设置GPGCON,设置中断触发方式,清外部中断挂起寄存器
EINTPEND,开中断设置EINTMASK,清中断源挂起和中断挂起寄存器SRCPND、INTPND,
开总中断INTMSK。
******************************************************************************/
void KeyScan_Test(void)
{

  rGPGCON =0x82;                            //设置GPG0和GPG3工作在外部中断EINT8,EINT11;
                                           //GPG0和GPG3分别和K1,K2相连
 rEXTINT1 &= ~(7|(7<<0)); 
 rEXTINT1 |= (0|(0<<0));                   //设置EINT8低电平触发;
 
 rEXTINT1 &= ~(7<<12);                     //设置EINT11低电平触发;
 rEXTINT1 |= (0|0<<0);
 

 rEINTPEND |= (1<<8)|(1<<11);           //写1清外部中断挂起寄存器中的EINT8,EINT11
 rEINTMASK &= ~((1<<8)|(1<<11));           //使能外部中断EINT8,EINT11
 ClearPending(BIT_EINT8_23);               //写1清寄存器SRCPND和INTPND
 
 EnableIrq(BIT_EINT8_23);               //将rINTMASK的对应位置0,即开总中断
                             
}
/******************************************************************************
主函数
******************************************************************************/
void Main(void)
{
rGPBCON =0x15400;                             //设置GPG5~GPG8为输出方式;
rGPBDAT=0xffffffff;                           //所有灯全灭             
MMU_Init();                                   //初始化内存。                   
KeyScan_Test();
pISR_EINT8_23 = (U32)Key_ISR;                 //填写中断向量表对应项,赋中断入口地址,外部中断8~23共用一个中断入口地址;
while(1);

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值