现在的位置: 首页 > 综合 > 正文

k60 mcg模块概述

2018年03月30日 ⁄ 综合 ⁄ 共 2660字 ⁄ 字号 评论关闭
文章目录

MCG模块详解

MCG模块简介

       MCG(Multipurpose  Clock  Generator)称为多用途时钟信号发生器,该模块为MCU和芯片内部各个模块提供时钟信号。MCG模块通过对输入的参考时钟进行分频和倍频处理,可以输出各种频率的时钟信号,并达到超频运行的目的。输入的参考时钟可以来自内部也可以来自外部时钟或外部晶振。输入的参考时钟一般经过分频后进入FLL(锁频环)或PLL(锁相环)进行倍频处理,当然也可以不通过FLL或PLL,而直接输出给各个模块。FLL是受内部参考时钟或者外部参考时钟控制,而PLL是受外部的参考时钟控制.一般情况下,我们会选择外部晶振的参考时钟,分频后由PLL倍频的方法来达到超频运行的目的。

      MCG模块框图如下:

     

MCG的核心是一个FLL(锁频环)和一个PLL(锁相环)。FLL和PLL都可以对输入的参考时钟倍频并锁定后输出,输出的时钟在SIM模块的控制下提供给CPU和各个模块。

MCG和相关的模块之间的关系如下图所示:

不同的参考时钟,以及不同的对参考时钟的处理方式的组合,使得MCG模块有9种不同的工作模式。9种模式及相互之间的转换如下图所示。

MCG模块在9种不同的工作模式下的输出时钟的表述如下图所示:

其中需要特别说明的是:

  1. FLL_R is the reference divider selected by the C1[FRDIV] bits, PLL_R is the reference divider selected by C5[PRDIV0] bits;
  2. F is the FLL factor selected by C4[DRST_DRS] and C4[DMX32] bits, and M is the multiplier selected by C6[VDIV0] bits.

由上表和9种模式的转换图,我们可以确定使用50M的外部晶振,MCG输出100M的代码思路为:让MCG工作在PEE模式下,并通过寄存器设置,使PLL_R为25,使M值为50,则可以获得100M的时钟输出.因此从复位后的FEI模式下,经过FEI->FBE->PBE->PEE的状态跳转,最终是MCG模块工作在PEE模式下.

如何切换到各个模块参见K60的用户手册.相关寄存器的配置参见K60的用户手册

模式跳转

 FEI转换到FBE

FEI是系统复位后MCG默认的工作模式,输出的时钟MCGOUTCLK来自FLL。FLL的参考时钟来自内部32K慢速时钟,FLL倍频后大约20MHz。在FBE模式下,MCGOUTCLK来自外部参考时钟,此时,FLL仍正常工作,但是FLL的参考时钟输入从内部慢速时钟切换到外部时钟。此时FLL产生的时钟并不输出。

从FEI到FBE的转换,主要改变的是MCGOUTCLK的来源从FLL切换到外部晶振,即MCG_C1寄存器的CLKS从00切换到10。同时FLL的参考时钟也从内部32K慢速时钟切换到晶振分频后的时钟,即MCG_C2寄存器中RANGE、HGO和EREFS都需要设置,而且MCG_C1寄存器中的FRDIV也需要合理设置以保证外部晶振分频后得到不大于32KHz的参考时钟提供给FLL。

        以4MHz外部晶振为例,首先设置MCG_C2寄存器,代码如下:

    MCG_C2 = MCG_C2_RANGE(1) | MCG_C2_HGO_MASK | MCG_C2_EREFS_MASK; 
    MCG_C1 = MCG_C1_CLKS(2) | MCG_C1_FRDIV(3); 

当设置完毕后,需查询MCG_S中的几个状态位以确保状态切换完成,才能进行后面的操作,查询状态位的代码如下:

    while (!(MCG_S & MCG_S_OSCINIT_MASK)){}    //等待锁相环初始化结束  
    while (MCG_S & MCG_S_IREFST_MASK){}    //等待时钟切换到外部参考时钟  
    while (((MCG_S & MCG_S_CLKST_MASK) >> MCG_S_CLKST_SHIFT)!= 0x2){}   //等待MCGOUTCLK切换到外部时钟输出 

 FBE切换到PBE

   PBE模式下,MCGOUTCLK输出时钟不变,仍然是外部晶振直接输出,所以MCG_C1中的CLKS不必改变。但是,在这一步,我们开始启用PLL工作,并计算好我们需要超频的倍率。在PBE模式下,PLL虽然已正常工作,PLL的时钟并不输出。在这一步,我们只要设置MCG_C5和MCG_C6两个寄存器。

    MCG_C5 = MCG_C5_PRDIV(1);//分频在2~4MHz之间,分频后频率2MHz                 
    MCG_C6 = MCG_C6_PLLS_MASK |MCG_C6_VDIV(26);  //选择PLL,倍频50倍  

    这里我们需要设置好MCGOUTCLK提供给系统核心、总线和FLASH的时钟分频,通过SIM模块的SIM_CLKDIV1来设置,由MCGOUTCLK提供给几个主要模块的时钟分频比,分别是CORE、BUS、FLEXBUS、FLASH。注意FLASH模块不可超过25MHz,否则出错。

    SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIV1(0)| SIM_CLKDIV1_OUTDIV2(1)  
                | SIM_CLKDIV1_OUTDIV3(1) |SIM_CLKDIV1_OUTDIV4(3);    
    //MCG=PLL, core = MCG, bus = MCG/3,FlexBus = MCG/3, Flash clock= MCG/8  


如按以上分频设置,当最终转换到FEE模式后,则系统核心频率为100MHz,BUS和FLEXBUS都为50MHz,FLASH为25MHz。

设置完毕后,需查询标志位以确保转换完成。代码如下

    while (!(MCG_S &MCG_S_PLLST_MASK)){}; // 等待切换到PLL   
    while (!(MCG_S &MCG_S_LOCK_MASK)){}; //等待PLL锁定频率  


PBE切换到PEE

在上面完成后,PLL输出的时钟已经准备完毕,只需要最后通过设置MCG_C1中的CLKS,把MCGOUTCLK的来源从外部晶振切换到PLL时钟即可。代码如下

    MCG_C1 &= ~MCG_C1_CLKS_MASK;//CLKS=00,PLL输出  
    while (((MCG_S & MCG_S_CLKST_MASK)>> MCG_S_CLKST_SHIFT) != 0x3){};//等待切换完毕。 

  参考地址:http://blog.csdn.net/hcx25909/article/details/7338432

抱歉!评论已关闭.