LPC2478時(shí)鐘模塊詳解
時(shí)鐘框圖如上圖,系統(tǒng)時(shí)鐘來源分別是內(nèi)部4M的RC振蕩器和外置晶振,RTC模塊在某些情況下也可以作為主時(shí)鐘,經(jīng)過系統(tǒng)時(shí)鐘選擇sde時(shí)鐘需要經(jīng)過PLL倍頻(或者不倍頻),處理過的PLL輸出USB時(shí)鐘分頻器和CPU時(shí)鐘分頻器,成為FCCLK 和FUSBCLK,FCCLK供給系統(tǒng)內(nèi)核,以太網(wǎng)模塊,以及各式AHB外設(shè),APB外設(shè)的時(shí)鐘來自于PLLCLK,經(jīng)過外設(shè)時(shí)鐘發(fā)生器,分頻出各個(gè)時(shí)鐘供給外設(shè)使用,同時(shí),時(shí)鐘模塊也能切斷外設(shè)模塊的時(shí)鐘
另外,看門狗定時(shí)器有多重時(shí)鐘可以選擇,系統(tǒng)實(shí)時(shí)時(shí)鐘也有多個(gè)模式的時(shí)鐘源可以選擇
使用時(shí)鐘模塊時(shí),主要有以下注意事項(xiàng)
1.切換時(shí)鐘源的時(shí)候PLL必須被斷開,否則無法切換成功
2.PLL輸入時(shí)鐘最大50M,產(chǎn)生的時(shí)鐘最小275M
3.PLL配置寄存器的寫入需要解鎖,寫入PLL數(shù)據(jù)之后必須要解鎖寫入的數(shù)據(jù)才能生效,如下
4.PLL設(shè)置過程如下
代碼如下
#include"clock.h"
u32SystemCoreClock;
voidClockSet(u8clockSel)
{
if((PLLSTAT&(1<<25)))//如果PLL連接
{
PLLCON&=~(1<<1);//斷開PLL連接
PLLFEED=0xAA;//發(fā)送饋送序列
PLLFEED=0x55;
while((PLLSTAT&(1<<25)));//等待PLL斷開連接
}
PLLCON&=~(1<<0);//禁用PLL
PLLFEED=0xAA;//發(fā)送饋送序列
PLLFEED=0x55;
while((PLLSTAT&(1<<24)));//等待PLL禁止
if(clockSel==CLOCK_HSE)//選擇外部時(shí)鐘
{
SCS&=~(1<<4);//主振蕩器頻率選擇1-20M
SCS|=(1<<5);//主振蕩器使能
while((SCS&(1<<6))==0);//等待主振蕩器準(zhǔn)備好
CLKSRCSEL=0x01;//選擇主時(shí)鐘源為PLL時(shí)鐘
SystemCoreClock=100000000;
}
elseif(clockSel==CLOCK_HSI)//選擇內(nèi)部時(shí)鐘
{
CLKSRCSEL=0x00;//選擇內(nèi)部RC振蕩器為系統(tǒng)時(shí)鐘源
SystemCoreClock=100000000;
}
PLLCFG=0x00050063;//選擇PLL倍頻N6M10012M2*100*4/2=400M
PLLFEED=0xAA;//發(fā)送饋送序列
PLLFEED=0x55;
PLLCON|=0x01;/*使能PLL*/
PLLFEED=0xAA;
PLLFEED=0x55;
while(!(PLLSTAT&(1<<24)));/*等待PLL0使能*/
//while(!(PLLSTAT&(1<<26)));/*等待PLL0鎖定*/
//修改cpu分頻數(shù)值
CCLKCFG=0x03;//四分頻400/4=100M
PLLCON|=(1<<1);/*連接PLL*/
PLLFEED=0xAA;
PLLFEED=0x55;
while(!(PLLSTAT&(1<<25)));/*等待PLL連接*/
//此時(shí),PLL時(shí)鐘就OK了,接下來需要設(shè)置外設(shè)的分頻數(shù)
PCLKSEL0=0x00000040;//外設(shè)時(shí)鐘均為25M
PCLKSEL1=0x00000000;
PCONP=0x00000000;//禁用全部外設(shè)時(shí)鐘
}
#ifndef__CLOCK_H_
#define__CLOCK_H_
#include"lpc24xx.h"
#include"common.h"
#defineCLOCK_HSE1
#defineCLOCK_HSI2
voidClockSet(u8clockSel);
externu32SystemCoreClock;
#endif