📄 lpc_syscontrol.c
字号:
/*************************************************************************
使用IAR EW4.4平台编译: LPC214X的PLL频率,系统频率及外部中断初始化模块文件
**************************************************************************/
#include "LPC_SysControl.h"
LPC_Syscontrol_Config_t SysConfig;
/*************************************************************************
* 函数功能: 初始化内核频率, VPB频率, 内存重映射(remap)
* 函数名: SYS_Init
* 输入参数:
* Int32U Fosc(晶振频率)
* Int32U Fcclk(内核CPU频率)
* LPC_SysControl_VPBDiv_t VPBDivider(VPB分频系数)
* LPC_SysControl_RemapMode_t RemapMode(程序在内存中重映射: 映射到RAM或ROM或boot block)
* Int32U PortDir0(设置P0.0-P0.31的I/O方向)
* Int32U Port0(设置P0.0-P0.31的初始值)
* Int32U PortDir1(设置P1.16-P1.31的I/O方向)
* Int32U Port1(设置P1.0-P1.31的初始值)
*
* 返回: int
* 0: 初始化成功
* 非0: 初始化错误编号
*
*************************************************************************/
Int32S SYS_Init (Int32U Fosc, Int32U Fcclk,
LPC_SysControl_VPBDiv_t VPBDivider,
LPC_SysControl_RemapMode_t RemapMode,
Int32U PortDir0, Int32U Port0,
Int32U PortDir1, Int32U Port1)
{
Int32U M, P_min, P_max, P, i;
Int32S Pflag = 0, PLLflag = 0;
register unsigned int temp;
for (temp=0; temp < 1000; ++temp)
temp++;
// 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;
// Do PLL
if (PLLflag)
{
PLLCFG_bit.MSEL = M-1; // Set M & P
switch(P)
{
case 1:
PLLCFG_bit.PSEL = 0;
break;
case 2:
PLLCFG_bit.PSEL = 0x1;
break;
case 4:
PLLCFG_bit.PSEL = 0x2;
break;
case 8:
PLLCFG_bit.PSEL = 0x3;
break;
default:
return 1;
}
PLLCON_bit.PLLE = true; // Enable PLL
// Interrups must be disble
PLLFEED = PLLFEED_DATA1;
PLLFEED = PLLFEED_DATA2;
while (!PLLSTAT_bit.PLOCK); // Wait PLL lock
PLLCON_bit.PLLC = true; // Connect PLL
PLLFEED = PLLFEED_DATA1;
PLLFEED = PLLFEED_DATA2;
}
else
{
PLLCON_bit.PLLC = false;
PLLCON_bit.PLLE = false;
PLLFEED = PLLFEED_DATA1;
PLLFEED = PLLFEED_DATA2;
}
// Do VPB
VPBDIV_bit.VPBDIV = VPBDivider;
// Do MEMAMP
MEMMAP_bit.MAP = SysConfig.RemapMode;
// Set GIO
PINSEL0 = PINSEL1 = 0;
IO0SET = Port0;
IO0CLR = ~Port0;
IO0DIR = PortDir0;
IO1SET = Port1;
IO1CLR = ~Port1;
IO1DIR = PortDir1;
return 0;
}
/*************************************************************************
* 函数名: SYS_GetFpclk
* 输入参数: 无
* 返回: int
* 0: success
* non-zero: error number
* Description: Get Fpclk
*
*************************************************************************/
Int32U SYS_GetFpclk (void)
{
return SysConfig.Fpclk;
}
/*************************************************************************
* 函数名: PM_SetMode
* 输入参数: LPC_SysControl_PMMode_t Mode -- PM_STANDARD ,PM_IDLE or PM_POWERDOWN
* 返回: int
* 0: success
* non-zero: error number
* Description: Set power manage mode
*
*************************************************************************/
Int32S PM_SetMode (LPC_SysControl_PMMode_t Mode)
{
PCON = Mode & 0x3;
return 0;
}
/*************************************************************************
* 函数名: PM_OpenPeripheral
* 输入参数: lpc_uint32 DevType
* 返回: int
* 0: success
* non-zero: error number
* Description: Open specifical peripheral
*
*************************************************************************/
Int32S PM_OpenPeripheral (Int32U DevType)
{
PCONP |= DevType;
return 0;
}
/*************************************************************************
* 函数名: PM_ClosePeripheral
* 输入参数: lpc_uint32 DevType
* 返回: int
* 0: success
* non-zero: error number
* Description: Close specifical peripheral
*
*************************************************************************/
Int32S PM_ClosePeripheral (Int32U DevType)
{
PCONP &= (~DevType);
return 0;
}
/*************************************************************************
* 函数名: EXTINT_Init
* 输入参数:
* LPC_SysControl_ExtInt_Chanel_t ExtIntNum
* bool WakeupEnable
* 返回: int
* 0 : success
* 非0 : error number
* Description: Set External Interrupt
*
*************************************************************************/
Int32S EXTINT_Init(LPC_SysControl_ExtInt_Chanel_t ExtIntNum, bool WakeupEnable)
{
switch(ExtIntNum)
{
case EXTINT0:
// Assign pin to Ext Interrup logic
PINSEL1_bit.P0_16 = 1;
// Clear interrupt flag
EXTINT_bit.EINT0 = 1;
// Set Wakeup
if (WakeupEnable)
EXTWAKE_bit.EXTWAKE0 = 1;
else
EXTWAKE_bit.EXTWAKE0 = 0;
break;
case EXTINT1:
// Assign pin to Ext Interrup logic
PINSEL0_bit.P0_14 = 1;
// Clear interrupt flag
EXTINT_bit.EINT1 = 1;
// Set Wakeup
if (WakeupEnable)
EXTWAKE_bit.EXTWAKE1 = 1;
else
EXTWAKE_bit.EXTWAKE1 = 0;
break;
case EXTINT2:
// Assign pin to Ext Interrup logic
PINSEL0_bit.P0_15 = 1;
// Clear interrupt flag
EXTINT_bit.EINT2 = 1;
// Set Wakeup
if (WakeupEnable)
EXTWAKE_bit.EXTWAKE2 = 1;
else
EXTWAKE_bit.EXTWAKE2 = 0;
break;
default:
return 1;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -