#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "mmu.h"
#include "stdio.h"
/*中断处理函数按下不同按钮进入该中断处理,并根据按下的不同按钮启动不同功能,实现功能控制面板的按钮功能*/
void __irq Eint_Isr(void)
{
switch(rEINTPEND)
{
case 1<<13: //功能1启动,同时关闭功能2
rGPBDAT=0<<6|1<<7;
rEINTPEND=1<<13; //等待下一个自己的中断进入
break;
case 1<<14: //功能2启动,同时关闭功能1
rGPBDAT=1<<6|0<<7;
rEINTPEND=1<<14; //等待下一个自己的中断进入
break;
case 1<<8: //关闭功能1和2
rGPBDAT=1<<6|1<<7;
rEINTPEND=1<<8; //等待下一个自己的中断进入
break;
default:
rGPBDAT=1<<6|1<<7;
break;
}
ClearPending(BIT_EINT8_23); //等待下一个该中断向量内的任意中断到来
}
/*设置启动后的默认功能*/
void Led_on()
{
// 设置LED灯
rGPBCON=0x155555; //设置GPB为输出
rGPBDAT=(0x1<<6)|(0x1<<7); //GPB7脚置位,led灭
}
/*设置按钮出发方式*/
void Eint_func()
{
// 按键中断源设置
rGPGCON=(rGPGCON&~((0x3<<0)|(0x3<<10)|(0x3<<12)))|(0x1<<1)|(0x1<<11)|(0x1<<13); //设置GPG0、5、6脚为EINT8、13、14
rGPGUP|=(0x1<<0)|(0x1<<5)|(0x1<<6); //引脚使用第二功能
rEXTINT1=rEXTINT1&~(0x7<<0);//|(0x1<<2); //按钮1设置为低电平沿触发
rEXTINT1=rEXTINT1&~(0x7<<20);//|(0x1<<22); //按钮2设置为低电平沿触发
rEXTINT1=rEXTINT1&~(0x7<<24);//|(0x1<<26); //按钮3设置为低电平沿触发
}
/*中断初始化*/
void Eint_init()
{
rEINTMASK=rEINTMASK&~((0x1<<8)|(0x1<<13)|(0x1<<14)); // 使能外部中断屏蔽,为0时不屏蔽中断
/*设置中断控制器*/
rINTMOD&=~BIT_EINT8_23; //设置中断模式为IRQ
rINTMSK&=~BIT_EINT8_23; //启动中断使能
}
/*中断挂起,等中断*/
void Eint_wait()
{
rSRCPND=rSRCPND; //中断挂起寄存器清除
rINTPND=rINTPND; //中断源挂起寄存器清除
rEINTPEND|=(0x1<<8)|(0x1<<13)|(0x1<<14); //外部中断挂起寄存器,Eint13挂起等待中断
rSRCPND=BIT_EINT8_23; //中断源挂起寄存器相应位置1等待中断
rINTPND=BIT_EINT8_23; //中断挂起寄存器相应位置1等待中断
}
/*设置中断指针*/
void Eint_p()
{
pISR_EINT8_23 =(U32)Eint_Isr; //设置中断为Eint11响应
}
/*主程序开始*/
void Main()
{
// isr_asm(); //使能CPSR寄存器的I位
Led_on(); //启动时将led熄灭
Eint_init(); //中断初始化
Eint_func(); //中断触发状态初始化
Eint_wait(); //等待中断
Eint_p(); //中断指针
}