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);
}