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

📄 isr.c

📁 S3C4510B的一些开发例程
💻 C
字号:
/***********************************************************************
 *  MODULE:        isr.c     
 *  Description:   Interrupt utility codes in C
 *  Runtime Env:   ARM7TDMI
 *  Company:       
 *  Change History:
 *     05-20-02   Create (Yadong Wang)
 ***********************************************************************/
#include <stdio.h>
#include "common_types.h"
#include "samsung4510.h"
#include "main.h"


static volatile tU32  IntOffSet;
static void DummyIsr(void) {}
static void (*InterruptHandlers[MAXHNDLRS])(void);


void InitInterrupt(void) 
{
	REG32 i;

    INTMASK = 0x3fffff; // All interrupt disabled include global bit
    INTPEND = 0x1fffff; // All clear pending
    INTMODE = 0x020000; // Ethernet Rx in FIQ, all other in IRQ

    /* 
     * Interrupt Priority Reset value. Need to be changed priority,
     * Set interrupt priority register. In this case, Global interrupt
     * mask bit must be disabled.
     *
     */ 
    //INTPRI0 = 0x03020100;  
    //INTPRI1 = 0x07060504;
    //INTPRI2 = 0x0b0a0908;
    //INTPRI3 = 0x0f0e0d0c;
    //INTPRI4 = 0x13121110;
    //INTPRI5 = 0x00000014;
    //INTOFFSET =  Read Only Register

	// Install default IRQ handler
	for (i = 0; i < MAXHNDLRS; i++)
    		InterruptHandlers[i] = DummyIsr;
}


void SysSetInterrupt(REG32 vector, void (*handler)())
{
	InterruptHandlers[vector] = handler;
}


void ISR_IrqHandler(void)
{
	IntOffSet = (U32)INTOFFSET;
	Clear_PendingBit(IntOffSet>>2) ;
	(*InterruptHandlers[IntOffSet>>2])(); 
}


void ISR_FiqHandler(void)
{
	IntOffSet = (U32)INTOFFSET;
	Clear_PendingBit(IntOffSet>>2) ;
	(*InterruptHandlers[IntOffSet>>2])(); // Call interrupt service routine
}


void ISR_UndefHandler(tU32 adr)
{
	tS8 s[80];
	Print("\n** Trap : Undefined Handler\n") ;
	sprintf(s, "\rUndefined Address : %lx ", adr);
	Print(s);
	sprintf(s, "\rUndefined Data : %lx ",*((tU32 *)adr));
	Print(s);
	IOPMOD = 0x0000FFFF;
	while(1)
	{              
		IOPDATA |= 0x00000002;
		IOPDATA &= !0x00000002;
	}
}

void ISR_PrefetchHandler(tU32 adr)
{
	tS8 s[80];
	Print("\n** Trap : Prefetch Handler\n") ;
	sprintf(s, "\rPrefetch Abort Address : %lx ", adr);
	Print(s);
	sprintf(s, "\rPrefetch Abort Data : %lx ",*((tU32 *)adr));
	Print(s);
	IOPMOD = 0x0000FFFF;
	while(1)
	{              
		IOPDATA |= 0x00000004;
		IOPDATA &= !0x00000004;
	}
}

void ISR_AbortHandler(tU32 adr)
{
	tS8 s[80];
	Print("\n** Trap : Data Abort Handler\n") ;
	sprintf(s, "\rData Abort Address : %08lx ",adr);
	Print(s);
	sprintf(s, "\rData Abort Data : %08lx ",*((tU32*)adr));
	Print(s);
	IOPMOD = 0x0000FFFF;
	while(1)
	{              
		IOPDATA |= 0x00000008;
		IOPDATA &= !0x00000008;
	}
}

void ISR_SwiHandler(void)
{
	IOPMOD = 0x0000FFFF;
	while(1)
	{              
		IOPDATA |= 0x00000010;
		IOPDATA &= !0x00000010;
	}
	Print("\r** Trap : SWI Handler\n") ;
}








⌨️ 快捷键说明

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