主题 : 6410跑裸机中断不响应 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 49889
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
综合积分: 32 分
注册时间: 2011-06-16
最后登录: 2011-12-12
楼主  发表于: 2011-07-01 19:25

 6410跑裸机中断不响应

main()
{
    Uart_Init();      
    Port_Init();
    INTC_Init();
    
    INTC_SetIntISR(0,isr);
    INTC_SetIntISR(1,isr);
    
    EINT_Group0_SetGPIO(0, Trigger_Falling, eEnFLT, 0x2);
    EINT_Group0_SetGPIO(1, Trigger_Falling, eEnFLT, 0x2);
    EINT_Group0_SetGPIO(2, Trigger_Falling, eEnFLT, 0x2);
    EINT_Group0_SetGPIO(3, Trigger_Falling, eEnFLT, 0x2);
    EINT_Group0_GPIO_Enable(0);
    EINT_Group0_GPIO_Enable(1);
    EINT_Group0_GPIO_Enable(2);
    EINT_Group0_GPIO_Enable(3);
    
    INTC_Enable(0);
    INTC_Enable(1);
    INTC_Enable(2);
    INTC_Enable(3);
    INTC_ClearVectAddr();
    
    Uart_Printf("\r\n<***********************************************>\r\n");
    Uart_Printf("   S3C6410 Test Program VER1.0\r\n");
    Uart_SendString(" Mini6410 @Andrew Huang \r\n");  
   while(1);
}

/*
清除中断指示,防止干扰下一次中断发生
*/
void INTC_ClearVectAddr(void)
{
   rVIC0ADDR = 0x0;
   rVIC1ADDR = 0x0;
}

void __irq isr(void)
{
    Uart_Printf("2:count leds \r\n");  
    if(rEINT0PEND & 0x1)
        Uart_Printf("EINT0 is occurred\n");
    else if(rEINT0PEND & 0x2)
        Uart_Printf("EINT1 is occurred\n");
    else if(rEINT0PEND & 0x4)
        Uart_Printf("EINT2 is occurred\n");
    else if(rEINT0PEND & 0x8)
        Uart_Printf("EINT3 is occurred\n");
    
   INTC_ClearVectAddr();
    EINT_Group0_ClrPend(0);
    EINT_Group0_ClrPend(1);
  
}
void INTC_SetIntISR(unsigned int intNum, void (*isr)(void) __irq)
{
  if(intNum > INT_LIMIT)
     {
        return ;
     }
    
     if(intNum < 32)
     {
         VIC0VECTADDR[intNum] = (unsigned )isr;
        
     }
     else
     {
         VIC1VECTADDR[intNum-32] = (unsigned )isr;
     }
}


//配置第0组的外部中断脚
//uEINT_No: EINT No. 中断脚序号 0-27
//                    uINTType: Select EINT Type.中断信号类型
//                                Low, High, Falling, Rising, Both
//                    uFltType :  Select Filter Type  滤波类型
//                                DisFLT(Disable Filter), DLYFLT(Delay Filter), DIGFLT(Digital Filter)
//                    uFltWidth : Digital Filter Width ( 1~0x3F) 数字滤波的周期
//

