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

📄 irq.c

📁 用ARM7 LPC2292芯片驱动240128图形点阵液晶的源代码
💻 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 + -