📄 ioport.c
字号:
U32 rIOPDATA;
Print("\n\r\r#@$ Type Esc to exit.#$@%*");
do {
do {
Print("\n\rRead or Write I/O Port data?[R/W]");
ch = get_byte(); ch = to_upper(ch);
} while(ch !='R' && ch !='W');
if(ch == 'W') {
Print("\n\r> Write data to IOPDATA register[5 hexdigit]_");
rIOPDATA = gethex2dec(5); get_byte();
IOPDATA = rIOPDATA;
Print("\n\rWrite IOPDATA is 0x%08x",IOPDATA);
}
else if(ch == 'R')
Print("\n\rRead IOPDATA is 0x%08x",IOPDATA);
ch = get_byte();
}while(ch != ESC);
}
/*******************************************************************
* IOPORT EXTERNAL INTERRUPT FUNCTIONS
*******************************************************************/
void ext0isr(void)
{
ExtIntCnt++;
ExtIntFlag = 1;
}
void ext1isr(void)
{
ExtIntCnt++;
ExtIntFlag = 1;
}
void ext2isr(void)
{
ExtIntCnt++;
ExtIntFlag = 1;
}
void ext3isr(void)
{
ExtIntCnt++;
ExtIntFlag = 1;
}
/*******************************************************************
* EXTERNAL INTERRUPT REQUEST FUNCTION TEST
*******************************************************************/
void ExtIntReq(int channel)
{
U32 rIOPMOD = 0x3ffff; //All output mode
U32 rIOPDATA;
char ch;
do {
ExtIntFlag = 0;
IOPMOD = rIOPMOD;
do {
Print("\n\r> Set IOPDATA register[5 hexdigit]_");
rIOPDATA = gethex2dec(5); get_byte();
Print("\n\r - IOPDATA input is 0x%08x",rIOPDATA);
IOPDATA = rIOPDATA;
SetExtIntMode(channel); //set IOPCON
ExtIntEnable(channel);
} while(!ExtIntFlag);
Print("\n\r\r$Continuing External Interrupt Test?[Y/N]_");
} while(((ch=get_byte()) != 'N')&& (ch != 'n'));
ExtIntDisable(channel);
}
/* This is for the stress test fucntion on external interrupt */
void ExtIntStress(int channel)
{
U32 rIOPMOD = 0x3ffff; /* All output mode */
U32 rIOPDATA = 0x1f; /* LED All OFF */
U32 rIOPCON;
U32 rMonitor = 0;
ExtIntFlag = 0;
// SyscfgInit(CACHE_8K);
Print("\n\r\n<< External interrupt input stress test >>\r");
Print("\n\rSelected channel of External interrupt is %d.",channel);
//Print("\rExternal interrupt source is timer1 output.");
Print("\n\rExternal interrupt source is 1.544MHz OSC.");
Print("\n\rInterrupt modes are Filter on,Rising edge detect.");
Print("\n\r\r");
ExtIntDisable(channel);
/* external interrupt mode & IO port mode setup */
/* Ext int enable,alctive low, filter on,rising edge */
switch(channel) {
case 0 : rIOPCON = xIRQ0(0x15); break;
case 1 : rIOPCON = xIRQ1(0x15); break;
case 2 : rIOPCON = xIRQ2(0x15); break;
case 3 : rIOPCON = xIRQ3(0x15); break;
}
IOPMOD = rIOPMOD;
IOPDATA = rIOPDATA;
IOPCON = rIOPCON;
IopStatus();
/* timer setup */
tmReset(TIMER_DEV1);
tm_init(TIMER_DEV1,(ONE_SECOND/TICKS_PER_SECOND));
IntConfig(); /* Interrupt status */
ExtIntEnable(channel);
TimerStart(TIMER_DEV1);
while(1) {
while(!ExtIntFlag) ; //SysTime('0');
if(ExtIntCnt == MON_TIME_DELAY)
{
rMonitor++;
Print("\n\r\n[%d]External interrupt occurred %d times!!\r",rMonitor,ExtIntCnt);
PrtSysTime(TIMER_DEV1,"External INT event time"); Print("\r");
ExtIntCnt = 0;
}
ExtIntFlag =0;
}
ExtIntDisable(channel);
}
void SetExtIntMode(int channel)
{
U32 rIOPCON;
switch(channel) {
case 0: Print("\n\rSet external interrupt Req0 mode.");
Print("\n\r> IOPCON[2hexdigit]_");
rIOPCON = gethex2dec(2); get_byte();
rIOPCON = rIOPCON & (xIRQ0_CON|xIRQ0_ON);
Print("\n\r - IOPCON input is 0x%08x",rIOPCON);
break;
case 1: Print("\n\rSet external interrupt Req1 mode.");
Print("\n\r> IOPCON[2hexdigit]_");
rIOPCON = gethex2dec(2); get_byte();
rIOPCON = (rIOPCON<<5)&(xIRQ1_CON|xIRQ1_ON);
Print("\n\r - IOPCON input is 0x%08x",rIOPCON);
break;
case 2: Print("\n\rSet external interrupt Req2 mode.");
Print("\n\r> IOPCON[2hexdigit]_");
rIOPCON = gethex2dec(2); get_byte();
rIOPCON = (rIOPCON<<10)&(xIRQ2_CON|xIRQ2_ON);
Print("\n\r - IOPCON input is 0x%08x",rIOPCON);
break;
case 3: Print("\n\rSet external interrupt Req3 mode.");
Print("\n\r> IOPCON[2hexdigit]_");
rIOPCON = gethex2dec(2); get_byte();
rIOPCON = (rIOPCON<<15)&(xIRQ3_CON|xIRQ3_ON);
Print("\n\r - IOPCON input is 0x%08x",rIOPCON);
}
IOPCON = rIOPCON;
}
void ExtIntEnable(int channel)
{
switch(channel) {
case 0: Enable_Int(nEXT0_INT); break;
case 1: Enable_Int(nEXT1_INT); break;
case 2: Enable_Int(nEXT2_INT); break;
case 3: Enable_Int(nEXT3_INT);
}
}
void ExtIntDisable(int channel)
{
switch(channel) {
case 0: Disable_Int(nEXT0_INT); break;
case 1: Disable_Int(nEXT1_INT); break;
case 2: Disable_Int(nEXT2_INT); break;
case 3: Disable_Int(nEXT3_INT);
}
}
void ExtIntAllEnable(void)
{
Enable_Int(nEXT0_INT);
Enable_Int(nEXT1_INT);
Enable_Int(nEXT2_INT);
Enable_Int(nEXT3_INT);
}
void ExtIntAllDisable(void)
{
Disable_Int(nEXT0_INT);
Disable_Int(nEXT1_INT);
Disable_Int(nEXT2_INT);
Disable_Int(nEXT3_INT);
}
/* This is for the stress test fucntion on external interrupt */
int keyscan()
{
U32 rIOPMOD; /* All output mode */
U32 rIOPCON;
int KeyInValue ;
int i;
/* Interrupt vector setup for key scan */
SysSetInterrupt(nEXT0_INT, ext0isr);
SysSetInterrupt(nEXT1_INT, ext1isr);
SysSetInterrupt(nEXT2_INT, ext2isr);
SysSetInterrupt(nEXT3_INT, ext3isr);
ExtIntAllDisable();
/* Save previous port configuration */
rIOPMOD = IOPMOD;
rIOPCON = IOPCON;
/* external interrupt mode & IO port mode setup */
/* Ext int enable,alctive low, filter on,level detection */
IOPMOD = 0x3ffff; /* All output mode */
IOPDATA = 0xf0f; /* Initialize to all high */
IOPCON = xIRQ0(0x16)|xIRQ1(0x16)|xIRQ2(0x16)|xIRQ3(0x16);
ExtIntAllEnable();
for(i = 0; i < KEY_TIME_OUT ; i++)
{
if(ExtIntFlag)
{
ExtIntFlag = 0;
break;
}
}
ExtIntAllDisable();
if(i < KEY_TIME_OUT)
{
KeyInValue = ((IOPDATA & KEY_PAD)>>8);
}
else {
KeyInValue = INVALID_KEY; //No Valid key input
}
/* Restore previous port configuration */
IOPDATA = 0xff0; /* Initialize to all high */
IOPMOD = rIOPMOD;
IOPCON = rIOPCON;
return(KeyInValue);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -