主题 : mini2440的TEST CLOCK设置 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 3065
精华: 0
发帖: 13
金钱: 130 两
威望: 120 点
贡献值: 0 点
综合积分: 26 分
注册时间: 2008-12-25
最后登录: 2010-09-25
楼主  发表于: 2009-07-12 11:34

 mini2440的TEST CLOCK设置

管理提醒: 本帖被 kasim 从 Linux技术交流专区 移动到本区(2010-04-11)


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。  
级别: 新手上路
UID: 18553
精华: 0
发帖: 8
金钱: 40 两
威望: 8 点
贡献值: 0 点
综合积分: 16 分
注册时间: 2010-04-10
最后登录: 2011-03-01
1楼  发表于: 2010-04-11 20:59
好,非常感谢啊O(∩_∩)O~
级别: 新手上路
UID: 54768
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2011-09-05
最后登录: 2011-09-18
2楼  发表于: 2011-09-07 09:39
能具体解析一下 这个函数吗  MMU_SetAsyncBusMode和  MMU_SetFastBusMode吗?
级别: 新手上路
UID: 59430
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
贡献值: 0 点
综合积分: 24 分
注册时间: 2011-11-24
最后登录: 2011-12-19
3楼  发表于: 2011-12-19 13:15
cal_cpu_bus_clk();这个函数为什么要呢?系统的时钟不是在option.inc里面已经确定好了吗?