//uEINT_No <= 15 ;                   //挂在GPN0-GPN15
//uEINT_No >= 16 && uEINT_No <= 22  //挂在GPL8-GPL14
//uEINT_No >= 23 && uEINT_No <= 27  //挂在GPM0-GPM4
int EINT_Group0_SetGPIO(unsigned int uEINT_No , INT_eTYPE uIntType, FLT_eTYPE eFltType,   unsigned int uFltWidth)
{
   unsigned int uOffset,uConValue;
  
   //设中断类型
   // rEINT0CONx 中断捕获类型,每两个相临中断脚共享一个配置.每个配置占了3+1 bit
   if( uEINT_No <= 15)
   {
      //设置rEINT0CON0  
      uOffset = uEINT_No >> 1 ; //除2算出在EINT0CON0的偏移量
      
      uConValue = rEINT0CON0;
      
      //先清除4位,然后再设为相应中断类型
      uConValue =  (uConValue & ~(0xF<<(uOffset*4))) | (uIntType<<(uOffset*4));
      
      rEINT0CON0 = uConValue;
      
      
   }
   else if(uEINT_No >= 16 && uEINT_No <= 27)
   {
      uOffset = (uEINT_No - 16) >> 1 ;
      
      uConValue = rEINT0CON1;
      
      uConValue =  (uConValue & ~(0xF<<(uOffset*4))) | (uIntType<<(uOffset*4));
      
      rEINT0CON1 = uConValue;
   }
  
   //配置GPIO为相应的中断脚
  
   if( uEINT_No <= 15)
   {//GPN0 - GPN15
    //10 = Ext. Interrupt[n]  = 0x2
    uOffset = uEINT_No ;
    
    uConValue =  rGPNCON;
    
    uConValue =  (uConValue & ~(0x3<<(uOffset*2))) | (0x2<<(uOffset*2));
    
    rGPNCON = uConValue;
    
  
    
   }
   else if(uEINT_No >= 16 && uEINT_No <= 22)
   {//在GPL8-GPL14
     //0011 = Ext. Interrupt[n]  = 0x3
     uOffset = uEINT_No -16;
    
     uConValue = rGPLCON1 ;
    
     uConValue =  (uConValue & ~(0xF<<(uOffset*4))) | (0x3<<(uOffset*4));
    
     rGPLCON1 = uConValue;
    
    
    
   }
   else if(uEINT_No >=23 && uEINT_No <=27)
   {  //GPM0-GPM4
      // 0011 = Ext. Interrupt[n] = 0x3
      uOffset = uEINT_No -23;
      
      uConValue = rGPMCON ;      
      
      //设置对应脚为外部中断
      uConValue =  (uConValue & ~(0xF<<(uOffset*4))) | (0x3<<(uOffset*4));
      
      rGPMCON = uConValue;
      
   }
   else
   {
     Uart_Printf("GPIO_SetEINT_Group0:Error Eint No %d. \n",uEINT_No);
     return -1;
   }
  
  
   //设置滤波方式
  
   // Check Filter Width
    if(uFltWidth >=0x40)
    {
        Uart_Printf("GPIO_SetEINT_Group0:Error Filter Width %d. \n",uFltWidth);
        //Assert(0);
        return -1;
        
    }

    // Fliter Type & Filter Width
    if( uEINT_No <= 7)
    {
        uOffset =(uEINT_No>>1);
        
        uConValue = rEINT0FLTCON0;
        //每两个相临脚共享一个配置,每个滤波配置占8位
        uConValue = (uConValue & ~(0xFF<<(uOffset*8))) |((uFltWidth<<(uOffset*8))|(eFltType<<(uOffset*8+6)));
        rEINT0FLTCON0 = uConValue;    
        
        
    }
    else if(uEINT_No >= 8  && uEINT_No <= 15)
    {
        uOffset =(uEINT_No>>1)-4;
        
        uConValue = rEINT0FLTCON1;
        uConValue = (uConValue & ~(0xFF<<(uOffset*8))) |((uFltWidth<<(uOffset*8))|(eFltType<<(uOffset*8+6)));
        
        rEINT0FLTCON1 = uConValue;    
    }
    else if(uEINT_No >= 16  && uEINT_No <= 23)
    {
        uOffset =(uEINT_No>>1)-8;
        
        uConValue = rEINT0FLTCON2;
        uConValue = (uConValue & ~(0xFF<<(uOffset*8))) |((uFltWidth<<(uOffset*8))|(eFltType<<(uOffset*8+6)));
        rEINT0FLTCON2 = uConValue;    
    }
    else if(uEINT_No >= 24  && uEINT_No <= 27)
    {
        uOffset =(uEINT_No>>1)-12;
        
        uConValue = rEINT0FLTCON3;
        uConValue = (uConValue & ~(0xFF<<(uOffset*8))) |((uFltWidth<<(uOffset*8))|(eFltType<<(uOffset*8+6)));
        rEINT0FLTCON3 = uConValue;    
    }


   return 0;
  
}


//清除GPIO中断指示标志,一般用ISR的最后执行
void EINT_Group0_ClrPend(unsigned int uEINT_No )
{
    
    rEINT0PEND  |= (1<<uEINT_No);
}

//关闭某一个中断,向中断Mask寄存器置1.
void EINT_Group0_GPIO_Disable(unsigned int uEINT_No)
{
   rEINT0MASK |= (1<<uEINT_No);
}

//打开某一个中断,,向中断Mask寄存器置0
void EINT_Group0_GPIO_Enable(unsigned int uEINT_No)
{
   rEINT0MASK &=  ~(0x1<<(uEINT_No));
}

Tiny S3C6410开发板,按键无中断响应,请指点。谢谢