S3C2440之中断控制_sed

S3C2440之中断控制_sed_02

如下,ARM管脚配置

S3C2440之中断控制_sed_03

 

概述:中断控制器中的5个寄存器,源挂起寄存器、中断模式寄存器、屏蔽寄存器、优先级寄存器、和中断挂起寄存器

S3C2440之中断控制_sed_04

源挂起寄存器(SRCPEND):该寄存器由32位组成,每一位涉及一个中断,如果中断源产生了中断,则相应的位将被置1,表示某个中断源正在请求中断服务,可以手动清楚该位

S3C2440之中断控制_寄存器_05

中断模式寄存器(INTMOD):用于每个中断源是选择FIQ中断模式,还是IRQ模式

S3C2440之中断控制_S3C2440 中断按键led显示_06

中断屏蔽寄存器(INTMASK):此寄存器由32位组成,每一位涉及一个中断,如果某位设置为1,则CPU不会去服务来自中断的相应,反之将相应

S3C2440之中断控制_S3C2440 中断按键led显示_07

中断优先级寄存器(PRIOPITY):控制中断的优先级,由仲裁器控制中断的顺序。其中REQ0和REQ5的优先级是固定的,REQ1-REQ4可以通过ARB_SELn来改变优先级

S3C2440之中断控制_寄存器_08

仲裁器图如下:

S3C2440之中断控制_寄存器_09

 

中断挂起寄存器(INTPND):该寄存器32位,每一位对应一个中断请求

S3C2440之中断控制_优先级_10

 

中断偏移寄存器(INTOFFSET):功能不了解?????日后再分析

 

次级源挂起寄存器(SUBSRCPND):

 源码如下:

static void __irq Key_ISR(void)
{
U8 key;
U32 r;
int i;
#define OFFSET 5

EnterCritical(&r);
if(rINTPND==BIT_EINT1)
{
Uart_Printf("eint1\n");
ClearPending(BIT_EINT1);
rGPBDAT &= ~(1 << (OFFSET + 1));
Delay(1000);
rGPBDAT |= (1 << (OFFSET + 1));
}
if(rINTPND==BIT_EINT4_7)
{
ClearPending(BIT_EINT4_7);
if(rEINTPEND&(1<<4))
{
Uart_Printf("eint4\n");
rEINTPEND |= 1<< 4;
rGPBDAT &= ~(1 << (OFFSET + 3));
Delay(1000);
rGPBDAT |= (1 << (OFFSET + 3));
}
}
if(rINTPND==BIT_EINT0)
{
Uart_Printf("eint0\n");
ClearPending(BIT_EINT0);
rGPBDAT &= ~(1 << (OFFSET + 0));
Delay(1000);
rGPBDAT |= (1 << (OFFSET + 0));
}
if(rINTPND==BIT_EINT2)
{
Uart_Printf("eint2\n");
ClearPending(BIT_EINT2);
rGPBDAT &= ~(1 << (OFFSET + 2));
Delay(1000);
rGPBDAT |= (1 << (OFFSET + 2));
} key=Key_Scan();
if( key == 0xff )
Uart_Printf( "Interrupt occur... Key is released!\n") ;
else
Uart_Printf( "Interrupt occur... K%d is pressed!\n", key) ; ExitCritical(&r);

rGPBDAT |= 0x0f << (OFFSET);
for (i = 0; i < 4; i++)
{
rGPBDAT |= (0 << (OFFSET + i));
Delay(1000);
rGPBDAT |= (0 << (OFFSET + i));
}

}
void My_Int_Key_Display(void)
{
Uart_Printf("\nMy Interrupt Key Test Begin\n"); //GPIO Pin Configure LED LIGHT
rGPBCON |= 0x15400;//CONFIGURE PINS: SET PB5、PB6、PB7、PB8 OUTPUT
rGPBUP |= 0x1E0; //set pins pull-up //GPIO Pin Configure interrupt;
rGPHCON &= ~(0XAA);
rGPHCON |= 0XAA; //SET FUNCTION EINT0,EINT1,EINT2,EINT3
rGPHUP &= 0x0F; //SET PIN PULL-UP rEXTINT0 |= 0x1111; //SET INTTURRPT HIGH LEVEL

rEINTPEND |= (1<<4); //clear eint 4
rEINTMASK &= ~(1<<4); //enable eint 4
ClearPending(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7);
pISR_EINT0 = pISR_EINT1 = pISR_EINT2 = pISR_EINT4_7 = (U32)Key_ISR;
EnableIrq(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7); while( Uart_GetKey() != ESC_KEY ) ;
DisableIrq(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7);
}
int main(void)
{
My_Int_Key_Display();
}

终端运行结果:

S3C2440之中断控制_寄存器_11