LPC1788系統(tǒng)時鐘初始化
#ifndef __SYS_H_
#define __SYS_H_
#include "common.h"
#define SystemCoreClock 120000000 //cpu時鐘頻率,計(jì)算時有用
#define ApbClock 120000000 //120M
#define EmcClock 60000000 //60M
#define UsbClock 48000000 //48M
void SystemInit(void);//系統(tǒng)時鐘初始化,啟動代碼調(diào)用
#endif
#include "sys.h"
#define XTAL_FREQ 12000000
#define LPC_PBOOST *((volatile unsigned long *)(0X400FC1B0))
void SystemInit(void)
{
LPC_SC->SCS=0x00000021;//osc晶振使能,地址線不移位模式
while((LPC_SC->SCS&(1<<6))==0);/* 等待osc晶振準(zhǔn)備好 */
LPC_SC->CLKSRCSEL=0x00000001; /*選擇osc為系統(tǒng)輸入時鐘*/
LPC_PBOOST|=(3<<0); //打開功耗提升,可以提升到120MHZ
// PLL0 Configuration (Main PLL)
// PLL0 Configuration Register (PLL0CFG)
// PLL out clock = (F_cco / (2 * P))
// F_cco = (F_in * M * 2 * P)
// F_in must be in the range of 1 MHz to 25 MHz
// PLL out clock must be in the range of 9.75 MHz to 160 MHz
// F_cco 156-320M
// MSEL: PLL Multiplier Selection 0-4bit m
// M Value
// PSEL: PLL Divider Selection 5-6bit p
// P Value
// 1
// 2
// 4
// 8
LPC_SC->PLL0CFG=0x00000009;//選擇倍頻系數(shù) P = 1 M = 10 FCCO = FIN*P*M*2=240M PLL_OUT = FCCO/(2*P)=120M
LPC_SC->PLL0CON=0x01; /* PLL0 使能 */
LPC_SC->PLL0FEED=0xAA;
LPC_SC->PLL0FEED=0x55;
while(!(LPC_SC->PLL0STAT&(1<<10)));/* 等待PLL鎖定 */
LPC_SC->PLL1CFG=0x00000023;//選擇倍頻系數(shù) m = 4 p = 2 fcco = fin*2*p*m = 192m pllout = 192/2*p = 48M
LPC_SC->PLL1CON=0x01; /* PLL1 使能 */
LPC_SC->PLL1FEED=0xAA;
LPC_SC->PLL1FEED=0x55;
while(!(LPC_SC->PLL1STAT&(1<<10))); /* 等待PLL1 鎖定 */
LPC_SC->CCLKSEL=(1<<0)|(1<<8); /* pll0為主時鐘,分頻數(shù)為1 */
LPC_SC->USBCLKSEL=(1<<0)|(2<<8); /* pll1為cpu主時鐘 */
LPC_SC->EMCCLKSEL=(1<<0); /* EMC 為系統(tǒng)是時鐘的一半 */
LPC_SC->PCLKSEL=(1<<0); /* 外設(shè)時鐘分頻數(shù)為1,120M */
LPC_SC->PCONP=0x00; /* 可以關(guān)閉的外設(shè)全部被關(guān)閉 */
LPC_SC->CLKOUTCFG&=~(1<<8); /* 停止時鐘輸出 */
LPC_SC->FLASHCFG=(5<<12)|0x03A;//6個cpu flash訪問時鐘,最安全的設(shè)置,120M時候可用
#ifdef __RAM_MODE__//設(shè)置中斷向量表的位置,一般不改
SCB->VTOR=0x10000000&0x3FFFFF80;
#else
SCB->VTOR=0x00000000&0x3FFFFF80;
#endif
}