LPC2478时钟模块详解
扫描二维码
随时随地手机看文章
时钟框图如上图,系统时钟来源分别是内部4M的RC振荡器和外置晶振,RTC模块在某些情况下也可以作为主时钟,经过系统时钟选择sde时钟需要经过PLL倍频(或者不倍频),处理过的PLL输出USB时钟分频器和CPU时钟分频器,成为FCCLK 和FUSBCLK,FCCLK供给系统内核,以太网模块,以及各式AHB外设,APB外设的时钟来自于PLLCLK,经过外设时钟发生器,分频出各个时钟供给外设使用,同时,时钟模块也能切断外设模块的时钟
另外,看门狗定时器有多重时钟可以选择,系统实时时钟也有多个模式的时钟源可以选择
使用时钟模块时,主要有以下注意事项
1.切换时钟源的时候PLL必须被断开,否则无法切换成功
2.PLL输入时钟最大50M,产生的时钟最小275M
3.PLL配置寄存器的写入需要解锁,写入PLL数据之后必须要解锁写入的数据才能生效,如下
4.PLL设置过程如下
代码如下
#include"clock.h"
u32SystemCoreClock;
voidClockSet(u8clockSel)
{
if((PLLSTAT&(1<<25)))//如果PLL连接
{
PLLCON&=~(1<<1);//断开PLL连接
PLLFEED=0xAA;//发送馈送序列
PLLFEED=0x55;
while((PLLSTAT&(1<<25)));//等待PLL断开连接
}
PLLCON&=~(1<<0);//禁用PLL
PLLFEED=0xAA;//发送馈送序列
PLLFEED=0x55;
while((PLLSTAT&(1<<24)));//等待PLL禁止
if(clockSel==CLOCK_HSE)//选择外部时钟
{
SCS&=~(1<<4);//主振荡器频率选择1-20M
SCS|=(1<<5);//主振荡器使能
while((SCS&(1<<6))==0);//等待主振荡器准备好
CLKSRCSEL=0x01;//选择主时钟源为PLL时钟
SystemCoreClock=100000000;
}
elseif(clockSel==CLOCK_HSI)//选择内部时钟
{
CLKSRCSEL=0x00;//选择内部RC振荡器为系统时钟源
SystemCoreClock=100000000;
}
PLLCFG=0x00050063;//选择PLL倍频N6M10012M2*100*4/2=400M
PLLFEED=0xAA;//发送馈送序列
PLLFEED=0x55;
PLLCON|=0x01;/*使能PLL*/
PLLFEED=0xAA;
PLLFEED=0x55;
while(!(PLLSTAT&(1<<24)));/*等待PLL0使能*/
//while(!(PLLSTAT&(1<<26)));/*等待PLL0锁定*/
//修改cpu分频数值
CCLKCFG=0x03;//四分频400/4=100M
PLLCON|=(1<<1);/*连接PLL*/
PLLFEED=0xAA;
PLLFEED=0x55;
while(!(PLLSTAT&(1<<25)));/*等待PLL连接*/
//此时,PLL时钟就OK了,接下来需要设置外设的分频数
PCLKSEL0=0x00000040;//外设时钟均为25M
PCLKSEL1=0x00000000;
PCONP=0x00000000;//禁用全部外设时钟
}
#ifndef__CLOCK_H_
#define__CLOCK_H_
#include"lpc24xx.h"
#include"common.h"
#defineCLOCK_HSE1
#defineCLOCK_HSI2
voidClockSet(u8clockSel);
externu32SystemCoreClock;
#endif