?? lpc_syscontrol.c
字號:
// 定義系統初始化API函數
#include "LPC_SysControl.h"
LPC_Syscontrol_Config_t SysConfig;
/******************************************************************************
* 說明:SYS_Init函數。初始化整個系統,建立 MEMMAP、VPB, 是否允許 PLL 和 MAM
* 參數: unsigned long Fosc
* unsigned long Fcclk
* LPC_SysControl_VPBDiv_t VPBDivider
* LPC_SysControl_RemapMode_t RemapMode
* unsigned long PortDir0
* unsigned long Port0
* unsigned long PortDir1
* unsigned long Port1
*
* 返回值: int
* 0: 成功
* 非0:錯誤號
*****************************************************************************/
int SYS_Init (unsigned long Fosc, unsigned long Fcclk,
LPC_SysControl_VPBDiv_t VPBDivider,
LPC_SysControl_RemapMode_t RemapMode,
unsigned long PortDir0, unsigned long Port0,
unsigned long PortDir1, unsigned long Port1) {
unsigned long M, P_min, P_max, P, i;
int Pflag = 0, PLLflag = 0;
// 檢測是否有效
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) {
// 需要時計算 PLL's 值 M 和 P
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;
}
// 設置全局變量
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;
// 鎖相環 PLL
if (PLLflag) {
PLLCFG_bit.MSEL = M-1; // 設置 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; // 允許 PLL
// 禁止中斷
PLLFEED = PLLFEED_DATA1;
PLLFEED = PLLFEED_DATA2;
while (!PLLSTAT_bit.PLOCK); // 等待 PLL 鎖定
PLLCON_bit.PLLC = true; // 連接 PLL
PLLFEED = PLLFEED_DATA1;
PLLFEED = PLLFEED_DATA2;
}
else {
PLLCON_bit.PLLC = false;
PLLCON_bit.PLLE = false;
PLLFEED = PLLFEED_DATA1;
PLLFEED = PLLFEED_DATA2;
}
// 高級外圍總線 VPB
VPBDIV_bit.VPBDIV = VPBDivider;
// 存儲器映射 MEMAMP
MEMMAP_bit.MAP = SysConfig.RemapMode;
// 通用輸入輸出 GPIO
PINSEL0 = PINSEL1 = 0;
IO0SET = Port0;
IO0CLR = ~Port0;
IO0DIR = PortDir0;
IO1SET = Port1;
IO1CLR = ~Port1;
IO1DIR = PortDir1;
return 0;
}
/*************************************************************************
* 說明: SYS_GetFpclk函數,獲得Fpclk值
* 參數:無
* 返回值: int
* 0:成功
* 非0:錯誤號
*************************************************************************/
unsigned int SYS_GetFpclk (void) {
return SysConfig.Fpclk;
}
/*************************************************************************
* 說明:PM_SetMode函數,設置功率管理模式
* 參數:LPC_SysControl_PMMode_t Mode -- PM_STANDARD ,PM_IDLE or PM_POWERDOWN
* 返回值:int
* 0:成功
* 非0:錯誤號
*************************************************************************/
int PM_SetMode (LPC_SysControl_PMMode_t Mode) {
PCON = Mode & 0x3;
return 0;
}
/*************************************************************************
* 說明:PM_OpenPeripheral函數,打開指定外圍
* 參數:lpc_uint32 DevType
* 返回值:int
* 0:成功
* 非0:錯誤號
*************************************************************************/
int PM_OpenPeripheral (unsigned int DevType) {
PCONP |= DevType;
return 0;
}
/*************************************************************************
* 說明:PM_ClosePeripheral函數,關閉指定外圍
* 參數:lpc_uint32 DevType
* 返回值:int
* 0:成功
* 非0:錯誤號
*************************************************************************/
int PM_ClosePeripheral (unsigned int DevType) {
PCONP &= (~DevType);
return 0;
}
/*************************************************************************
* 說明:EXTINT_Init函數,設置外部中斷
* 參數: LPC_SysControl_ExtInt_Chanel_t ExtIntNum
* bool WakeupEnable
* 返回值:int
* 0:成功
* 非0:錯誤號
*************************************************************************/
int EXTINT_Init (LPC_SysControl_ExtInt_Chanel_t ExtIntNum,
bool WakeupEnable) {
switch(ExtIntNum) {
case EXTINT0:
PINSEL1_bit.P0_16 = 1; // 分配外部中斷引腳
EXTINT_bit.EINT0 = 1; // 清除中斷標志
if (WakeupEnable) // 設置喚醒
EXTWAKE_bit.EXTWAKE0 = 1;
else
EXTWAKE_bit.EXTWAKE0 = 0;
break;
case EXTINT1:
PINSEL0_bit.P0_14 = 1; // 分配外部中斷引腳
EXTINT_bit.EINT1 = 1; // 清除中斷標志
if (WakeupEnable) // 設置喚醒
EXTWAKE_bit.EXTWAKE1 = 1;
else
EXTWAKE_bit.EXTWAKE1 = 0;
break;
case EXTINT2:
PINSEL0_bit.P0_15 = 1; // 分配外部中斷引腳
EXTINT_bit.EINT2 = 1; // 清除中斷標志
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 + -