zoukankan      html  css  js  c++  java
  • FCLK PCLK HCLK

    一、对clock的基本认识
    1 s3c2410的clock & power management模块包含三个部分:clock control、usb control、power control。现在的关注点是clock control。
        2、s3c2410有两个pll(phase locked loop,锁相环,在高频中学过,可以实现倍频,s3c2410的高频就是由此电路产生的)。其中一个是MPLL,M即为main,用来产生三种时钟信号:Fclk(给CPU核供给时钟信号,我们所说的s3c2410的cpu主频为200MHz,就是指的这个时钟信号,相应的,1/Fclk即为cpu时钟周期)、Hclk(为AHB bus peripherals供给时钟信号,AHB为advanced high-performance bus)、Pclk(为APB bus peripherals供给时钟信号,APB为advanced peripherals bus)。 在这里,需要了解一下AMBA system architecture了。这个可以到官方网站 www.arm.com 下载相关资料。简单的说,AMBA是一种协议,这种协议已经称为片上组织通信的事实上的标准(the de facto standard for on-chip fabric communication)。下面给出英文描述:
        The AMBA protocol is an open standard, on-chip bus specification that details a stategy for the interconnection and management of functional blocks that makes up a system-on-chip(SoC).It facilitates "right-first-time" development of embedded processors with one or more CPU/signal processors and multiple peripherals. The AMBA protocol enhances a resuable design methodology by defining a common backbone for SoC modules.
        需要知道的是,AMBA总线是ARM提出的一种解决方案,它并非唯一的规范,但是因为ARM的广泛使用,AMBA总线也就成为了事实上的规范了。现在AMBA总线最新为AMBA 3 specification版本,包括AMBA 3 AXI Interface、AMBA 3 AHB Interface、AMBA 3 APB Interface、AMBA 3 ATB Interface。而s3c2410还只能支持AMBA 2 specification,这个版本包含AMBA 2 AHB Interface、AMBA 2 APB Interface。也就是在s3c2410的框图中看到的两种总线接口。需 要注意的是,这两种总线所连的外设是有区别的。AHB总线连接高速外设,低速外设则通过APB总线互连。显然,对不同总线上的外设,应该使用不同的时钟信 号,AHB总线对应Hclk,APB总线对应Pclk。那么事先就应该弄清楚,每条总线对应的外设有那些,这样在设置好时钟信号后,对应外设的初始化的值 就要依此而确定了。
        AHB bus上的外设有LCD controller(CONT代表controller,控制器)、USB Host CONT、ExtMaster、Nand CONT和nand flash boot loader、bus CONT、interrupt CONT、power management、memory CONT(sram/nor/sdram等)。
        APB bus上的外设有UART、USB device、SDI/MMC、Watch Dog Timer、bus CONT、spi、iic、iis、gpio、rtc、adc、timer/pwm。
        3、主时钟源来自外部晶振或者外部时钟。复位后,MPLL虽然默认启动,但是如果不向MPLLCON中写入value,那么外部晶振直接作为系统时钟。 EDUKIT-III的外部晶振有两个,一是用于系统时钟,为12MHz;一个用于RTC,为32.768KHz。以前实验没有向MPLLCON写入数 值,所以系统时钟都是12MHz。从这里也可以发现一个问题,如果外部晶振开始没有焊上,那么系统是无法正常启动的。因为按照上述规则,复位后还没有写入 MPLLCON,这时又没有可以使用的时钟源,所以不会启动。也就是硬件完成后,这个12MHz的晶振是一定要焊上的,才能进行后续的硬件测试工作。
    二、clock设置的步骤
        首先应该读懂下一段:

    Power- On Reset  ( XTIpll)
    Figure 7- 4 shows the clock  behavior during the power- on reset sequence.  The crystal oscillator begins oscillation within several milliseconds.  When nRESET is released after the stabilization of OSC ( XTIpll)  clock ,  the PLL starts to operate according to thedefault  PLL configuration.  However,  PLL is commonly known to be unstable after power- on reset ,  so Fin is fed directly to FCLK instead of the Mpll ( PLL output)  before the software newly configures the PLLCON.  Even if  the user does not  want to change the default  value of PLLCON register  after reset ,  the user shouldwrite  the same value into PLLCON register  by software.


    The PLL restarts the lockup sequence toward the new  frequency only after the software configures the PLL with a new  frequency.  FCLK can be configured as PLL output ( Mpll)  immediately after locktime .

        这个主要是基于PLL的特点。简单的描述就是,上电复位后,几个ms后晶振起振。当OSC时钟信号稳定之后,nRESET电平拉高(这是硬件自动检测过 程)。这个时候,PLL开始按照默认的PLL配置开始工作,但是特殊性就在于PLL在上电复位后开始是不稳定的,所以s3c2410设计为把Fin在上电 复位后直接作为Fclk,这是MPLL是不起作用的。如果要想是MPLL起作用,那么方法就是写入MPLLCON寄存器值,然后等待LOCKTIME时间 后,新的Fclk开始工作。下面把这些步骤分来来描述,软件步骤部分结合程序进行。
        1、上电几个ms后,晶振输出稳定。Fclk=晶振频率。nRESET恢复高电平后,cpu开始执行指令,这完全是硬件动作,不需要软件设置。
        2、第一步软件工作: 设置P M S divider control,也就是设置MPLLCON寄存器。
        关于PMS,可以看Figure 7-2.寄存器MPLLCON的设置呢,其实有一定的规则,并非你想要的每个Fclk频率都可以得到。官方推荐了一个表PLL VALUE SELECTION TABLE,要按照这个进行。否则的话,就需要自己按照公式推算,但是mizi公司并不保证你的设置是合适的。所以,如果想要工作在200MHz,还是按照vivi的推荐值即可。

    @ step1:  set P M S divider control
            mov  r1,  #CLK_CTL_BASE
             ldr r2,  = vMPLLCON_200
            str  r2,  [ r1,  #oMPLLCON]

        其中,MDIV=0x5c,PDIV=0x04,SDIV=0x00.公式Mpll(Fclk)=(m×Fin)/(p×(2^s))【m=MDIV+8, p=PDIV+2,s=SDIV】
        3、第二步软件工作: 设置CLKDIVN。
        这一步是设置分频系数,即Fclk为cpu主频,Hclk由Fclk分频得到,Pclk由Hclk分频得到。假设Hclk是Fclk的二分频,Pclk是 Hclk的二分频,那么分频系数比就是Fclk:Hclk:Pclk=1:2:4.那么Hclk为100MHz,总线时钟周期为10ns。Pclk为 50MHz。

    @ step2:  change clock divider
            mov  r1,  #CLK_CTL_BASE
            mov  r2,  #vCLKDIVN
            str  r2,  [ r1,  #oCLKDIVN]

        4、第三步软件工作: CLKDIVN的补充设置
      

    If  HDIVN =  1,  the CPU bus mode has to be changed from the fast bus mode to the asynchronous bus mode using  following instructions.
    MMU_SetAsyncBusMode
            mrc p15, 0, r0, c1, c0, 0
            orr r0, r0, # R1_nF: OR : R1_iA
            mcr p15, 0, r0, c1, c0, 0
    If  HDIVN= 1 and  the CPU bus mode is the fast bus mode,  the CPU will operate by the HCLK.  This  feature can be used to change the CPU frequency as a half without affecting the HCLK and  PCLK.

        看了上段话,只需要翻译出来就可以了。

    @ FCLK: HCLK= 1: 2
    . macro  MMU_SetAsyncBusMode
             mrc p15,  0,  r0,  c1,  c0,  0
             orr r0,  r0,  #( R1_iA |  R1_nF)
             mcr p15,  0,  r0,  c1,  c0,  0
    . endm
             @ step3:  set asynchronous bus mode
             MMU_SetAsyncBusMode

        5、第四步软件工作:等待locktime时间,让新的Fclk生效

    @ step4:  stay locktime 
            mov  r1,  #CLK_CTL_BASE
             ldr r2,  = vLOCKTIME
            str  r2,  [ r1,  #oLOCKTIME]

        6、对外设的影响
        在这个实验中,主要是有两个需要改变,一个外设是UART,一个外设是SDRAM。
        (1)UART,它是接在APB总线上,所以对应的时钟信号为Pclk,现在为50MHz。如果想要设置波特率为115200bps,那么根据公式 UBRDIV0=(int)(PCLK/(bps*16))-1计算,应该为26。如果放到程序中,那么应该注意形式。具体如下:

    UBRDIV0 =  ( ( int ) ( PCLK/ 16. / UART_BAUD_RATE)  - 1) ;

        (2)SDRAM,主要的影响因素为刷新频率。前面在SDRAM中没有具体分析,现在可以详细说明。使用了两片HY57V561620CT-H,查看手册其刷新频率为8192 refresh cycles/64ms,所以刷新周期64ms/8192=7.8125us。看寄存器REFRESH的各个位的设置情况:
        ·REFEN[23]:开启自动模式,设为1
        ·TREFMD[22]:设为Auto refresh模式,设为0
        ·Trp[21:20]:看看RAS precharge Time,查看SDRAM手册,发现-H系列此参数至少为20ns,现在Hclk对应的时钟周期为10ns,所以至少应该为2个clock。可以设为00
        ·Tsrc: Semi Row Cycle Time,也就是RAS Cycle Time,至少65ms,所以至少得6.5clock,按照可选值,应该设置为11
        ·Refresh[10:0]:
        公式refresh period = (2^11 - refresh_count +1)/Hclk,由此推导出refresh_count=2^11+1-refresh period*Hclk。带入数值,计算得出1268=0x04f4,这个数值要用四舍五入,减少误差。
        ·其余的保留值,均设置为0
        由此得出该寄存器的值应该为0x008c04f4。
  • 相关阅读:
    iOS 开发中的坑与相关技巧
    SDK 封装的相关看法
    线程问题---在iPad上会崩溃,在iPhone上不会崩溃
    添加新手引导页需要注意的几个小点
    iOS 七牛云上传并获取图片----【客户端】
    iOS 线程相关-----绝对de干货
    Vue.js 基础示例
    lib-flexible 结合 WKWebView 的样式错乱解决方法
    基于CommentCoreLibrary简单的弹幕实现
    页面上动态编译及执行java代码
  • 原文地址:https://www.cnblogs.com/0822vaj/p/3969034.html
Copyright © 2011-2022 走看看