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开发板,按键无中断响应,请指点。谢谢