Shimejing

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
一、对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。
posted on 2014-09-12 20:29  Shimejing  阅读(671)  评论(0编辑  收藏  举报