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

📄 lpc_syscontrol.c

📁 给大家提供一个在inram/exram中调试的示例,在周公的lpc2200上调试过.
💻 C
字号:
/***********************************************************************
 *         BU MMS China, Philips Semiconductor Software Support
 *         Embest info&Tech Co. Software Support
 *---------------------------------------------------------------------------
 * The software is delivered "AS IS" without warranty or condition of any
 * kind, either express, implied or statutory.  Everybody can use it as 
 * it is opened and without copyright. We will not take any law responsibility
 * for any problem produced by using this software.
 *---------------------------------------------------------------------------                                                      
 *    File name: 	LPC_SysControl.c
 *    Description: 	Define API for system control
 *                                                                                      
 *    History:                                                                     
 *    1. Date:		Aug 17, 2004                                              
 *       Author: 	Shawn Zhang                                                    
 *       Description: Create
 *
 *    2. Date:		Nov 05, 2004                                              
 *       Author: 	Shawn Zhang                                                    
 *       Description: Add Pin configuartion and GPIO module
 *
 *	$Revision: 1.0 $
 **********************************************************************/

#include "LPC_SysControl.h"

LPC_SysControl_Config_t SysConfig;

/*************************************************************************
 * Function Name: SYS_Init
 * Parameters: unsigned long Fosc
 *			 unsigned long Fcclk
 * 			LPC_SysControl_VPBDiv_t VPBDivider
 *			LPC_SysControl_RemapMode_t RemapMode
 *			bool MAMEnable
 *			LPC_SysControl_MAMConfig_t *pMAMConfig
 *
 * Return: int 
 *             	0: success
 *			non-zero: error number
 *
 * Description: Initialize the whole system, setting MEMMAP, VPB, whether enable PLL,
 *			 whether enable MAM
 *  
 *************************************************************************/
int SYS_Init (unsigned long Fosc, unsigned long Fcclk, 
					LPC_VPBDiv_t VPBDivider, 
					LPC_RemapMode_t RemapMode,
					LPC_MAMSetting_t MAMSetting, 
					LPC_MAMConfig_t *pMAMConfig)
{
	unsigned long M, P_min, P_max, P, i;
	int Pflag = 0, PLLflag = 0;
	
	// Check vaild
	if ( Fosc<Fosc_MIN || Fosc>Fosc_MAX)
		return 1;
	if ( Fcclk<Fcclk_MIN || Fcclk>Fcclk_MAX)
		return 1;

	if (Fcclk < Fosc)
		return 1;
	else if (Fcclk > Fosc)
	{
		// Calculate PLL's value M & P if need
		M = Fcclk / Fosc;
		P_min = Fcco_MIN / (2*Fcclk) + 1;
		P_max = Fcco_MAX / (2*Fcclk);
		for (i=P_min; i<=P_max; i++)
		{
			if ((i ==1) || (i==2) ||(i==4) || (i==8))
			{
				P=i;
				Pflag = 1;
				break;
			}
		}
		if (!Pflag)
			return 1;

		PLLflag = 1;
	}

	// Set globe variable 
	SysConfig.Fosc = Fosc;
	SysConfig.Fcclk = Fcclk;
	switch(VPBDivider)
	{
		case VPBDIV4:
			SysConfig.Fpclk= Fcclk / 4;
			break;
		case VPBDIV1:
			SysConfig.Fpclk= Fcclk;
			break;	
		case VPBDIV2:
			SysConfig.Fpclk= Fcclk / 2;
			break;
		default:
			return 1;
	}
	SysConfig.VPBDivider = VPBDivider;
	SysConfig.RemapMode = RemapMode;

	SysConfig.MAMSetting = MAMSetting;

	// Configure corresponding registers
	// Do PLL
	if (PLLflag)
	{
		PLLCFG = (M - 1) & 0x1F;			// Set M & P
		switch(P)
		{
			case 1:
				break;
			case 2:
				PLLCFG |= (0x1<<5);
				break;
			case 4:
				PLLCFG |= (0x2<<5);
				break;
			case 8:
				PLLCFG |= (0x3<<5);
				break;
			default:
				return 1;
		}

		PLLCON |= (1<<PLLCON_ENABLE_BIT);	// Enable PLL
		PLLFEED = PLLFEED_DATA1;
		PLLFEED = PLLFEED_DATA2;

		while (!(PLLSTAT & (1<<PLLSTAT_LOCK_BIT)));	// Wait PLL lock

		PLLCON |= (1<<PLLCON_CONNECT_BIT);	// Connect PLL
		PLLFEED = PLLFEED_DATA1;
		PLLFEED = PLLFEED_DATA2;
	}
	else
	{
		PLLCON = 0;
	}

	// Do VPB
	VPBDIV = VPBDivider;

	// Do MAM
	switch(MAMSetting)
	{
		case MAMDisable:
			MAMCR = 0;
			break;
		case MAMManual:
			MAMCR = pMAMConfig->Mode & 0x3;
			MAMTIM = pMAMConfig->Cycle & 0x7;
			break;
		case MAMAuto:
			pMAMConfig->Mode = MAM_FULL;
			if (Fcclk <= 20000000)
				pMAMConfig->Cycle = MAMCycle1;
			else if (Fcclk > 20000000 && Fcclk <= 40000000)
				pMAMConfig->Cycle = MAMCycle2;
			else
				pMAMConfig->Cycle = MAMCycle3;
			
			MAMCR = pMAMConfig->Mode & 0x3;
			MAMTIM = pMAMConfig->Cycle & 0x7;
			break;
	}

	// Do MEMAMP
	MEMMAP = SysConfig.RemapMode & 0x3;

	return 0;
}

/*************************************************************************
 * Function Name: SYS_GetFpclk
 * Parameters: void
 * Return: int 
 *             	0: success
 *			non-zero: error number
 * Description: Get Fpclk
 *  
 *************************************************************************/
lpc_uint32 SYS_GetFpclk (void)
{
	return SysConfig.Fpclk;
}

/*************************************************************************
 * Function Name: SYS_GetFcclk
 * Parameters: void
 * Return: int 
 *             	0: success
 *			non-zero: error number
 * Description: Get Fpclk
 *  
 *************************************************************************/
lpc_uint32 SYS_GetFcclk (void)
{
	return SysConfig.Fcclk;
}

/*************************************************************************
 * Function Name: PM_SetMode
 * Parameters: LPC_SysControl_PMMode_t Mode -- PM_STANDARD ,PM_IDLE or PM_POWERDOWN
 * Return: void 
 * Description: Set power manage mode
 *  
 *************************************************************************/
void PM_SetMode (LPC_PMMode_t Mode)
{
	PCON = Mode & 0x3;
}

/*************************************************************************
 * Function Name: PM_OpenPeripheral
 * Parameters: lpc_uint32 DevType
 * Return: void 
 * Description: Open specifical peripheral
 *  
 *************************************************************************/
void PM_OpenPeripheral (lpc_uint32 DevType)
{
	PCONP |= DevType;
}

/*************************************************************************
 * Function Name: PM_ClosePeripheral
 * Parameters: lpc_uint32 DevType
 * Return: void 
 * Description: Close specifical peripheral
 *  
 *************************************************************************/
void PM_ClosePeripheral (lpc_uint32 DevType)
{
	PCONP &= (~DevType);
}

/*************************************************************************
 * Function Name: EXTINT_Enable
 * Parameters: 	LPC_EXTINT_Channel_t ExtIntNum
 * Return: void 
 * Description: Enable External Interrupt
 *  
 *************************************************************************/
void EXTINT_Enable (LPC_EXTINT_Channel_t ExtIntNum)
{
	EXTINT |= (1<<ExtIntNum);
}

/*************************************************************************
 * Function Name: EXTINT_Disable
 * Parameters: 	LPC_EXTINT_Channel_t ExtIntNum
 * Return: void 
 * Description: Enable External Interrupt
 *  
 *************************************************************************/
void EXTINT_Disable (LPC_EXTINT_Channel_t ExtIntNum)
{
	EXTINT &= ~(1<<ExtIntNum);
}

/*************************************************************************
 * Function Name: EXTINT_EnableWakeup
 * Parameters: 	LPC_EXTINT_Channel_t ExtIntNum
 * Return: void 
 * Description: Enable External Interrupt wake up CPU when CPU is power down
 *  
 *************************************************************************/
