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

📄 lpc_vic.c

📁 深圳优龙公司LPC2148开发板(与iar公司开发板基本相同)的原理图和配套样例程序
💻 C
字号:
/*************************************************************************
 *
 *    Used with ICCARM and AARM.
 *
 *    (c) Copyright IAR Systems 2003
 *
 *    File name   : LPC_Vic.h
 *    Description : Define API for VIC
 *
 *    History :
 *    1. Data: July 8th, 2004
 *  	 Author: Wilson Liu
 *  	 Description: Create the basic function
 *
 *    2. Data: August 4th, 2004
 *  	 Author: Shawn Zhang
 *  	 Description: Clean up the functions. Support nonvector interrupt at first.
 *
 *    3. Data   	 : Oct 11, 2004
 *  	 Author 	 : Stanimir Bonev
 *  	 Description : Modify some function and interface
 *
 *    $Revision: 1.1 $
 **************************************************************************/

#include "LPC_Vic.h"

/*************************************************************************
 * Function Name: VIC_SetProtectionMode
 * Parameters: LPC_Vic_ProtectionMode_t ProtectionType
 * Return: void
 *
 * Description: According to the parameter:- ProtectionType to decide the VIC
 *  			access mode (previledged mode | user or previledged mode).
 *
 *************************************************************************/
void VIC_SetProtectionMode( LPC_Vic_ProtectionMode_t ProtectionType )
{
	VICProtection_bit.PROTECT = ProtectionType;
	return ;
}

/*************************************************************************
 * Function Name: VIC_GetProtectionMode
 * Parameters: void
 * Return: LPC_Vic_ProtectionMode_t
 *
 * Description: Get the VIC access mode (previledged mode | user or previledged mode).
 *
 *************************************************************************/
LPC_Vic_ProtectionMode_t VIC_GetProtectionMode( void )
{
	LPC_Vic_ProtectionMode_t ProtectionType;

	if ( VICProtection & 0x1 )
		ProtectionType = PrivilegedMode;
	else
		ProtectionType = UserandPrivilegedMode;

	return ProtectionType;
}


/*************************************************************************
 * Function Name: VIC_Init
 * Parameters: void
 * Return: void
 *
 * Description: Initialize VIC
 *
 *************************************************************************/
void VIC_Init( void )
{
	// Assign all interrupt chanels to IRQ
	VICIntSelect = 0;
	// Diasable all interrupts
	VICIntEnClear = 0xFFFFFFFF;
	// Clear all software interrutps
	VICSoftIntClear = 0xFFFFFFFF;
	// VIC registers can be accessed in User or privileged mode
	VICProtection = 0;
	// Clear interrupt
	VICVectAddr = 0;
	// Clear address of the Interrupt Service routine (ISR) for non-vectored IRQs.
	VICDefVectAddr = 0;

	// Clear address of the Interrupt Service routine (ISR) for vectored IRQs.
	VICVectAddr0 = \
	VICVectAddr1 = \
	VICVectAddr2 = \
	VICVectAddr3 = \
	VICVectAddr4 = \
	VICVectAddr5 = \
	VICVectAddr6 = \
	VICVectAddr7 = \
	VICVectAddr8 = \
	VICVectAddr9 = \
	VICVectAddr10 = \
	VICVectAddr11 = \
	VICVectAddr12 = \
	VICVectAddr13 = \
	VICVectAddr14 = \
	VICVectAddr15 = 0;

	// Disable all vectored IRQ slots
	VICVectCntl0 = \
	VICVectCntl1 = \
	VICVectCntl2 = \
	VICVectCntl3 = \
	VICVectCntl4 = \
	VICVectCntl5 = \
	VICVectCntl6 = \
	VICVectCntl7 = \
	VICVectCntl8 = \
	VICVectCntl9 = \
	VICVectCntl10 = \
	VICVectCntl11 = \
	VICVectCntl12 = \
	VICVectCntl13 = \
	VICVectCntl14 = \
	VICVectCntl15 = 0;
}

/*************************************************************************
 * Function Name: VIC_GetIRQStatus
 * Parameters: void
 * Return: unsigned int
 *
 * Description: Get IRQ Status of VIC. Return register VICIRQSTATUS's value.
 *  			If some IRQ interrupt request is enabled, then the corresponding
 *		bit of VICIRQSTATUS is set.
 *
 *************************************************************************/
unsigned int VIC_GetIRQStatus( void )
{
	return ( VICIRQStatus );
}

/*************************************************************************
 * Function Name: VIC_GetFIQStatus
 * Parameters: void
 * Return: unsigned int
 *
 * Description: Get FIQ Status of VIC. Return register VICFIQSTATUS's value.
 *  			If some FIQ interrupt request is enabled, then the corresponding
 *		bit of VICFIQSTATUS is set. If more that one interrupt request
 *  			is assigned as FIQ, then invoking this function can decide which
 *  			one or ones is/are the request source(s).
 *
 *************************************************************************/
unsigned int VIC_GetFIQStatus( void )
{
	return ( VICFIQStatus );
}

/*************************************************************************
 * Function Name: VIC_EnableInt
 * Parameters: lpc_uint32 IntType
 * Return: void
 *
 * Description: Enable specific interrupt
 *
 *************************************************************************/
void VIC_EnableInt( unsigned int IntType )
{
	VICIntEnable |= IntType;
}

/*************************************************************************
 * Function Name: VIC_DisableInt
 * Parameters: unsigned int IntType
 * Return: void
 *
 * Description: Disable specific interrupt
 *
 *************************************************************************/
void VIC_DisableInt( unsigned int IntType )
{
	VICIntEnClear |= IntType;
}

/*************************************************************************
 * Function Name: VIC_EnableNonVectoredIRQ
 * Parameters:  pIRQSub - Non Vectored IRQ Sub address
 * Return: void
 *
 * Description:  Set VICDefVectAddr to be the IRQ Sub address.
 *
 *************************************************************************/
void VIC_EnableNonVectoredIRQ( void( *pIRQSub ) () )
{
	VICDefVectAddr = ( unsigned int ) pIRQSub;
}

/*************************************************************************
 * Function Name: VIC_DisableNonVectoredIRQ
 * Parameters: void
 * Return: void
 *
 * Description: set VICDefVectAddr to be reset value (NULL).
 *		
 *************************************************************************/
void VIC_DisableNonVectoredIRQ( void )
{
	VICDefVectAddr = NULL;
}

/*************************************************************************
 * Function Name: VIC_SetVectoredIRQ
 * Parameters:  void(*pIRQSub)()
 *  			LPC_VicIrqSlots_t VicIrqSlot
 *  			unsigned int VicIntSouce
 *
 * Return: void
 *
 * Description:  Init vectored inerrutps
 *
 *************************************************************************/
void VIC_SetVectoredIRQ( void( *pIRQSub ) () , LPC_VicIrqSlots_t VicIrqSlot , unsigned int VicIntSource )
{
	unsigned long volatile * pReg;
	// load base address of vectored address registers
	pReg = &VICVectAddr0;
	// Set Address of callback function to corresponding Slot
	*( pReg + VicIrqSlot ) = ( unsigned long ) pIRQSub;
	// load base address of ctrl registers
	pReg = &VICVectCntl0;
	// Set source chanel and enable the slot
	*( pReg + VicIrqSlot ) = VicIntSource | 0x20;
	// Clear FIQ select bit
	VICIntSelect &= ~( 1 << VicIntSource );
}

⌨️ 快捷键说明

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