⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ioport.c

📁 三星mcu S3C4510B评估板的原码
💻 C
📖 第 1 页 / 共 2 页
字号:
     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 + -