• LCD实验学习笔记(四):系统时钟


    一般CPU频率(FCLK)高于内存、网卡等设备频率(HCLK),而串口、USB、I2C等设备频率(PCLK)更低。

    系统时钟:

      系统时钟源为晶振,初始频率12MHz。

      通过设置MPLLCON寄存器的MDIV、PDIV、SDIV(s3c2440手册上有时钟设置取值表),可设置系统时钟FCLK。

      [19:12]设置MDIV,[9:4]设置PDIV,[1:0]设置SDIV。

      设置公式:

        * S3C2410: MPLL(FCLK) = (m * Fin)/(p * 2^s)
        * S3C2410: MPLL(FCLK) = (2 * m * Fin)/(p * 2^s)
        * 其中: m = MDIV + 8, p = PDIV + 2, s = SDIV
        * 对于jz2440开发板,Fin = 12MHz

    分频:

      CPU工作于FCLK时钟;FCLK分倍频1/2或1/4等给内存、网卡、Nand flash等设备使用,即HCLK时钟;HCLK分倍频给串口、USB、I2C等低速设备,即PCLK时钟。

      通过设置CLKDIV寄存器,可以设置FCLK:HCLK:PCLK比例。[2:1]设置FCLK/HCLK,[0]设置HCLK/PCLK。

      s3c2440手册上有表可查,比如设置FCLK:HCLK=2:1,[2:1]取值01;设置HCLK=PCLK,需[0]=0;设HCLK:PCLK=2:1,需设置[0]=1。

    锁定时间:

      提高系统时钟频率,需要一个时钟停止的时间段,这段时间CPU停摆。通过设置LOCKTIME寄存器可以设置这个锁定时间,一般用默认值即可。

    例子:

      比如设置CPU时钟FCLK=200MHz,需设置MPLLCON的PDIV=0x5c,PDIV=1,SDIV=2;

      设置HCLK=100MHz,PCLK=50MHz,需设置CLKDIV,使其[2:1]为01,[0]为1。

      代码如下:


    /*clock registers*/

    #define LOCKTIME (*(volatile unsigned long *)0x4c000000)
    #define MPLLCON (*(volatile unsigned long *)0x4c000004)
    #define UPLLCON (*(volatile unsigned long *)0x4c000008)
    #define CLKCON (*(volatile unsigned long *)0x4c00000c)
    #define CLKSLOW (*(volatile unsigned long *)0x4c000010)
    #define CLKDIVN (*(volatile unsigned long *)0x4c000014)

    #define FCLK 200000000
    #define HCLK 100000000
    #define PCLK 50000000
    #define S3C2410_MPLL_200MHZ ((0x5c<<12)|(0x04<<4)|(0x00))
    #define S3C2440_MPLL_200MHZ ((0x5c<<12)|(0x01<<4)|(0x02))

    void clock_init(void)
    {
      // LOCKTIME = 0x00ffffff; // 使用默认值即可
      CLKDIVN = 0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1

      /* s3c2440手册十几个定的设置:如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */
      __asm__(
        "mrc p15, 0, r1, c1, c0, 0 " /* 读出控制寄存器 */
        "orr r1, r1, #0xc0000000 " /* 设置为“asynchronous bus mode” */
        "mcr p15, 0, r1, c1, c0, 0 " /* 写入控制寄存器 */
      );

      /* 判断是S3C2410还是S3C2440 */
      if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002))
      {
        MPLLCON = S3C2410_MPLL_200MHZ; /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */
      }
      else
      {
        MPLLCON = S3C2440_MPLL_200MHZ; /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */
      }
    }


  • 相关阅读:
    Git ---游离状态下的commit 分支切换与找回,commit之后无法找到历史记录
    mybatis异常invalid comparison: java.util.Date and java.lang.String
    Spring的注解@Qualifier
    Spring @Bean注解的使用
    Java的IO系统
    linkin大话面向对象--GC和jar包
    linkin大话面向对象--闭包和回调
    linkin大话面向对象--内部类
    linkin大话面向对象--枚举
    linkin大话面向对象--接口
  • 原文地址:https://www.cnblogs.com/sekon/p/6440686.html
Copyright © 2020-2023  润新知