【裸机开发笔记】6410的系统时钟设置(上)---6410时钟控制逻辑框架分析

来源:互联网 发布:php免杀大马 编辑:程序博客网 时间:2024/04/30 05:10

本文主要介绍6410内核和AHB、APB总线的时钟设置。

 

6410的时钟逻辑结构还是比较清晰的,配置起来并不难(曾让笔者极度抓狂的是Freescale Kinetis系列的片子,系统时钟配置起来很麻烦,有好多种时钟模式)。

下面先来看一下6410的时钟构成。

这里可以看到,6410的时钟控制逻辑主要产生三个重要的CLK,分别是ARMCLK(内核用),HCLK(AXI/AHB总线用)和PCLK(APB总线用)。还有一个重要的信息,就是6410内部共有三个锁相环,分别是APLL,MPLL和EPLL(上图中还未提到)。其中APLL专门为ARMCLK提供时钟源,MPLL则为HCLK和PCLK提供时钟源,本文下面就会对这两个PLL进行设置。至于EPLL,它主要是为音频设备等特殊外设服务,现在笔者还没有用到,所以暂不做过多介绍。

关于AXI/AHB,APB这几种总线,它们上面会挂接不同的外设,下面是6410的Manual中给出的图示:

 

上面的图表很好地体现了6410内部不同总线与外设间的对应关系。图表上的文字部分是说,6410X的内核主要由ARM1176处理器、几个多媒体和图像协处理器(MFC等模块)以及各种常用的外设IP核(如PWM、UART之类)组成。ARM1176处理器通过64位的AXI总线与一些存储控制器(DDRAM控制器,NAND控制器等)连接,这样可以满足带宽的需求。多媒体与图像协处理器被分成了六个单元,这六个单元可以独立供电,在某个模块用不上时可以单独地停止对其的电源供应而降低系统损耗。

要设置这几种总线的时钟频率,只需设置HCLK和PCLK即可。

各种时钟信号之间的依赖和选择关系总图见6410 User Manual的3-3页中的图表。图片太大,这里不便贴出。

 

下面来看下时钟结构图中三个锁相环的部分。下图中的蓝色方框圈出了三个复选单元,这三个复选单元分别负责输出MOUT(APLL)、MOUT(MPLL)、MOUT(EPLL),这三个时钟为下一级时钟提供源。

由上图可见,MOUT有两个选择,一个是不经过锁相环直接选择外部输入的时钟源(亦即锁相环的输入,用FIN表示),一个是锁相环的输出时钟(用FOUT表示),这些都通过CLK_SRC寄存器中的相应位来控制。为了实现实现较高的系统频率我们一般都是选择FOUT,即向CLK_SRC寄存器中的相应位写1。

上图中看到FIN本身也有两个源供选择,一个是直接选择外部的时钟输入,一个是选择外部的晶振。下面是我从tiny6410核心板原理图截取的一部分,参照这个更方便我们理清这个环节:

一般我们都是选择晶振作为源输入。(可以看到tiny6410核心板上的EXTCLK引脚直接上拉了,并没有用它做输入时钟)。

FIN的选择是通过OM[0]引脚在上电时的状态决定的,下面是Manual里的图表,红框圈出了与此相关的内容。

再看下tiny6410的原理图,可以发现,OM[0]引脚实际上是被下拉了(注释我写在了图中),上电时OM[0]会是0的状态,因此也就选择了晶振作为源

锁相环部分的时钟结构到这里也就差不多说清楚了。下面看看系统最后用到的那三个重要时钟(ARMCLK,HCLK,PCLK)是如何生成的。

 

 

上图的蓝色方框圈出了两个复选单元(其实是一个,因为这两个复选单元都是由同一个位控制,写手册的人应该是为了方便我们阅读才画成了两个),这个复选由MISC_CON寄存器的第19位控制。当这一位为0时,处于正常模式,为1时处于自动SYN667M模式。这里我们一般都设置成0即可,系统复位后这个位的复位值也是0(所以Uboot中一般并不对这一位进行设置)。因为我也不打算用什么自动SYN667M模式,我下面分析时就直接忽略这两个复选单元了。

在上图的中间还有一个重要的复选单元,不过截图的时候忘了用方框圈出,就是由OTHERS寄存器的第6位控制的那个SYNCMUX。当该位为1时,表示同步模式,同步模式下ARMCLK、HCLK、PCLK都由MOUT(APLL)提供源,相当于只用到了APLL这个锁相环;当改位为0时,表示异步模式,这时ARMCLK仍由MOUT(APLL)提供源,但HCLK和PCLK由MOUT(MPLL)提供源,MPLL这个锁相环就有用武之地了。

 

 通过上图可以清晰地看出,MOUT(APLL)通过DIV(ARM)分频后就直接得到ARMCLK(我刚才说了我直接无视蓝框圈出的那两个复选单元,我用正常模式不用自动SYNC667模式,下面的说明中不再作此提示)。

在生成HCLK时钟和PCLK时钟的过程中,需要先生成HCLKX2时钟。在同步模式下(OTHER[6]=1时),HCLKX2时钟由MOUT(APLL)经过DIV(HCLKX2)分频得到;异步模式下(OTHER[6]=0时),HCLKX2时钟由MOUT(MPLL)经过DIV(HCLKX2)分频得到。得到HCLKX2时钟后,对它进行DIV(HCLK)分频得到HCLK时钟,进行DIV(PCLK)分频得到PCLK时钟。

 DIV(ARM)、DIV(HCLKX2)、DIV(HCLK)、DIV(PCLK)这四个数的值分别由CLK_DIV0寄存器的ARM_RATIO、HCLKX2_RATIO、HCLK_RATIO、PCLK_RATIO这四个位域决定。见下图:

 

 

好了,6410的时钟结构分析到这里也就差不多了。剩下的就是编程设置各寄存器的值。设置时注意以下几点注意事项:

 

 

 

 

总结一下就是:

1.ARMCLK最高设置为667M。

2.HCLK最高设置为133M。

3.PCLK最高设置为66M。

4.HCLKX2最高设置为266M。

5.AHB时钟和APB时钟之间的频率比必须是偶数(设置HCLK_RATIO和PCLK_RATIO时要注意)。

*6.在自动SYNC667模式下(虽然我这里不用这个模式,但为以后可能用到的朋友提个醒),ARMCLK时钟必须是HCLK时钟的整数倍,并且当ARMCLK超过533M以上时,ARMCLK、HCLKX2、HCLK之间比值只能是1:2.5:5。


 

原创粉丝点击