idle man的学习空间

S3C2440时钟设置详解

     S3C2440A中的时钟控制逻辑可以产生必须的时钟信号,包括CPU的FCLK,AHB总线外设的HCLK以及APB总线外设的PCLK。S3C2440A包含两个锁相环(PLL):一个提供给FCLK、HCLK和PCLK,另一个专用于USB模块(48MHz)。时钟控制逻辑可以不使用PLL来减慢时钟,并且可以由软件连接或断开各外设模块的时钟,以降低功耗。

      S3C2440A的主时钟源由外部时钟(EXTCLK)或者外部晶振(XTIPll)提供,输入时钟源由模式控制引脚OM3和OM2控制选择,在复位信号的上升沿参考OM3和OM2的引脚将OM[3:2]的状态在内部锁定,如图1所示

图1 引导启动时的时钟源选择

选择不同输入时钟源时连接方式如图2所示:

图2 时钟连接参考

通过在片内集成的2个锁相环:MPLL和UPLL,可对输入的Fin=12MHz的晶振频率进行倍频。S3C2440使用了三个倍频因子MDIV、PDIV和SDIV来设置倍频,通过寄存器MPLLCON和UPLLCON可设置倍频因子。其中MPLLCON寄存器用于设置处理器内核时钟主频FCLK,其输入输出频率间的关系为

                   FCLK=MPLL=(2*m*Fin)/(p*2^s)

其中m=(MDIV+8), p=(PDIV+2), s=SDIV。

其中UPLLCON寄存器用于产生48MHz或96MHz,提供USB时钟(UCLK),其输入输出频率间的关系为

UCLK=UPLL=(m * Fin) / (p * 2^s)

其中m=(MDIV+8), p=(PDIV+2), s=SDIV。

手工计算相对复杂些,我们可以根据欲得到的主频FCLK大小,直接通过查表来获知各倍频因子的设置参数,详见。

S3C2440的数据手册中提供了一个表格来查询各个输出频率和输入频率所对应的MPLL中参数m、p和s的值,使用的时候最好只使用该表格中推荐的数值。

图3 PLL真值表

通过图3的真值表,我们可以得到如果输入时钟为12MHz,输出时钟FCLK为405MHz,可以选择MDIV为127,PDIV为2,SDIV为1。输出48MHz和96MHz是UPLLCON使用的。

除了可设置内核时钟FCLK,还需要设置AHB总线设备使用的HCLK和APB总线设备使用的PCLK。通过CLKDIVN和CAMDIVN这两个寄存器可设置三者的分频关系,如图4 为CLKDIVN的说明,可以通过设置CLKDIVN和CAMDIVN的相关位来设置这三个时钟。

图4 FCLK、HCLK和PCLK关系

具体可参观数据手册中对此的说明。即若主频FLCK是400MHz,如果按照1:4:8的设置,可以先设置CLKDIVN为0101,然后设置CAMDIVN的第9位为0(不设置的时候该位默认为0),此时HLCK是100MHz,PLCK是50MHz。

可将该频率映射到CLKOUT0引脚,对其测试验证。

在我们搭建好2440的硬件平台后,我们在调试硬件的时候,通常需要将系统的时钟测试引脚引出来测试,以确认系统是否达到设计的要求。2440提供了CLKOUT0和CLKOUT1这两个引脚用于测试时钟。可以通过设置MISCCR寄存器的CLKSEL0和CLKSEL1位来选择CLKOUT0和CLKOUT1的时钟源。其时钟源分别有000=MPLL输出,001为UPLL输出,010为RTC输出,011为HCLK,100为PCLK,101为DCLK1/0,11X为保留的。

测试用的汇编程序如下:

        AREA    Example,CODE,READONLY;声明代码段Example

        ENTRY                        ;标示程序入口

        CODE32                       ;声明32位ARM指令

START   LDR     R0, =0x0005C011      ;FCLK=400MHz   

        LDR     R1, =0x4C000004     ;MPLLCON寄存器

        STR     R0,[R1]

       

        LDR     R0, =0x00000005       ;FCLK:HCLK:PCLK=1:4:8

        LDR     R1, =0x4C000014       ;CLOCK DIVIDER control

        STR     R0,[R1]

        LDR     R0, =(0xa<<18)

        LDR     R1, =0x56000070     ;端口H控制寄存器

        STR     R0,[R1]

 ;CLKOUT0、CLKOUT1引脚复用(选择GPH10-9的功能为CLKOUT0和1)

        LDR     R0, =(0x86<<3)     

 ;CLKOUT0和CLKOUT1分别输出HCLK及PCLK

        LDR     R1, =0x56000080     ;MISCCR寄存器

        STR     R0,[R1]

        END

测试没错的话就Okay了

posted on 2011-03-01 17:18  idle_man  阅读(5938)  评论(0编辑  收藏  举报

导航