工程小白學習之路:五分鐘教你實現基於LPC1768的時鐘配置

LPC1768的時鐘源可以來自三個:

1)內部RC振盪器

內部振盪器可看作看門狗定時器的時鐘源,也可作PLL0和cpu的時鐘源,但是無法作為usb的時鐘源,因為精度達不到。而且如果CAN波特率高於100kb/s,則也不適用了。在系統上電時,LPC1768都使用內部振盪器,直到軟件將其切換為另一種可用的時鐘源。

2)主振盪器

主振盪器可作為CPU的時鐘源,需要通過分頻和倍頻進行配置使用。基本會使用主振盪器作為時鐘源

3)RTC振盪器

RTC振盪器可提供1Hz-32kHz的RTC時鐘輸出,可用作PLL0、CPU和看門狗定時的時鐘源。

LPC1768時鐘配置會涉及到以下幾個過程:

1)時鐘源選擇

時鐘源的選擇就涉及到了SCS寄存器的配置

2)時鐘分頻

涉及到CCLKCFG寄存器的配置

3)PLL0配置

涉及到CLKSRCSEL、PLL0CFG、PLL0FEED等寄存器的配置

4)PLL1配置

涉及到PLL1CFG、PLL1FEED等寄存器的配置

5)外設時鐘輸出

具體的代碼如下:

#define CLOCK_SETUP 1

#define SCS_Val 0x00000020

#define CLKSRCSEL_Val 0x00000001

#define PLL0_SETUP 1

#define PLL0CFG_Val 0x00050063

#define PLL1_SETUP 1

#define PLL1CFG_Val 0x00000023

#define CCLKCFG_Val 0x00000003

#define USBCLKCFG_Val 0x00000000

#define PCLKSEL0_Val 0x00000000

#define PCLKSEL1_Val 0x00000000

#define PCONP_Val 0x042887DE

#define CLKOUTCFG_Val 0x00000000

#define FLASH_SETUP 1

#define FLASHCFG_Val 0x0000303A

//時鐘配置

void SystemInit

{

#if(CLOCK_SETUP) //時鐘源設置

LPC_SC->SCS = SCS_Val;

if(SCS_Val &(1 << 5)){

while((LPC_SC->SCS & (1 << 6)) == 0); //主振盪器已穩定

}

LPC_SC->CCLKCFG = CCLKCFG_Val; //setup clock divider,CCLKCFG_Val = 3, 為4分頻,即CCLK為PLL0的四分之一

#if (PLL0_SETUP)

LPC_SC->CLKSRCSEL = CLKSRCSEL_Val;//選擇主振盪器作為PLL0時鐘源

LPC_SC->PLL0CFG = PLL0CFG_Val; //在此選擇PLL0倍頻器值和預分頻器值,分別是0~14位和16~23位

LPC_SC->PLL0FEED = 0xAA;

LPC_SC->PLL0FEED = 0x55; //以上兩行代碼表示使PLL0CON和PLL0CFG寄存器的更改生效

LPC_SC->PLL0CON = 0x01; //PLL0使能

LPC_SC->PLL0FEED = 0xAA;

LPC_SC->PLL0FEED = 0x55;

while (!(LPC_SC->PLL0STAT & (1<<26))); // Wait for PLOCK0

LPC_SC->PLL0CON = 0x03; /* PLL0 Enable & Connect */

while(!(LPC_SC->PLL0STAT & ((1<<25) | (1<<24))));

#endif

#if (PLL1_SETUP)

LPC_SC->PLL1CFG = PLL1CFG_Val;

LPC_SC->PLL1FEED = 0xAA;

LPC_SC->PLL1FEED = 0x55;

LPC_SC->PLL1CON = 0x01; /* PLL1 Enable */

while (!(LPC_SC->PLL1STAT & (1<<10))); /* Wait for PLOCK1 */

LPC_SC->PLL1CON = 0x03; /* PLL1 Enable & Connect */

while (!(LPC_SC->PLL1STAT & ((1<< 9) | (1<< 8))));/* Wait for PLLC1_STAT & PLLE1_STAT */

#else

LPC_SC->USBCLKCFG=USBCLKCFG_Val; /* Setup USB Clock Divider */

#endif

LPC_SC->PCLKSEL0 = PCLKSEL0_Val; /* Peripheral Clock Selection */

LPC_SC->PCLKSEL1 = PCLKSEL1_Val;

LPC_SC->PCONP = PCONP_Val; /* Power Control for Peripherals */

LPC_SC->CLKOUTCFG = CLKOUTCFG_Val; /* Clock Output Configuration */

#endif

#if (FLASH_SETUP == 1)

LPC_SC->FLASHCFG = FLASHCFG_Val; //Flash加速器配置

這樣就配置完成,並且配置的100MHz的時鐘頻率。

Fcco = 12MHz/4 * 2 * 100 / 6 = 100MHz

以上是來自網上雲飛翔的博客,地址:

http://www.cnblogs.com/flyingcloude/p/3745023.html

但是在system_lpc17xx.c裡面,系統初始化函數還包括下面

/* 根據時鐘寄存器的值確定時鐘頻率 */

if (((LPC_SC->PLL0STAT >> 24)&3)==3) {/* If PLL0 enabled and connected */

switch (LPC_SC->CLKSRCSEL & 0x03) {

case 0: /* Internal RC oscillator => PLL0 */

case 3: /* Reserved, default to Internal RC */

SystemFrequency = (IRC_OSC *

((2 * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) /

(((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1) /

((LPC_SC->CCLKCFG & 0xFF)+ 1));

break;

case 1: /* Main oscillator => PLL0 */

SystemFrequency = (OSC_CLK *

case 2: /* RTC oscillator => PLL0 */

SystemFrequency = (RTC_CLK *

} else {

SystemFrequency = IRC_OSC / ((LPC_SC->CCLKCFG & 0xFF)+ 1);

SystemFrequency = OSC_CLK / ((LPC_SC->CCLKCFG & 0xFF)+ 1);

SystemFrequency = RTC_CLK / ((LPC_SC->CCLKCFG & 0xFF)+ 1);

#if (FLASH_SETUP == 1) /* Flash Accelerator Setup */

LPC_SC->FLASHCFG = (LPC_SC->FLASHCFG & ~0x0000F000) | FLASHCFG_Val;

一般情況下,LPC_SC->CLKSRCSEL=0x01,即跳轉到case 1, SystemFrequency =100M,

在PCLKSEL0和PCLKSEL1寄存器中隊各個外設的值都設為0,表明PCLK外設時鐘=CCLK/4。

即 PCLK=25Mhz.


分享到:


相關文章: