zoukankan      html  css  js  c++  java
  • 7th.关于系统时钟的设置

     言简意赅版本:

    开启MPLL

    1. 设置LOCKTIME寄存器 (设置锁定时间)
    2. 设置MPLLCON寄存器(设置主频与FCLK的关系)
    3. 设置CLKDIVN寄存器(设置FCLK,HCLK,UCLK的倍数关系)

     MPLLCON参照官方提供参数配置即可。

     

     

     

    详细情况

     

    开发板在没有开启时钟前,整个开发板全靠一个12MHz的晶振提供频率来运行,当MPLLCON存入初值,并开始生效后,S3C2440A可以正常工作在400MHz下。开发板的主板上的外设和CPU也有一个频率限度,ARM920T内核的S3C2440的最高正常工作频率如下:

          FCLK:400MHz

          HCLK:100MHz

          PCLK:50MHz

    那如何让时钟由12MHZ提高到400MHZ呢?

    答案是通过PLL(锁相环)

    一、S3C2440上的工作时钟频率

         S3C2440上的高频工作时钟频率有FCLK,HCLK,PCLK,由MPLL产生。USB提供工作频率(48MHZ)由UPLL产生。

         FCLK主要为ARM920T内核提供工作频率,即我们常说的CPU主频。

         HCLK主要为S3C2440 AHB总线(Advanced High performance Bus)上挂接硬件提供工作频率,AHB总线主要挂接有内存,NAND,LCD控制器等硬件,如图1-1所示:

     

          PCLK主要为APB总线提供工作频率,由图1-2所示,APB总线主要挂接UART串口,Watchdog等硬件控制器。

     

    FCLK,HCLK,PCLK之间存在一定的关系。

    当HDIV=0时,HCLK=FCLK;当HDIV=1时,HCLK=FCLK/2;

    当PDIV=0时,PCLK=HCLK;当PDIV=1时,PCLK=HCLK/2;

    三者关系通过CLKDIVN寄存器进行设置,S3C2440时钟设置时,还要额外设置CAMDIVN(0X4C000018,照相机时钟分割寄存器),寄存器如下表,HCLK4_HALF,HCLK3_HALF分别与CAMDIVN[9:8]对应,下表列出了各种时钟比例:

     

     

    如果HDIV设置为非0,CPU的总线模式要进行改变,默认情况下FCLK = HCLK,CPU工作在fast bus mode快速总线模式下,HDIV设置为非0后, FCLK与HCLK不再相等,要将CPU改为asynchronous bus mod异步总线模式(S3C2440无同步总线模式),可以通过下面的嵌入汇编代码实现:

    __asm{ 

    mrc p15, 0, r1, c1, c0, 0        /* 读取CP15 C1寄存器 */ 

    orr r1, r1, #0xc0000000        /* 设置CPU总线模式 */ 

    mcr p15, 0, r1, c1, c0, 0        /* 写回CP15 C1寄存器*/

    注意:如果HDIVN不为0,且CPU总线模式为Fast Bus mode,CPU的时钟为HCLK.,这种方式可以用在将CPU频率降低,但是却又不改变HCLK和PCLK.

     

    表1-3时钟分频器控制寄存器(CLKDIVN)

    寄存器名

    地址

    是否读写

    描述

    复位默认值

    CLKDIVN

    0x4C000014

    R/W

    时钟分频器控制寄存器

    0x00000000

     

    CLKDIVN

    描述

    初始值

    DIV_UPLL

    [3]

    UCLK选择寄存器(UCLK必须对USB提供48MHz)

    0:UCLK=UPLL clock

    1:UCLK=UPLL clock/2

    0

    HDIVN

    [2:1]

    00:HCLK = FCLK/1

    01:HCLK = FCLK/2

    10:HCLK = FCLK/4,当CAMIVN[9]=0

    HCLK = FCLK/8,当CAMIVN[9]=1

    11: HCLK = FCLK/3,当CAMIVN[8]=0

    HCLK = FCLK/6,当CAMIVN[8]=1

    0

    PDIVN

    [0]

    0:PCLK是和HCLK/1相同时钟

    1:PCLK是和HCLK/2相同时钟

    0

    表1-4摄像头时钟分频控制寄存器(CAMDIVN)

    寄存器名

    地址

    是否读写

    描述

    复位默认值

    CAMDIVN

    0x4C000018

    R/W

    摄像头时钟分频控制寄存器

    0x00000000

     

    CAMDIVN

    描述

    初始值

    HCLK4_HALF

    [9]

    HDIVN分频因子选择位(当CLKIVN[2:1]位为10b时有效)

    0: HCLK=FCLK/4

    1: HCLK=FCLK/8

    0

    HCLK3_HALF

    [8]

    HDIVN分频因子选择位(当CLKIVN[2:1]位为11b时有效)

    0: HCLK=FCLK/3

    1: HCLK=FCLK/6

    0

     

    二、MPLL工作过程

           开发板上电后,晶振OSC开始提供晶振时钟,由于系统刚刚上电,电压信号等都还不稳定,这时复位信号(nRESET)拉低,这时MPLL虽然默认启动,但是如果不向MPLLCON中写入值,那么外部晶振则直接作为系统时钟FCLK,过几毫秒后,复位信号上拉,CPU开始取指运行,这时可以通过代码设置启动MPLL,MPLL启动需要一定锁定时间(LockTime),这是因为MPLL输出频率还没有稳定,在这期间FCLK都停止输出,CPU停止工作,过了LockTime后时钟稳定输出,CPU工作在新设置的频率下,这时可以通过设置FCLK,HCLK和PCLK三者的频率比例来产生不同总线上需要的不同频率,下面详细介绍开启MPLL的过程:

    l  设置LockTime变频锁定时间

    l  设置FCLK与晶振输入频率(Fin)的倍数

    l  设置FCLK,HCLK,PCLK三者之间的比例

    LockTime变频锁定时间由LOCKTIME寄存器(见下表)来设置,由于变频后开发板所有依赖时钟工作的硬件都需要一小段调整时间,即MPLL设置生效的等待时间。该时间计数通过设置LOCKTIME寄存器[31:16]来设置UPLL(USB时钟锁相环)调整时间,通过设置LOCKTIME寄存器 [15:0]设置MPLL调整时间,这两个调整时间数值一般用其默认值即可。

    注意:

           在系统正常工作时,如果要改变FCLK,写入新值到MPLLCON后,系统也会插入一个PLL LOCK TIME,300us后FCLK就变成新的频率。当退出慢时钟模式时,要先启动MPLL,这时,即使从新装载初值,也要有一定的稳定时间LOCKTIME。

     

    表2-1变频锁定时间寄存器(LOCKTIME)

    寄存器名

    地址

    是否读写

    描述

    复位默认值

    LOCKTIME

    0x4C000000

    R/W

    变频锁定时间寄存器

    0xFFFFFFFF

     

    LOCKTIME

    描述

    初始值

    U_TIME

    [31:16]

    UPLL对UCLK的锁定时间值

    (U_TIME:300us)

    0xFFFF

    M_TIME

    [15:0]

    MPLL对于FCLK,HCLK,PCLK的锁定时间值(M_TIME:300us)

    0xFFFF

    FCLK与Fin的倍数通过MPLLCON寄存器设置,三者之前有以下关系:

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

    其中:m = MDIV + 8, p = PDIV + 2, s = SDIV

    当设置完MPLL之后,就会自动进入LockTime变频锁定期间,LockTime之后,MPLL输出稳定时钟频率。

     表2-2MPLL配置寄存器(MPLLCON)

    寄存器名

    地址

    是否读写

    描述

    复位默认值

    MPLLCON

    0x4C000004

    R/W

    MPLL配置寄存器

    0x00096030

     

    MPLLCON

    描述

    初始值

    MDIV

    [19:12]

    主分频器控制位

    0x96

    PDIV

    [9:4]

    预分频器控制位

    0x03

    SDIV

    [1:0]

    后分频器控制位

    0x0

    通过上述算法比较难以找到合适的PLL值,下表给出了官方推荐的一些MPLL参考设置:

       表2-3:

     

  • 相关阅读:
    关于在Eclipse中使用正则表达式替换的一点记录(使用正则表达式的分组)
    C#学习笔记(六):可空类型、匿名方法和迭代器
    C#学习笔记(五):泛型
    C#学习笔记(四):委托和事件
    C#学习笔记(三):值类型、引用类型及参数传递
    C#学习笔记(二):继承、接口和抽象类
    Unity3D之AssetBundle学习:Android上运行笔记
    js arguments 内置对象
    JS面向对象高级特性
    js 阻止事件冒泡 支持所有主流浏览器
  • 原文地址:https://www.cnblogs.com/asam/p/6379597.html
Copyright © 2011-2022 走看看