📄 irq.c
字号:
//========================================================================//
// 文件名: irq.c
// 作 者: xinqiang Zhang(小丑) (email: xinqiang@Mzdesign.com.cn)
// 日 期: 2008/01/03
// 描 述: VIC irq的一些初始代码
//
// 参 考: Copyright(C) 2006, Philips Semiconductor irq
// 版 本:
// 2008/01/03 First version Mz Design
//========================================================================//
#include "LPC22XX.h" // LPC22XX Peripheral Registers
#include "type.h"
#include "irq.h"
//========================================================================//
// 函数: void DefaultVICHandler (void)
// 描述: 默认的VIC中断服务程序,仅仅定义而已,无实际意义
// 参数: 无
// 返回: 无
// 备注:
// 版本:
// 2008/01/03 First version
//========================================================================//
void DefaultVICHandler (void) __irq
{
//if the IRQ is not installed into the VIC, and interrupt occurs, the
//default interrupt VIC address will be used. This could happen in a race
//condition. For debugging, use this endless loop to trace back.
// For more details, see Philips appnote AN10414
VICVectAddr = 0; // Acknowledge Interrupt
while ( 1 );
}
//========================================================================//
// 函数: void init_VIC(void)
// 描述: 初始化VIC中断向量
// 参数: 无
// 返回: 无
// 备注:
// 版本:
// 2008/01/03 First version
//========================================================================//
void init_VIC(void)
{
DWORD i = 0;
DWORD *vect_addr, *vect_cntl;
// initialize VIC
VICIntEnClr = 0xffffffff;
VICVectAddr = 0;
VICIntSelect = 0;
// set all the vector and vector control register to 0
for ( i = 0; i < VIC_SIZE; i++ )
{
vect_addr = (DWORD *)(VIC_BASE_ADDR/*VICIRQStatus*/ + VECT_ADDR_INDEX + i*4);
vect_cntl = (DWORD *)(VIC_BASE_ADDR/*VICIRQStatus*/ + VECT_CNTL_INDEX + i*4);
*vect_addr = 0;
*vect_cntl = 0;
}
// Install the default VIC handler here
VICDefVectAddr = (DWORD)DefaultVICHandler;
return;
}
//========================================================================//
// 函数: DWORD install_irq( DWORD IntNumber, void *HandlerAddr )
// 描述: 装载VIC中断
// 参数: IntNumber VIC中断号
// HandlerAddr 中断服务程序入口地址
// 返回: FLASE 装载失败
// TRUE 装载成功
// 备注: VIC中断最多为16个,但总共有32个中断源在MCU当中,并不是所有的中断源
// 都可以同时装载在当前的VIC中断当中进行服务。
// 版本:
// 2008/01/03 First version
//========================================================================//
DWORD install_irq( DWORD IntNumber, void *HandlerAddr )
{
DWORD i;
DWORD *vect_addr;
DWORD *vect_cntl;
VICIntEnClr = 1 << IntNumber; // Disable Interrupt
for ( i = 0; i < VIC_SIZE; i++ )
{
// find first un-assigned VIC address for the handler
vect_addr = (DWORD *)(VIC_BASE_ADDR/*VICIRQStatus*/ + VECT_ADDR_INDEX + i*4);
vect_cntl = (DWORD *)(VIC_BASE_ADDR/*VICIRQStatus*/ + VECT_CNTL_INDEX + i*4);
if ( *vect_addr == (DWORD)NULL )
{
*vect_addr = (DWORD)HandlerAddr; // set interrupt vector
*vect_cntl = (DWORD)(IRQ_SLOT_EN | IntNumber);
break;
}
}
if ( i == VIC_SIZE )
{
return( FALSE ); // fatal error, can't find empty vector slot
}
VICIntEnable = 1 << IntNumber; // Enable Interrupt
return( TRUE );
}
//========================================================================//
// 函数: DWORD uninstall_irq( DWORD IntNumber )
// 描述: 卸载VIC中断
// 参数: IntNumber VIC中断号
// 返回: FLASE 卸载失败
// TRUE 卸载成功
// 备注:
// 版本:
// 2008/01/03 First version
//========================================================================//
DWORD uninstall_irq( DWORD IntNumber )
{
DWORD i;
DWORD *vect_addr;
DWORD *vect_cntl;
VICIntEnClr = 1 << IntNumber; // Disable Interrupt
for ( i = 0; i < VIC_SIZE; i++ )
{
// find first un-assigned VIC address for the handler
vect_addr = (DWORD *)(VICIRQStatus + VECT_ADDR_INDEX + i*4);
vect_cntl = (DWORD *)(VICIRQStatus + VECT_CNTL_INDEX + i*4);
if ( (*vect_cntl & ~IRQ_SLOT_EN ) == IntNumber )
{
*vect_addr = (DWORD)NULL; // clear the VIC entry in the VIC table
*vect_cntl &= ~IRQ_SLOT_EN; // disable SLOT_EN bit
break;
}
}
if ( i == VIC_SIZE )
{
return( FALSE ); // fatal error, can't find interrupt number
//in vector slot
}
VICIntEnable = 1 << IntNumber; // Enable Interrupt
return( TRUE );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -