?? system_lpc11xx.c
字號:
/******************** (C) COPYRIGHT 2010 Embest Info&Tech Co.,LTD. ************
* 文件名: system_LPC11xx.c
* 作者 : Wuhan R&D Center, Embest
* 日期 : 01/18/2010
* 描述 : CMSIS Cortex-M0核外圍訪問層源文件,用于NXP LPC11xx系列設(shè)備
*******************************************************************************
*******************************************************************************
* 歷史:
* 01/18/2010 : V1.0 初始版本
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include "LPC11xx.h"
/*
//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
*/
/*--------------------- 時鐘配置 ----------------------------------
//
// <e> 時鐘配置
// <h> 系統(tǒng)控制和狀態(tài)寄存器 (SCS)
// <o1.4> OSCRANGE: 主晶振頻率范圍選擇
// <0=> 1 MHz 到 20 MHz
// <1=> 15 MHz 到 24 MHz
// <e1.5> OSCEN: 主晶振使能
// </e>
// </h>
//
// <h> 時鐘源選擇寄存器 (CLKSRCSEL)
// <o2.0..1> CLKSRC: PLL時鐘源選擇
// <0=> 內(nèi)部RC晶振
// <1=> 主晶振
// <2=> RTC晶振
// </h>
//
// <e3> PLL0配置 (Main PLL)
// <h> PLL0配置寄存器 (PLL0CFG)
// <i> F_cco0 = (2 * M * F_in) / N
// <i> F_in 必須在32kHz到50MHz范圍之間
// <i> F_cco0必須在275MHz到550MHz范轉(zhuǎn)之間
// <o4.0..14> MSEL: PLL倍頻選擇
// <6-32768><#-1>
// <i> M Value
// <o4.16..23> NSEL: PLL分頻選擇
// <1-256><#-1>
// <i> N值
// </h>
// </e>
//
// <e5> PLL1配置 (USB PLL)
// <h> PLL1配置寄存器 (PLL1CFG)
// <i> F_usb = M * F_osc 或 F_usb = F_cco1 / (2 * P)
// <i> F_cco1 = F_osc * M * 2 * P
// <i> F_cco1必須在156MHz到320MHz之間
// <o6.0..4> MSEL: PLL倍頻選擇
// <1-32><#-1>
// <i> M Value (用于USB時最大值為4)
// <o6.5..6> PSEL: PLL分頻選擇
// <0=> 2
// <1=> 4
// <2=> 8
// <3=> 16
// <i> P值
// </h>
// </e>
//
// <h> CPU時鐘配置寄存器 (CCLKCFG)
// <o7.0..7> CCLKSEL: PLL0分頻值,用于為CPU提供時鐘
// <0-255>
// <i> 分頻值為CCLKSEL + 1。只有0和奇數(shù)值有效
// </h>
//
// <h> USB時鐘配置寄存器 (USBCLKCFG)
// <o8.0..3> USBSEL: PLL1分頻值用于為USB提供時鐘
// <0-15>
// <i> 分頻值為USBSEL + 1
// </h>
//
// </e>
*/
#define CLOCK_SETUP 1
#define MAIN_PLL_SETUP 1
#define MAIN_CLKSRCSEL_Val 0x00000001
#define MAIN_PLL_M_Val 0x00000003
#define MAIN_PLL_P_Val 0x00000001
#define SYS_AHB_DIV_Val 1 /* 1到255,典型值為1、2或4 */
#define USB_CLK_SETUP 0 /* 當(dāng)使用USB時,此位必須置位 */
#define USE_USB_PLL 0 /* 當(dāng)USB_PLL_SETUP為0時,USE_USB_PLL不能置1,
USB時鐘由main PLL或USB PLL提供。 */
#define USB_CLKSRCSEL_Val 0x00000001
#define USB_PLL_M_Val 0x00000003
#define USB_PLL_P_Val 0x00000001
/*
//-------- <<< end of configuration section >>> ------------------------------
*/
/*----------------------------------------------------------------------------
宏定義
*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------
時鐘宏定義
*----------------------------------------------------------------------------*/
#define XTAL (12000000UL) /* 晶體振蕩器頻率 */
#define OSC_CLK ( XTAL) /* 主晶振頻率 */
#define IRC_OSC ( 4000000UL) /* 內(nèi)部RC晶振頻率 */
#define WDT_OSC ( 250000UL) /* 看門狗晶振頻率 */
/*----------------------------------------------------------------------------
時鐘變量定義
*----------------------------------------------------------------------------*/
uint32_t ClockSource = IRC_OSC;
uint32_t SystemFrequency = IRC_OSC; /*!< 系統(tǒng)時鐘頻率 (內(nèi)核時鐘) */
uint32_t SystemAHBFrequency = IRC_OSC;
/**
* @函數(shù)名:Main_PLL_Setup
* @描述:微控制器配置,初始化系統(tǒng)并更新系統(tǒng)時鐘頻率
* @參數(shù): 無
* @返回值:無
*/
void Main_PLL_Setup ( void )
{
uint32_t regVal;
ClockSource = OSC_CLK;
LPC_SYSCON->SYSPLLCLKSEL = MAIN_CLKSRCSEL_Val; /* 選擇OSC */
LPC_SYSCON->SYSPLLCLKUEN = 0x01; /* 更新時鐘源 */
LPC_SYSCON->SYSPLLCLKUEN = 0x00; /* 切換更新寄存器一次 */
LPC_SYSCON->SYSPLLCLKUEN = 0x01;
while ( !(LPC_SYSCON->SYSPLLCLKUEN & 0x01) ); /* 等待更新完成 */
regVal = LPC_SYSCON->SYSPLLCTRL;
regVal &= ~0x1FF;
LPC_SYSCON->SYSPLLCTRL = (regVal | (MAIN_PLL_P_Val<<5) | MAIN_PLL_M_Val);
/* 使能主系統(tǒng)PLL時鐘,主系統(tǒng)PLL為PDRUNCFG寄存器中第七位 */
LPC_SYSCON->PDRUNCFG &= ~(0x1<<7);
while ( !(LPC_SYSCON->SYSPLLSTAT & 0x01) ); /* 等待直到被鎖定 */
LPC_SYSCON->MAINCLKSEL = 0x03; /* PLL時鐘輸出選擇 */
LPC_SYSCON->MAINCLKUEN = 0x01; /* 更新MCLK時鐘源 */
LPC_SYSCON->MAINCLKUEN = 0x00; /* 切換更新寄存器一次 */
LPC_SYSCON->MAINCLKUEN = 0x01;
while ( !(LPC_SYSCON->MAINCLKUEN & 0x01) ); /* 等待更新完成 */
LPC_SYSCON->SYSAHBCLKDIV = SYS_AHB_DIV_Val; /* SYS AHB時鐘,典型值為1、2、4 */
#if MAIN_PLL_SETUP
SystemFrequency = ClockSource * (MAIN_PLL_M_Val+1);
#else
SystemFrequency = ClockSource;
#endif
SystemAHBFrequency = (uint32_t)(SystemFrequency/SYS_AHB_DIV_Val);
return;
}
void USB_PLL_Setup ( void )
{
uint32_t regVal;
/* 使能USB PLL時鐘。 USB時鐘和PHY分別為PDRUNCFG寄存器的第8位和第10位 */
LPC_SYSCON->PDRUNCFG &= ~((0x1<<8)|(0x1<<10));
LPC_SYSCON->USBPLLCLKSEL = USB_CLKSRCSEL_Val; /* 選擇系統(tǒng)OSC */
LPC_SYSCON->USBPLLCLKUEN = 0x01; /* 更新時鐘源*/
LPC_SYSCON->USBPLLCLKUEN = 0x00; /* 切換更新寄存器一次 */
LPC_SYSCON->USBPLLCLKUEN = 0x01;
while ( !(LPC_SYSCON->USBPLLCLKUEN & 0x01) ); /* 等待更新完成 */
regVal = LPC_SYSCON->USBPLLCTRL;
regVal &= ~0x1FF;
LPC_SYSCON->USBPLLCTRL = (regVal | (USB_PLL_P_Val<<5) | USB_PLL_M_Val);
while ( !(LPC_SYSCON->USBPLLSTAT & 0x01) ); /* 等待直到被鎖定 */
#if USE_USB_PLL
LPC_SYSCON->USBCLKSEL = 0x00; /* 選擇USB PLL */
#else
/* 如果運行到此,則Main PLL時鐘必須是48Mhz的倍數(shù) */
LPC_SYSCON->USBCLKSEL = 0x01; /* 選擇主時鐘 */
#endif
LPC_SYSCON->USBCLKUEN = 0x01; /* 更新時鐘 */
LPC_SYSCON->USBCLKUEN = 0x00; /* 切換更新寄存器一次 */
LPC_SYSCON->USBCLKUEN = 0x01;
while ( !(LPC_SYSCON->USBCLKUEN & 0x01) ); /* 等待更新完成 */
LPC_SYSCON->USBCLKDIV = 1; /* USB時鐘必須是48Mhz. */
#if !USE_USB_PLL
/* 當(dāng)USB PLL不被用做USB時鐘時,用于USB PLL的PDRUN不能關(guān)閉 */
LPC_SYSCON->PDRUNCFG |= (0x1<<8);
#endif
return;
}
/**
* @函數(shù)名:SystemInit
* @描述:微控制器配置,初始化系統(tǒng)并更新系統(tǒng)時鐘頻率
* @參數(shù): 無
* @返回值:無
*/
void SystemInit (void)
{
uint32_t i;
#ifdef __DEBUG_RAM
LPC_SYSCON->SYSMEMREMAP = 0x1; /* 重映射到片內(nèi)RAM */
#else
#ifdef __DEBUG_FLASH
LPC_SYSCON->SYSMEMREMAP = 0x2; /* 重映射到片內(nèi)flash */
#endif
#endif
#if (CLOCK_SETUP) /* 時鐘設(shè)置 */
/*第0位默認(rèn)為晶振旁路 第1位 0=0~20Mhz晶振輸入, 1=15~50Mhz晶振輸入 */
LPC_SYSCON->SYSOSCCTRL = 0x00;
/* 主系統(tǒng)OSC運行被清除,對應(yīng)PDRUNCFG寄存器中的第5位 */
LPC_SYSCON->PDRUNCFG &= ~(0x1<<5);
/* 等待200us,直到OSC穩(wěn)定,沒有狀態(tài)標(biāo)志*/
for ( i = 0; i < 0x100; i++ );
#if (MAIN_PLL_SETUP)
Main_PLL_Setup();
#endif
#if (USB_CLK_SETUP)
USB_PLL_Setup();
#else
/* 使能USB時鐘 */
LPC_SYSCON->PDRUNCFG &= ~((0x1<<8)|(0x1<<10));
#endif
#endif /* CLOCK_SETUP結(jié)束 */
/* 系統(tǒng)時鐘IOCON使能,此位不使能大部分IO不可用 */
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16);
return;
}
/**
* @}
*/
/**
* @}
*/
/************* (C) COPYRIGHT 2010 Wuhan R&D Center, Embest *****文件結(jié)束*******/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -