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

📄 interrupt.c

📁 S3C2410的bootloader
💻 C
字号:
#include <string.h>
#include "def.h"
#include "option.h"
#include "2410addr.h"
#include "2410lib.h"
#include "2410slib.h" 

static char IntMode='3';

static void __irq Eint0Int()
{
	ClearPending(BIT_EINT0);
	Uart_Printf("EINT0 interrupt is occurred.\n");	
}

static void __irq Eint2Int()
{
	ClearPending(BIT_EINT2);
	Uart_Printf("EINT2 interrupt is occurred.\n");
}

static void __irq Eint11_19()
{
	if(rEINTPEND==(1<<11))
	{
		Uart_Printf("EINT11 interrupt is occurred.\n");
		rEINTPEND=(1<<11);
	}
	else if(rEINTPEND==(1<<19))
	{
		Uart_Printf("EINT19 interrupt is occurred.\n");
		rEINTPEND=(1<<19);
	}
	else
	{
		Uart_Printf("rEINTPEND=0x%x\n",rEINTPEND);
		rEINTPEND=(1<<19)|(1<<11);
	}
	ClearPending(BIT_EINT8_23);	
}

static void __irq RxInt()
{
	rSUBSRCPND = BIT_SUB_RXD0;          //Clear pending bit (Requested)
	//rSUBSRCPND;
	ClearPending(BIT_UART0);
}

void InterruptInit()
{

	rGPFCON = (rGPFCON & 0xffcc)|(1<<5)|(1<<1);		//PF0/2 = EINT0/2
	rGPGCON = (rGPGCON & 0xff3fff3f)|(1<<23)|(1<<7);	//PG3/11 = EINT11/19

	switch(IntMode)
	{
		case '1':
			rEXTINT0 = (rEXTINT0 & ~((7<<8)  | (0x7<<0))) | 0x0<<8 | 0x0<<0; //EINT0/2=low level triggered
			rEXTINT1 = (rEXTINT1 & ~(7<<12)) | 0x0<<12; //EINT11=low level triggered
			rEXTINT2 = (rEXTINT2 & ~(7<<12)) | 0x0<<12; //EINT19=low level triggered
			break;
		case '2':
			rEXTINT0 = (rEXTINT0 & ~((7<<8)  | (0x7<<0))) | 0x1<<8 | 0x1<<0; //EINT0/2=high level triggered
			rEXTINT1 = (rEXTINT1 & ~(7<<12)) | 0x1<<12; //EINT11=high level triggered
			rEXTINT2 = (rEXTINT2 & ~(7<<12)) | 0x1<<12; //EINT19=high level triggered
			break;
		case '3':
			rEXTINT0 = (rEXTINT0 & ~((7<<8)  | (0x7<<0))) | 0x2<<8 | 0x2<<0; //EINT0/2=falling edge triggered
			rEXTINT1 = (rEXTINT1 & ~(7<<12)) | 0x2<<12; //EINT11=falling edge triggered
			rEXTINT2 = (rEXTINT2 & ~(7<<12)) | 0x2<<12; //EINT19=falling edge triggered
			break;
		case '4':
			rEXTINT0 = (rEXTINT0 & ~((7<<8)  | (0x7<<0))) | 0x4<<8 | 0x4<<0; //EINT0/2=rising edge triggered
			rEXTINT1 = (rEXTINT1 & ~(7<<12)) | 0x4<<12; //EINT11=rising edge triggered
			rEXTINT2 = (rEXTINT2 & ~(7<<12)) | 0x4<<12; //EINT19=rising edge triggered
			break;
		case '5':
			rEXTINT0 = (rEXTINT0 & ~((7<<8)  | (0x7<<0))) | 0x6<<8 | 0x6<<0; //EINT0/2=both edge triggered
			rEXTINT1 = (rEXTINT1 & ~(7<<12)) | 0x6<<12; //EINT11=both edge triggered
			rEXTINT2 = (rEXTINT2 & ~(7<<12)) | 0x6<<12; //EINT19=both edge triggered
			break;
    		default:
    			break;
    	}
	
	pISR_EINT0=(U32)Eint0Int;
  	pISR_EINT2=(U32)Eint2Int;
	pISR_EINT8_23=(U32)Eint11_19;
	pISR_UART0=(U32)RxInt;	            //pISR_FIQ,pISR_IRQ must be initialized


	rEINTPEND = 0xffffff;
	rSRCPND = BIT_EINT0|BIT_EINT2|BIT_EINT8_23; //to clear the previous pending states
	rINTPND = BIT_EINT0|BIT_EINT2|BIT_EINT8_23;

	rEINTMASK=~( (1<<11)|(1<<19) );
	rINTMSK=~(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);

	//rINTMSK&=0xfffffff0;
	//rEINTMASK&=0xf7f7ff;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -