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

📄 irq.c

📁 lpc2148 uc/gui的移植例程
💻 C
字号:
/*****************************************************************************
 *                       中断服务程序设置
******************************************************************************/
#include "define.h"			

#if   INTERRPUT_EN
/******************************************************************************
** 函数名:		DefaultVICHandler
**
** 函数功能:		默认的VIC中断处理,用于处理伪中断.
**				    如果中断服务程序读VICaddress 寄存器, 而IRQ slot 响应如下描述将返回这个地址.
** 入口参数:		
** 出口参数:		
** 
******************************************************************************/
void DefaultVICHandler (void) __irq
{
    /*如果IRQ没有装入VIC, 而中断产生,这个默认的VIC address 将会北使用. 这将会产生无限循环. 
	在调试中用这个死循环进行调试跟踪. */
    VICVectAddr = 0;
    while ( 1 );
}

/******************************************************************************
** 函数名   :		init_VIC
**
** 功能描述:	初始化VIC interrupt 控制器.
** 
******************************************************************************/
void init_VIC(void) 
{
    uint8 i = 0;
    uint32 *vect_addr, *vect_cntl;
   	
    /* 初始化 VIC*/
    VICIntEnClr = 0xffffffff;		 /*清所有中断*/
    VICVectAddr = 0;
    VICIntSelect = 0;

    /*设置所有中断向量为0 */
    for ( i = 0; i < VIC_SIZE; i++ )
    {
	vect_addr = (uint32 *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + i*4);
	vect_cntl = (uint32 *)(VIC_BASE_ADDR + VECT_CNTL_INDEX + i*4);
	*vect_addr = 0;	
	*vect_cntl = 0;
    }

    /* 装入默认的中断处理地址*/
    VICDefVectAddr = (uint32*)DefaultVICHandler;   
}

/******************************************************************************
** 函数名:		install_irq
**
** 功能描述:	装入中断处理,最大数目为16, 但这里有32个中断功能. 所以不能同时装入所有服务.
**				对中断请求的规则是先发生服务
** 入口参数:			中断号和中断服务地址
** 出口参数:	0或者1
** 
******************************************************************************/
boolen install_irq( uint8 IntNumber, void *HandlerAddr )
{
    uint8 i;
    uint32 *vect_addr;
    uint32 *vect_cntl;
      
    VICIntEnClr = 1 << IntNumber;	/* 禁止中断 */
    
    for ( i = 0; i < VIC_SIZE; i++ )
    {
	/* 找出第一个未分配服务地址 */

	vect_addr = (uint32 *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + i*4);
	vect_cntl = (uint32 *)(VIC_BASE_ADDR + VECT_CNTL_INDEX + i*4);
	if ( *vect_addr == (uint32)NULL )
	{
	    *vect_addr = (uint32)HandlerAddr;	/* 设置中断向量 */
	    *vect_cntl = (uint32)(IRQ_SLOT_EN | IntNumber);
	    break;
	}
    }
    if ( i == VIC_SIZE )
    {
	return( FALSE );		/* 没有空的vector slot */
    }
    VICIntEnable = 1 << IntNumber;	/* 使能Interrupt */
    return( TRUE );
}

/******************************************************************************
** 函数名:		uninstall_irq
**
** 功能描述:	卸载中断处理
**				通过中断号找到该服务地址, 并设置为空来实现卸载.
** 入口参数:	中断号
**出口参数:		0、1成功与否
** 
******************************************************************************/
boolen uninstall_irq( uint8 IntNumber )
{
    uint8 i;
    uint32 *vect_addr;
    uint32 *vect_cntl;
      
    VICIntEnClr = 1 << IntNumber;
    
    for ( i = 0; i < VIC_SIZE; i++ )
    {
	/* 找到第一个未分配的VIC address  */
	vect_addr = (uint32 *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + i*4);
	vect_cntl = (uint32 *)(VIC_BASE_ADDR + VECT_CNTL_INDEX + i*4);
	if ( (*vect_cntl & ~IRQ_SLOT_EN ) == IntNumber )
	{
	    *vect_addr = (uint32)NULL;	/* 清VIC地址 */
	    *vect_cntl &= ~IRQ_SLOT_EN;	/*清使能位 */	
	    break;
	}
    }
    if ( i == VIC_SIZE )
    {
	return( FALSE );		
    }
    VICIntEnable = 1 << IntNumber;
    return( TRUE );
}

#endif
/******************************************************************************
**                            End Of File
******************************************************************************/

⌨️ 快捷键说明

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