www.pudn.com > armexamples.rar > interrupt.c


#include "def.h" 
#include "option.h" 
#include "2410addr.h" 
#include "2410lib.h" 
#include "2410slib.h"  
#include "interrupt.h" 
 
#include  
#include  
#include  
#include  
#include  
 
void HaltUndef(void); 
void HaltSwi(void); 
void HaltPabort(void); 
void HaltDabort(void); 
 
/******************************************************************** 
// Function name	: Isr_Init 
// Description	    : 中断初始化功能 
// Return type		: void 
// Argument         : void 
*********************************************************************/ 
void Isr_Init(void) 
{ 
    pISR_UNDEF  = (unsigned)HaltUndef; 
    pISR_SWI    = (unsigned)HaltSwi; 
    pISR_PABORT = (unsigned)HaltPabort; 
    pISR_DABORT = (unsigned)HaltDabort; 
     
    rINTMOD     = 0x0;                     //All=IRQ mode 
    rINTMSK     = BIT_ALLMSK;              //All interrupt is masked. 
    rINTSUBMSK  = BIT_SUB_ALLMSK;          //All sub-interrupt is masked. <- April 01, 2002 SOP 
} 
/******************************************************************** 
// Function name	: Isr_Request 
// Description	    : 注册中断函数 
// Return type		: void 
// Argument         : int irq_no 
//                    #define IRQ_EINT0     1 
//                    #define IRQ_EINT1     2 
//                    #define IRQ_EINT2     3 
//                    #define IRQ_EINT3     4 
//                    #define IRQ_EINT4_7   5 
//                    #define IRQ_EINT8_23  6 
//                    #define IRQ_NOTUSED6  7 
//                    #define IRQ_BAT_FLT   8 
//                    #define IRQ_TICK      9 
//                    #define IRQ_WDT       10 
//                    #define IRQ_TIMER0    11 
//                    #define IRQ_TIMER1    12 
//                    #define IRQ_TIMER2    13 
//                    #define IRQ_TIMER3    14 
//                    #define IRQ_TIMER4    15 
//                    #define IRQ_UART2     16 
//                    #define IRQ_LCD       17 
//                    #define IRQ_DMA0      18 
//                    #define IRQ_DMA1      19 
//                    #define IRQ_DMA2      20 
//                    #define IRQ_DMA3      21 
//                    #define IRQ_SDI       22 
//                    #define IRQ_SPI0      23 
//                    #define IRQ_UART1     24 
//                    #define IRQ_NOTUSED24 25 
//                    #define IRQ_USBD      26 
//                    #define IRQ_USBH      27 
//                    #define IRQ_IIC       28 
//                    #define IRQ_UART0     29 
//                    #define IRQ_SPI1      30 
//                    #define IRQ_RTC       31 
//                    #define IRQ_ADC       32 
// Argument         : void* irq_routine 
*********************************************************************/ 
void Irq_Request(int irq_no, void* irq_routine) 
{ 
	if(irq_no >= IRQ_MIN && irq_no <= IRQ_MAX) 
		*(unsigned int*)((irq_no - 1) * sizeof(unsigned int) + (unsigned int)(_ISR_STARTADDRESS+0x20)) = (unsigned int)irq_routine; 
} 
/******************************************************************** 
// Function name	: Irq_Enable 
// Description	    : 开中断 
// Return type		: void 
// Argument         : int irq_no 
*********************************************************************/ 
void Irq_Enable(int irq_no) 
{ 
	if(irq_no >= IRQ_MIN && irq_no <= IRQ_MAX) 
		rINTMSK &= ~(1 << (irq_no - 1)); 
} 
/******************************************************************** 
// Function name	: Irq_Disable 
// Description	    : 关中断 
// Return type		: void 
// Argument         : int irq_no 
*********************************************************************/ 
void Irq_Disable(int irq_no) 
{ 
	if(irq_no >= IRQ_MIN && irq_no <= IRQ_MAX) 
		rINTMSK |= (1 << (irq_no - 1)); 
} 
/******************************************************************** 
// Function name	: Irq_Clear 
// Description	    : 清除中断 
// Return type		: void 
// Argument         : int irq_no 
*********************************************************************/ 
void Irq_Clear(int irq_no) 
{ 
    rSRCPND = (1 << (irq_no - 1));					/*清除RTC中断						*/ 
    rINTPND = (1 << (irq_no - 1)); 
    rINTPND; 
} 
/******************************************************************** 
// Function name	: HaltUndef 
// Description	    : undef异常处理 
// Return type		: void 
// Argument         : void 
*********************************************************************/ 
void HaltUndef(void) 
{ 
    Uart_Printf("Undefined instruction exception.\n"); 
    while(1); 
} 
/******************************************************************** 
// Function name	: HaltSwi 
// Description	    : SWI异常处理 
// Return type		: void 
// Argument         : void 
*********************************************************************/ 
void HaltSwi(void) 
{ 
    Uart_Printf("SWI exception.\n"); 
    while(1); 
} 
/******************************************************************** 
// Function name	: HaltPabort 
// Description	    : Pabort异常处理 
// Return type		: void 
// Argument         : void 
*********************************************************************/ 
void HaltPabort(void) 
{ 
    Uart_Printf("Pabort exception.\n"); 
    while(1); 
} 
/******************************************************************** 
// Function name	: HaltDabort 
// Description	    : Dabort异常处理 
// Return type		: void 
// Argument         : void 
*********************************************************************/ 
void HaltDabort(void) 
{ 
    Uart_Printf("Dabort exception.\n"); 
    while(1); 
}