📄 lpc_syscontrol.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 + -