📄 irq.c
字号:
/*****************************************************************************
* irq.c: Interrupt handler C file for Philips LPC288x Family Microprocessors
*
* Copyright(C) 2006, Philips Semiconductor
* All rights reserved.
*
* History
* 2007.02.01 ver 1.00 Prelimnary version, first Release
*
******************************************************************************/
#include "LPC288x.h" /* LPC310X Peripheral Registers */
#include "type.h"
#include "irq.h"
volatile DWORD irqIndex;
/******************************************************************************
** Function name: _IRQ_Handler
**
** Descriptions: Interrupt handler, called in the startup.s file.
**
** parameters: None
** Returned value: None
**
******************************************************************************/
void IRQ_Handler( void ) __irq
{
void (* fptr )();
volatile DWORD *funcptr;
volatile DWORD regVal;
while ( (regVal=INT_PENDING) & 0x3FFFFFFE )
{
funcptr=(volatile DWORD *)INT_VECTOR0;
irqIndex = (DWORD)((DWORD)funcptr & 0xFF) >> 3;
/* fptr would now point to that ISR location */
if ( regVal & (0x01 << irqIndex) )
{
if ( funcptr != NULL )
{
fptr=(void (*)(void))(* funcptr);
fptr();
}
}
}
return;
}
/******************************************************************************
** Function name: FIQ_Exception
**
** Descriptions: Fast interrupt handler, called in the startup.s.
**
** parameters: None
** Returned value: None
**
******************************************************************************/
void FIQ_Handler( void ) __irq
{
while ( 1 );
}
/******************************************************************************
** Function name: init_interrupt
**
** Descriptions: Initialize interrupt controller.
** parameters: None
** Returned value: None
**
******************************************************************************/
void init_interrupt(void)
{
DWORD i;
DWORD *vect_handler, *vect_priority;
/* set all the vector and vector control register to 0 */
for ( i = 0; i < IRQ_SIZE * 2; i+=2 )
{
vect_handler = (DWORD *)(IRQ_TABLE_BASE + i*4);
vect_priority = (DWORD *)(IRQ_TABLE_BASE + (i+1)*4);
*vect_handler = 0x0;
*vect_priority = 0x0;
}
return;
}
/******************************************************************************
** Function name: Install_IRQ
**
** Descriptions: Install interrupt handler
** parameters: Interrupt number, priority, and interrupt handler
** Returned value: TRUE or FALSE
**
******************************************************************************/
DWORD install_IRQ(BYTE IntNum, BYTE Priority, HandlerAddr IRQHandler )
{
DWORD *vect_addr;
if ( (IntNum < 32) && (IRQHandler != (HandlerAddr)NULL) )
{
/* Use the Interrupt source number to index to the ISR address
entry from base address*/
vect_addr=(DWORD *)(IRQ_TABLE_BASE |(IntNum<<3));
*vect_addr = (DWORD)IRQHandler;
vect_addr++;
*vect_addr = Priority;
return( TRUE );
}
else
{
return( FALSE );
}
}
/******************************************************************************
** End Of File
******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -