1 时钟的设置
GLOBAL_CLK
U32 FCLK; //cpu的时钟
U32 HCLK; //用于高性能模块间的时钟。如CPU,DMA和DSP
U32 PCLK; //用于低带宽的周边外设的连接。如串口
U32 UCLK; //用于USB设备
2 锁相环
锁相环是个相位误差控制系统,它比较输入信号和压控振荡器输出信号之间的相位差,从而产生误差控制电压来控制压控振荡器的频率,以达到与输入信号同频。
MPLL:用于产生FCLK,HCLK和PCLK
UPLL:用于产生USB的时钟
3程序:
从Main函数开始,进行时钟的设置
i = 2 ; //don't use 100M!
//boot_params.cpu_clk.val = 3;
switch ( i ) {
case 0: //200
key = 12;
mpll_val = (92<<12)|(4<<4)|(1);
break;
case 1: //300
key = 13;
mpll_val = (67<<12)|(1<<4)|(1);
break;
case 2: //400
key = 14;
mpll_val = (92<<12)|(1<<4)|(1);
break;
case 3: //440!!!
key = 14;
mpll_val = (102<<12)|(1<<4)|(1);
break;
default:
key = 14;
mpll_val = (92<<12)|(1<<4)|(1);
break;
}
//init FCLK=400M, so change MPLL first
ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
ChangeClockDivider(key, 12);
cal_cpu_bus_clk();
进行初始化以后就是这一段设置时钟的代码。
1)首先是输出频率MPLL的设置,通过变量mpll_val 的设置得到Divider P,M,S。
mpll_val 的设置可以参考datasheet的典型值,并确定key,即FCLK和PCLK的比例。
2)ChangeMPllValue得到 PLL控制寄存器rMPLLCON 的值。
ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3)的输入参数分别为PLL的分频P,M,S。
3)ChangeClockDivider得到分频寄存器rCLKDIVN和rCAMDIVN 的值,ChangeClockDivider(key, 12)的输入参数1是FCLK:HCLK,参数2是HCKK:PCLK。rCLKDIVN和rCAMDIVN [8,9]最终确定三个CLK的比值。
并用
if(hdivn!=0)
MMU_SetAsyncBusMode();
else
MMU_SetFastBusMode();
来确定GCLK的值。具体如下
void MMU_SetFastBusMode(void); //GCLK=HCLK
void MMU_SetAsyncBusMode(void); //GCLK=FCLK @(FCLK>=HCLK)
4)cal_cpu_bus_clk()是静态函数,因此函数调用的结果没有访问或修改任何对性(非static)数据成员,因此此函数的调用只修改了静态变量static U32 cpu_freq;
static U32 UPLL;以及访问了寄存器 rMPLLCON和rCLKDIVN,rCAMDIVN,rUPLLCON。其中前三个寄存器已经在主函数Main中进行了修改,rUPLLCON用的是系统初始化后的默认值。
并定义了全局变量FCLK, HCLK ,PCLK ,UCLK。