void EXTINT_EnableWakeup (LPC_EXTINT_Channel_t ExtIntNum)
{
	EXTWAKE |= (1<<ExtIntNum);
}

/*************************************************************************
 * Function Name: EXTINT_DisableWakeup
 * Parameters: 	LPC_EXTINT_Channel_t ExtIntNum
 * Return: void 
 * Description: Disable External Interrupt wake up CPU when CPU is power down
 *  
 *************************************************************************/
void EXTINT_DisableWakeup (LPC_EXTINT_Channel_t ExtIntNum)
{
	EXTWAKE &= ~(1<<ExtIntNum);
}

/*************************************************************************
 * Function Name: EXTINT_SetTriggerType
 * Parameters: 	LPC_EXTINT_Channel_t ExtIntNum
 *			 	LPC_EXTINTTriggerType_t TriggerType
 *
 * Return: void 
 * Description: Set External Interrupt trigger type
 *  
 *************************************************************************/
void EXTINT_SetTriggerType (LPC_EXTINT_Channel_t ExtIntNum, LPC_EXTINTTriggerType_t TriggerType)
{
	switch (TriggerType)
	{
		case LEVEL_LOW:
			EXTMODE &= ~(1<<ExtIntNum);
			EXTPOLAR &= ~(1<<ExtIntNum);
			break;
			
		case  LEVEL_HIGH:
			EXTMODE &= ~(1<<ExtIntNum);
			EXTPOLAR |= (1<<ExtIntNum);
			break;

		case  EDGE_RISING:
			EXTMODE |= (1<<ExtIntNum);
			EXTPOLAR |= (1<<ExtIntNum);
			break;

		case  EDGE_FALLING:
			EXTMODE |= (1<<ExtIntNum);
			EXTPOLAR &= ~(1<<ExtIntNum);
			break;		
	}
}

/*************************************************************************
 * Function Name: EXTINT_ClearInt
 * Parameters: 	LPC_EXTINT_Channel_t ExtIntNum
 * Return: void 
 * Description: Clear External Interrupt
 *  
 *************************************************************************/
void EXTINT_ClearInt (LPC_EXTINT_Channel_t ExtIntNum)
{
	while( EXTINT & (1<<ExtIntNum))
		EXTINT |= (1<<ExtIntNum);
}

/*************************************************************************
 * Function Name: GPIO_SetDirectionMode
 * Parameters: 	LPC_GPIO_Channel_t DevNum
 *			 	unsigned long PortNum	-- allow OR opration
 *				LPC_GPIO_DirectionMode_t DirectionMode
 * Return: int 
 *             	0: success
 *			non-zero: error number
 * Description: Set direction mode for GPIO port
 *
 * NOTE:		Only these ports as below is effective.
 * 			P0 -- P0.0~P0.25, P0.27~P0.30
 *			P1 -- P1.16~P1.31
 *			P2 -- P2.0~P2.31
 *			P3 -- P3.0~P3.31
 *************************************************************************/
int GPIO_SetDirectionMode (LPC_GPIO_Channel_t DevNum, unsigned long PortNum, 
	LPC_GPIO_DirectionMode_t DirectionMode)
{
	switch (DevNum)
	{
		case GPIO0:
			if (DirectionMode) // output
				IODIR0 |= PortNum;
			else		// input
				IODIR0 &= ~PortNum;
			break;
		case GPIO1:
			if (DirectionMode) // output
				IODIR1 |= PortNum;
			else		// input
				IODIR1 &= ~PortNum;
			break;
		case GPIO2:
			if (DirectionMode) // output
				IODIR2 |= PortNum;
			else		// input
				IODIR2 &= ~PortNum;
			break;
		case GPIO3:
			if (DirectionMode) // output
				IODIR3 |= PortNum;
			else		// input
				IODIR3 &= ~PortNum;
			break;
		default:
			return 1;
	}
	return 0;
}

