#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "mmu.h"
#include "2440slib.h"
U32 key;
/*static void __irq EINT11_ISR(void)
{ //清中断必须按一下三个的顺序
rEINTPEND |=( 1<< 11);//外部中断悬挂寄存器,清 0 无请求,1 时有中断请求
rSRCPND |= (1<<5);//指示中断源状态,0 无中断源请求,1 时有中断源请求
rINTPND |=(1<<5);//指示中断状态,0 无中断请求,1 时有中断请求
Uart_Printf("EINT11 is occurred.\n");
}
static void __irq EINT8_ISR(void)
{ //清中断必须按一下三个的顺序
rEINTPEND |=( 1<< 8);//外部中断悬挂寄存器,清 0 无请求,1 时有中断请求
rSRCPND |= (1<<5);//指示中断源状态,0 无中断源请求,1 时有中断源请求
rINTPND |=(1<<5);//指示中断状态,0 无中断请求,1 时有中断请求
Uart_Printf("EINT8 is occurred.\n");
}*/
U8 Key_Scan( void )
{
Delay( 8000 ) ;
if(
(rGPGDAT&(1<< 0)) == 0 )
return 1 ;
else if( (rGPGDAT&(1<< 3)) == 0 )
return 2;
else if( (rGPGDAT&(1<< 5)) == 0 )
return 3 ;
else if( (rGPGDAT&(1<< 6)) == 0 )
return 4 ;
else if( (rGPGDAT&(1<< 7)) == 0 )
return 5 ;
else if( (rGPGDAT&(1<<11)) == 0 )
else
return 6 ;
return 0xff;
}
static void __irq Key_ISR(void)
{
//U32 r;
//EnterCritical(&r);
if(rINTPND==BIT_EINT8_23) {
ClearPending(BIT_EINT8_23);
if(rEINTPEND&(1<<8)) {
//Uart_Printf("eint11\n");
rEINTPEND |= 1<< 8;
}
if(rEINTPEND&(1<<11)) {
//Uart_Printf("eint11\n");
rEINTPEND |= 1<< 11;
}
if(rEINTPEND&(1<<13)) {
//Uart_Printf("eint11\n");
rEINTPEND |= 1<< 13;
if(rEINTPEND&(1<<14)) {
//Uart_Printf("eint11\n");
rEINTPEND |= 1<< 14;
if(rEINTPEND&(1<<15)) {
//Uart_Printf("eint11\n");
rEINTPEND |= 1<< 15;
if(rEINTPEND&(1<<19)) {
// Uart_Printf("eint19\n");
rEINTPEND |= 1<< 19;
}
}
}
}
}
key=Key_Scan();
if( key == 0xff )
Uart_Printf( "Interrupt occur... Key is released!\n") ;
else
Uart_Printf( "Interrupt occur... K%d is pressed!\n", key) ;
//ExitCritical(&r);
}
void xmain(void)
{
//405MHZ
ChangeClockDivider(3,1);
ChangeMPllValue(127,2,1);
MMU_Init();
Isr_Init();
Uart_Init(0, 115200);
Uart_Select(0);
Uart_Printf("the main is running.\n");
//-----------------中断初始化----------------//
//选择功能管脚
//rGPGCON = rGPGCON & (~(3<<0) |(2<<0) );
//rGPGCON &(0x82);//当 GPG0 取 10 时,表示 EINT8,即 K1
rGPGCON =rGPGCON & (~((3<<22)|(3<<6)|(3<<0)|(3<<10)|(3<<12)|(3<<14))) |
((2<<22)|(2<<6)|(2<<0)|(2<<10)|(2<<12)|(2<<14));
p144
//中断模式
rINTMOD = rINTMOD & ( ~(1<<5) );//EINT8-23:外部中断 8~23
//触发方式
p154
//rEXTINT1 = ( rEXTINT1 | (7<<0) ) & ( ~(4<<0) );//EINT8 falling edge triggered
rEXTINT1 &= ~(7|(7<<0));
rEXTINT1 |= (0|(0<<0)); //EXTINT1 用于设置 EINT15~EINT8 触发信号的类型
p146
rEXTINT1 &= ~(7|(7<<12));
rEXTINT1 |= (0|(0x0<<12)); //EXTINT1 用 于 设 置 EINT15~EINT8 触 发 信 号 的 类 型
p146
rEXTINT1 &= ~(7<<20);
rEXTINT1 |= (0<<20);
rEXTINT1 &= ~(7<<24);
rEXTINT1 |= (0<<24);
rEXTINT1 &= ~(7<<28);
rEXTINT1 |= (0<<28);
//set eint13 falling edge int
//set eint14 falling edge int
//set eint15 falling edge int
rEXTINT2 &= ~(0xf<<12);
rEXTINT2 |= (0<<12);
//set eint19 falling edge int
//使能中断
rINTMSK = rINTMSK & ( ~(1<<5) );//设定被中断屏蔽,0 为中断服务有效,1 为中断服务屏
蔽 p154
//清中断
//rSRCPND |= (1<<8);//to clear EINT8
//rEINTPEND |= ~(1<<8);
//clear eint 8
rEINTMASK &= ~((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19)); //p148 外部中断掩
码寄存器,[3:0]保留取值 0,[23:4]控制相应的 EINT[23:4],清零使能相应的中断,置 1 时屏
蔽中断
// rEINTMASK &= ~((1<<11)); //enable eint11
//中断向量
//pISR_EINT0 = (U32)EINT0_ISR;//EINT0
//ExitCritical(&r);
while(1)
Uart_Printf("the main is running.\n");
Delay(50000000);
pISR_EINT8_23 = (U32)Key_ISR;
{
}
}
1、MMU 一定要在主函数里面开启。否则会出现 dummy is busy............错误
2、请中断的时候一定要按顺序请中断,这个在上面程序注释里面已经有了。否则会无法正
常中断。