实验结果:按左键中断周期为2秒,led灯向左亮;按右键中断周期为3秒,led灯向右亮。超级终端上显示为按左键每两秒显示一次key0,按右键每三秒显示一次key1
#define rCPLDLEDADDR (*(volatile unsigned char*)0x21180000) // LED Address
#define rCPLDIntControl (*(volatile unsigned char*)0x22600000)
#define rCPLDIntStatus (*(volatile unsigned char*)0x22200000)
void __irq int_int(void);
void __irq watchdog_int(void);
int flag=0;
void __irq watchdog_int(void) //输出函数 输出key0 key1显示在超级终端上(key0每两秒出现一次,key1每三秒出现一次)
{
ClearPending(BIT_WDT);
if(flag==0)
uart_printf(" key0 ");
else
uart_printf(" key1 ");
}
void __irq int_int(void)
{
unsigned char Status;
Status = rCPLDIntStatus;
Status = ~(Status & 0x6);
if(Status & 0x2)
{
flag=0;
rWTDAT = 15624; // 将初值设为原来的二倍,周期加长,变成2秒
rWTCNT = 15624;
rCPLDIntControl |= (1<<1);
rCPLDIntControl &= ~(1<<1);
}
else if(Status & 0x4)
{
flag=1;
rWTDAT = 23436; // 将初值设为原来的三倍,周期加长,变成3秒
rWTCNT = 23436;
rCPLDIntControl |= (1<<2);
rCPLDIntControl &= ~(1<<2);
}
rEINTPEND=(1<<9);
ClearPending(BIT_EINT8_23);
}
void int_init(void)
{
rSRCPND = rSRCPND; // Clear all interrupt
rINTPND = rINTPND; // Clear all interrupt
ClearPending(BIT_WDT); // clear interrupt pending bit
rGPGCON |= (0xf<<0);
rGPGCON &= (0xa<<0);
rCPLDIntControl = 0xFF;
rCPLDIntControl = 0xF9;
rEINTPEND = 0xffffff;
rSRCPND = BIT_EINT8_23; // Clear the previous pending states
rINTPND = BIT_EINT8_23;
rEXTINT1 &= ~((0x7<<4)|(0x7<<0));
rEXTINT1 |= ((0x2<<4)|(0x2<<0));
rEINTMASK &= ~(3<<8);
rINTMSK &= ~(BIT_EINT8_23);
}
void led_Z(void) //从右向左亮
{
int i,nOut;
nOut = 0xFF;
rCPLDLEDADDR = nOut & 0xFE;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut & 0xFC;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut & 0xF8;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut & 0xF0;
for(i = 0; i < 100000; i++);
nOut = 0xF0;
rCPLDLEDADDR = nOut | 0x01;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut | 0x03;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut | 0x07;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut | 0x0F;
for(i = 0; i < 100000; i++);
}
void led_Y(void)//从左向右亮
{
int i,nOut;
nOut = 0xFF;
rCPLDLEDADDR = nOut & 0xF0;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut & 0xF8;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut & 0xFC;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut & 0xFE;
for(i = 0; i < 100000; i++);
nOut = 0xF0;
rCPLDLEDADDR = nOut | 0x0F;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut | 0x07;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut | 0x03;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut | 0x01;
for(i = 0; i < 100000; i++);
}
void wt_init(void) //初始化看门狗,这里将所有的值都得到了,可直接在mian函数中调用
{
pISR_EINT8_23=(UINT32T)int_int;
pISR_WDT = (unsigned)watchdog_int;
rWTCON = ((PCLK/1000000-1)<<8)|(3<<3)|(1<<2);
rWTDAT = 15624;
rWTCNT = 15624;
rWTCON |=(1<<5);
rINTMOD &= ~(BIT_WDT);
rINTMSK &= ~(BIT_WDT);
}
void int_test(void) //执行流水灯程序
{
uart_printf("\n External Interrupt Test Example\n");
int_init();
while(1)
{
if(flag==0)
led_Y();
else if(flag==1)
led_Z();
}
}
#include "int_test.h"
#include "sys_init.h"
int main( )
{
sys_init(); // Initial s3c2410's Clock, Interrupt,Port and UART
wt_init();
int_init();
while(1)
{
int_test();
}
}