/*************************************************************************
 * Function Name: GPIO_TurnOn
 * Parameters: 	LPC_GPIO_Channel_t DevNum
 *			 	unsigned long  PortNum	-- allow OR opration
 * Return: int 
 *             	0: success
 *			non-zero: error number
 * Description: Open corresponding GPIO port(s)
 *
 * NOTE:		Only these ports as below is effective.
 * 			P0 -- P0.0~P0.25, P0.27~P0.30
 *			P1 -- P1.16~P1.31
 *			P2 -- P2.0~P2.31
 *			P3 -- P3.0~P3.31
 *************************************************************************/
int GPIO_TurnOn (LPC_GPIO_Channel_t DevNum, unsigned long PortNum)
{
	switch (DevNum)
	{
		case GPIO0:
			IOSET0 |= PortNum;
			break;
			
		case GPIO1:
			IOSET1 |= PortNum;
			break;
			
		case GPIO2:
			IOSET2 |= PortNum;
			break;
			
		case GPIO3:
			IOSET3 |= PortNum;
			break;
			
		default:
			return 1;
	}
	return 0;
}

/*************************************************************************
 * Function Name: GPIO_TurnOff
 * Parameters: 	LPC_GPIO_Channel_t DevNum
 *			 	unsigned long  PortNum	-- allow OR opration
 * Return: int 
 *             	0: success
 *			non-zero: error number
 * Description: Close corresponding GPIO port(s)
 *
 * NOTE:		Only these ports as below is effective.
 * 			P0 -- P0.0~P0.25, P0.27~P0.30
 *			P1 -- P1.16~P1.31
 *			P2 -- P2.0~P2.31
 *			P3 -- P3.0~P3.31
 *************************************************************************/
int GPIO_TurnOff (LPC_GPIO_Channel_t DevNum, unsigned long PortNum)
{
	switch (DevNum)
	{
		case GPIO0:
			IOCLR0 |= PortNum;
			break;
			
		case GPIO1:
			IOCLR1 |= PortNum;
			break;
			
		case GPIO2:
			IOCLR2 |= PortNum;
			break;
			
		case GPIO3:
			IOCLR3 |= PortNum;
			break;
			
		default:
			return 1;
	}
	return 0;
}

/*************************************************************************
 * Function Name: GPIO_CheckOn
 * Parameters: 	LPC_GPIO_Channel_t DevNum
 *			 	unsigned long  PortNum	-- allow OR opration
 * Return: bool 
 *             	true: On, means 1
 *			false: Off, means 0
 * Description: Return if GPIO port(s) is on
 *
 * NOTE:		Only these ports as below is effective.
 * 			P0 -- P0.0~P0.25, P0.27~P0.30
 *			P1 -- P1.16~P1.31
 *			P2 -- P2.0~P2.31
 *			P3 -- P3.0~P3.31
 *************************************************************************/
bool GPIO_CheckOn (LPC_GPIO_Channel_t DevNum, unsigned long PortNum)
{
	switch (DevNum)
	{
		case GPIO0:
			if (IOPIN0 & PortNum)
				return true;
			else
				return false;

		case GPIO1:
			if (IOPIN1 & PortNum)
				return true;
			else
				return false;
			
		case GPIO2:
			if (IOPIN2 & PortNum)
				return true;
			else
				return false;
			
		case GPIO3:
			if (IOPIN3 & PortNum)
				return true;
			else
				return false;
	}
	
	return false;
}


/*************************************************************************
 * Function Name: SWI_Handler
 * Parameters: 	int swi_num
 *			 	int * regs
 * Return: void 
 * Description: C SWI exception subroutine, handle some system callback
 *
 *************************************************************************/
/*
void SWI_Exception( int swi_num, int *regs )
{
	unsigned long tmp, flag;

	switch( swi_num )
	{
		case SWI_DISINT:
			    	__asm
			    	{
			    		MRS flag, SPSR
					    MRS tmp, SPSR
			        	ORR tmp, tmp, #IRQ_FLAG
			        	MSR SPSR_c, tmp
			    	}
				regs[0] = flag;
				break;
		case SWI_RESTORE:
				flag = regs[0];
			    	__asm
    				{
				       MSR SPSR_c, flag
    				}
				break;

	}
} 
*/

⌨️ 快捷键说明

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