时钟频率详解和编程

         晶振:其作用是产生原始的时钟频率,这个频率经过频率发生器的倍频或分频后就成了电脑中各种不同的总线频率;其本身不振荡但和外电路产生谐振。

        一般来讲系统都会有2个锁相环。这里就拿三星的S3C2440来作为例子吧。S3C2440有2个锁相环(PLL--- phase locked loop),一个是MPLL,一个是UPLL;MPLL用于CPU及其他外围器件。UPLL用于USB提供48MHz.外部时钟源经过MPLL处理后能够得到三种不同的系统时钟。他们分别是FCLK,HCLK,PCLK三种频率,这三种频率分别有不同的用途。

       FCLK是为CPU提供时钟信号,主频时钟,用于ART920T内核。

       HCLK是为AHB总线提供的时钟信号,主要用于高速外设,比如内存控制器,中断控制器,LCD控制器,DMA以及USB主模块等。

        PCLK是为APB总线提供的时钟信号,主要用于低速外设,比如看门狗,UART控制器,IIS,I2C,SDI/MMC,GPIO,RTC and SPI。 

        当系统上电或者复位时后,MPLL就可以工作,但此时MPLL的值并不是系统时钟,因为此时MPLL寄存器还没初始化,还是个无效的值,所以系统选择外部时钟晶振作为系统时钟。因此系统上电及复位后,必须向MPLL寄存器写入一个值,尽管这个值可能就是寄存器中的旧值。

        LOCKTIME寄存器:用于设置MPLL启动后稳定前所需等待的时间(Lock time),一般使用默认值。

        MPLLCON/UPLLCON寄存器设置:MDIV 主频控制位,PDIV 预分频控制位,SDIV 后分频控制位

       Mpll(FCLK) = (2 * m * Fin)/(p*2s

       Upll =  (m * Fin)/(p*2s

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

        时钟频率详解和编程_第1张图片

      FCLK、PCLK、HCLK 这三个系统时钟具有一地定的比例关系,这种关系是通过寄存器CLKDIVN中的HDIVN位和PDIVN位来控制的,因此我们知道了FCLK,再通过这2的控制就能确定HCLK,PCLK.而FCLK则是通过外部晶振频率Fin由上面公式可以得到。

   时钟频率详解和编程_第2张图片

 说了这么多,还是来理理顺序:
 下面的例子网上好多,先贴出来,然后再分析其本质是什么。

     mpll_val = (92<<12)|(1<<4)|(1);//至于为什么mpll_val这个值是(92<<12)|(1<<4)|(1),没有找到说明,个人分析有可能是大家的经验,或者是从后面逆推计算出来的。在Fin为12MHz情况下,要让主频达到400MHz,可以从后面开始逆推出来。


     定义mpll_val这个值实际是为了让倍频因子控制寄存器设定下面的值:

     MDIV=92  PDIV=1  SDIV=1 

     ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);


    函数原型:

      void ChangeMPllValue(int mdiv,int pdiv,int sdiv)

    {

       rMPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;

     }

函数功能:输入参数设定MPLLCON寄存器的值,即倍频因子寄存器的值。
再根据公式:

       Mpll(FCLK) = (2 * m * Fin)/(p*2s),m = MDIV + 8 =100;Fin 外部晶振频率为12MHz,p = PDIV+2 = 3,S = SDIV =1;

        所以得到:FCLK = Mpll = 400MHz

        得到了FCLK,要计算出PCLK和HCLK就比较容易了。设置下分频系数寄存器CLKDIVN中的HDIVN位和PDIVN位就可以了。下面是常用的分频系统。

    时钟频率详解和编程_第3张图片

        其实分频系数寄存器中HDIVN位要设置为10或者11时,还要设置下CAMDIVN寄存器:

       时钟频率详解和编程_第4张图片

        最后,再补上一个总结的图上去。

        时钟频率详解和编程_第5张图片


你可能感兴趣的:(嵌入式基础)