• S3C2440的时钟原理


    Crystal 无源晶体
    Oscillator 有源晶体(里面有有源器件)

    无源晶振内只有一片按一定轴向切割的石英晶体薄片,供接入运放(或微处理器的XTAL端)

    以形成振荡.有源晶振内带运放,工作在最佳状态,电源后,可直接输出一定频率的等幅正弦波,

    一般至少有4引脚,体积稍大.

    对于任何一个单片机,要使用它首先就要弄明白他的时钟系统,MCU的时钟就像人的心脏,跳动的快慢,决定着系统的工作速度。S3C2440的datesheet上说,可以达到400M,但是也不是说,必须在400M的频率下工作,主时钟晶振来自于外部晶振(XTIPLL)或者是外部时钟(EXTCLK)。时钟生成器包含了一个振荡器(振荡放大器),其连接外部晶振,并且还有2个PLL,可以产生需要的高频。

    通过引脚OM[3:2]来决定时钟源是Crystal还是EXTCLK,不过我用的开发板将OM[3:2]固定接地了,都是用外部晶振。有一点值得注意,在对MPLLCON写入有效值之前,系统使用外部晶振或外部时钟源的时钟。即使用户不准备改变MPLLCON的值,也应当重新写一次。

    简单说一下,S3C2440的时钟构成。

    S3C2440具有2个PLL(Phase Locked Loop:用来产生高频的电路),一个是MPLL, 用于产生FCLK, HCLK, PCLK三种频率, 这三种频率分别有不同的用途:

    FCLK是CPU提供的时钟信号,如果提到CPU的主频是400MHz,就是指的这个时钟信号。
    HCLK是为AHB总线提供的时钟信号, Advanced High-performance Bus,主要用于高速外设,比如内存控制器,中断控制器,LCD控制器, DMA 以及USB host 。

    PCLK是为APB总线提供的时钟信号,Advanced Peripherals Bus,主要用于低速外设,比如WATCHDOG,IIS, I2C, SDI/MMC, GPIO,RTC ,UART,PWM,ADC and SPI等等。

    另外一个是UPLL,专门用于驱动USB host/Device。并且驱动USB host/Device的频率必须为48MHz。

    在系统复位之后,如果没有设定PLL,则采用外部晶振的频率作为FCLK,同时FCLK:HCLK:PCLK的比例关系为1:1:1。

    下面说一些跟时钟有关的寄存器设置:通过改变CLKDIVN可以改变FCLK,HCLK,PCLK的分频比。

    锁定时间计数寄存器LOCKTIME(0x4c000000):一般使用默认就可以。

    锁相环控制寄存器[MPLLCON(0x4c000004)&UPLLCON(0x4c000008)]:

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

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

    P,M范围:1<=P<=62,1<=M<=248

    注意:MDIV[19:12],PDIV[9:4],SDIV[1:0],当设置MPLL和UPLL值的时候,需要先设置UPLL再设置MPLL

    例如:MPLLCON = (92<<12) | (1<<4) |(1);//FCLK=400M

    这里MDIV=92,PDIV=1,SDIV=1,那么m=100,p=3,s=1,且Fin=12M,所以FCLK=400M

    再设置CLKDIVN=0x03;//FCLK:HCLK:PCLK=1:2:4

    这里CLKDIVN(0x4c000014)用于决定三者的分配比例

    一般设置这两个就可以了。还有一个时钟控制寄存器CLKCON(0x4c00000c)向相应位写1使能相应时钟,不过一般默认为1.

    overview
    时钟和电源管理这一块内容包括三个部分:时钟控制, USB控制, 电源控制

            在s3c2440a的CPU上,时钟控制逻辑可以产生需要的时钟信号,包括给CPU用的FCLK, 给AHB总线外设用的HCLK以及给APB总线外设用的PCLK.S3C2440A含有两个锁相环:一个是FCLK, HCLK和PCLK, 还有另外一个专门用于USB单元(48Hz).时钟控制逻辑可以在没有PLL的时候使时钟变慢,并且可以用软件的方法使时钟与周边设备连接与断开, 这个功能可以节省功耗.

    补充:
        AMBA总线 

    先进的微控制器总线体系结构AMBA规范定义了三种总线: 

    (1)AHB(Advanced High-performance Bus):用于连接高性能系统模块。它支持突发数据传输方式及单个数据传输方式,所有时序参考同一个时钟沿; 

    (2)ASB(Advanced System Bus):用于连接高性能系统模块,它支持突发数据传输模式; 

    (3)APB(Advance Peripheral Bus):是一个简单接口支持低性能的外围接口。


            对于电源控制逻辑,S3C2440A有不同的电源管理的主题,来对某一项任务来优化电源功耗.S3C2440A中的电源管理单元可以有四种模式: 普通模式, SLOW 模式, IDLE模式, SLEEP模式.

    功能描述

    时钟架构
    时钟产生器包括一个连接在外部crystal上的晶振,并且有两用于产生S3C2440A所需要的高频信号的锁相环.

    时钟源的选择
    下表显示了芯片模式控制引脚(OM3和OM2)的选择与S3C2440A时钟源的关系. 

    注意:
    1) 尽管重启后,MPLL会启动,但是直到软件正确设置了MPLLCON寄存器后,MPLL的输出才作为系统的时钟.在正确的设置被设置前,来自外部的crystal或extclk源直接作为系统时钟.即使用户并不想改变MPLLCON寄存器的默认值,用户应该在MPLLCON的寄存器中设置同样的值. 
    2) OM[3:2]用于决定测试模式,当OM[1:0]是11的时候.

    锁相环
    在时钟产生器中的MPLL,作为一个电路,作用是在频率与相伴上同步输出信号与一个参考输入信号.

    时钟控制逻辑
    时钟控制逻辑决定使用的信号源,PLL时钟或外部时钟. 当PLL配置成一个新的频率时,时钟控制逻辑中止FCLK的使用,直到使用PLL锁时间的PLL的输出稳定后. 这种时钟控制逻辑在通电重启或从节电模式中醒来都起作用.

    通电重启(XTIpll)

    在普通模式中变换PLL的设置

    USB时钟控制

    FCLK, HCLK, PCLK
    FCLK 用于ARM920T
    HCLK 用于AHB总线,AHB总线被ARM920T用于,内存控制器,中断控制器,LCD控制器,DMA和USB host block.
    PCLK 用于APB总线,APB总线是用于周边设备的,如是WDT,IIS, I2C, PWM 计数器, MMC接口, ADC, UART, GPIO, RTC 和SPI

    注意:
    1) CLKDIVN必须小心设置,不要超过HCLK和PCLK的允许范围.
    2) 如果HDIVN不是0,CPU总线模式必须从快速总线模式转换到异步总线模式,通过使用下面的指令来达到.(S3C2440不支持同步总线模式)
    MMU_SetAsyncBusMode
    mrc p15, 0, r0, c1, c0, 0
    orr r0, r0, #R1_nF:OR:R1_iA
    mcr p15, 0, r0, c1, c0, 0
    如果HDIVN不是0, 并且CPU总线模式是快速总线模式,那么CPU将会在HCLK下工作.这种特性可以用来在不影响HCLK和PCLK的情况下改变CPU频率成原来的一半或更多.

    电源管理
    在S3C2440A中,电源管理模块通过软件来控制系统时钟以达到减少电源功耗的功能.这些主题跟PLL,时钟控制逻辑(FCLK,HCLK,PCLK)和唤醒信号有关.

    S3C2440A有四种电源模式.下面的部分描述各种模式.各种模式之间的转换并不是随意的.

    FCLK的值如何得到?

    FCLK= Fout = 2 * m * Fin / (p*2^s), Fvco = 2 * m * Fin / p where : m=MDIV+8, p=PDIV+2, s=SDIV

    MPLLVal [M:7fh,P:2h,S:1h]  bootloader打印出来的信息.

    code

    mov r1, #0x4c000000

    ldr r2, =0x7f021

    str r2, [r1, #0x04]

    与BOOTLOADER里打印出来的一样.

    ^ 代表幂

    So, FCLK =2* (127+8)*12M/4*2=405M    

    关于HCLK, PCLK的值,取决于CLKDIVN的值.

    代码如下:

    mov r1, #0x4c000000

    ldr r2, 0x5

    str r2, [r1, #0x14]

    所以CLKDIVN=5, HDIVN=10,  PDIVN=1, 再看CAMDIVN

    10: HCLK = FCLK/4 when CAMDIVN[9]=0

          HCLK = FCLK/8 when CAMDIVN[9]=1

    PCLK = HCLK /2  

    CAMDIVN代码中没有进行设置,就用初始值.0



    HCLK = FCLK/4

    PCLK = FCLK/8

    至此, clock部分设置结束.

  • 相关阅读:
    Python+Selenium自动化总结
    Python+Selenium自动化-定位一组元素,单选框、复选框的选中方法
    Python+Selenium自动化-模拟键盘操作
    【leetcode】1053. Previous Permutation With One Swap
    【leetcode】1052. Grumpy Bookstore Owner
    【leetcode】1034. Coloring A Border
    【leetcode】1042. Flower Planting With No Adjacent
    【leetcode】1035. Uncrossed Lines
    【leetcode】1048. Longest String Chain
    【leetcode】1047. Remove All Adjacent Duplicates In String
  • 原文地址:https://www.cnblogs.com/lemaden/p/10376562.html
Copyright © 2020-2023  润新知