智能车制作

标题: K60超频代码 [打印本页]

作者: 尕玍紿    时间: 2013-12-11 10:45
标题: K60超频代码
求时钟配置相关寄存器资料:(SIM_SCGC5   MCG_C5  SIM_CLKDIV1   MCG_C6)
下面是龙丘的超频函数,看不大懂,求相关寄存器手册(chinese is the best!)
//锁相环频率为50/12*54=225M测试函数
void pllinit225M(void)
{
    uint32_t temp_reg;
   //使能IO端口时钟   
    SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK |  SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK |                     
                          SIM_SCGC5_PORTD_MASK | SIM_SCGC5_PORTE_MASK );
    //这里处在默认的FEI模式
    //首先移动到FBE模式
    MCG_C2 = 0;  
    //初始化晶振后释放锁定状态的振荡器和GPIO
    SIM_SCGC4 |= SIM_SCGC4_LLWU_MASK;
    LLWU_CS |= LLWU_CS_ACKISO_MASK;

    //选择外部晶振,参考分频器,清IREFS来启动外部晶振
    //011 If RANGE = 0, Divide Factor is 8; for all other RANGE values, Divide Factor is 256.
    MCG_C1 = MCG_C1_CLKS(2) | MCG_C1_FRDIV(3);

    //等待晶振稳定            
    while (MCG_S & MCG_S_IREFST_MASK){}                  //等待时钟切换到外部参考时钟
    while (((MCG_S & MCG_S_CLKST_MASK) >> MCG_S_CLKST_SHIFT) != 0x2){}

    //进入FBE模式,
    //0x18==25分频=2M,
    //0x08==15分频=3.333M
    //0x09==16分频=3.125M,
    //0x10==17分频=2.94M
    //0x11==18分频=2.7778M
    //0x12==19分频=2.63M,
    //0x13==20分频=2.5M   
    MCG_C5 = MCG_C5_PRDIV(0x0b);               

    //确保MCG_C6处于复位状态,禁止LOLIE、PLL、和时钟控制器,清PLL VCO分频器
    MCG_C6 = 0x0;

    //保存FMC_PFAPR当前的值
    temp_reg = FMC_PFAPR;

    //通过M&PFD置位M0PFD来禁止预取功能
    FMC_PFAPR |= FMC_PFAPR_M7PFD_MASK | FMC_PFAPR_M6PFD_MASK | FMC_PFAPR_M5PFD_MASK
                     | FMC_PFAPR_M4PFD_MASK | FMC_PFAPR_M3PFD_MASK | FMC_PFAPR_M2PFD_MASK
                     | FMC_PFAPR_M1PFD_MASK | FMC_PFAPR_M0PFD_MASK;   
    ///设置系统分频器
    //MCG=PLL, core = MCG, bus = MCG/3, FlexBus = MCG/3, Flash clock= MCG/9
    SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV2(2)
                 | SIM_CLKDIV1_OUTDIV3(2) | SIM_CLKDIV1_OUTDIV4(8);      

    //从新存FMC_PFAPR的原始值
    FMC_PFAPR = temp_reg;

    //设置VCO分频器,使能PLL为100MHz, LOLIE=0, PLLS=1, CME=0, VDIV=26
    MCG_C6 = MCG_C6_PLLS_MASK | MCG_C6_VDIV(30);  //VDIV = 31 (x54)
                                                  //VDIV = 26 (x50)
    while (!(MCG_S & MCG_S_PLLST_MASK)){}; // wait for PLL status bit to set   
    while (!(MCG_S & MCG_S_LOCK_MASK)){}; // Wait for LOCK bit to set   

    //进入PBE模式   
    //通过清零CLKS位来进入PEE模式
    // CLKS=0, FRDIV=3, IREFS=0, IRCLKEN=0, IREFSTEN=0
    MCG_C1 &= ~MCG_C1_CLKS_MASK;

    //等待时钟状态位更新
    while (((MCG_S & MCG_S_CLKST_MASK) >> MCG_S_CLKST_SHIFT) != 0x3){};
    //SIM_CLKDIV2 |= SIM_CLKDIV2_USBDIV(1);  

    //设置跟踪时钟为内核时钟
    SIM_SOPT2 |= SIM_SOPT2_TRACECLKSEL_MASK;       
    //在PTA6引脚上使能TRACE_CLKOU功能
    PORTA_PCR6 = ( PORT_PCR_MUX(0x7));  
    //使能FlexBus模块时钟
    SIM_SCGC7 |= SIM_SCGC7_FLEXBUS_MASK;
    //在PTA6引脚上使能FB_CLKOUT功能
    PORTC_PCR3 = ( PORT_PCR_MUX(0x5));
}


作者: 尕玍紿    时间: 2013-12-11 11:34
我觉得最主要的有三个地方:
1. MCG_C5 = MCG_C5_PRDIV(0x0b);  
这句是设置对外部时钟(50MHz)的分频,这里设置为12(0x0b+1=12)分频,这部分的输出做为 PLL时钟的输入(手册要求2-4MHz)。设置为12分频有点超了:50/12=4.1666666666666MHz 。


2.  //设置系统分频器
    SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV2(2) |
                           SIM_CLKDIV1_OUTDIV3(2) | SIM_CLKDIV1_OUTDIV4(8);
这句主要是配置芯片的各种时钟(以PLL输出的时钟为输入作分频),这里为:
   MCG=core =PLL, bus = PLL/3, FlexBus = PLL/3, Flash clock= PLL/9;
(到这里有点不明白的是:此时PLL输出的时钟为多少?前面第一点说了,PLL的输入时4.16,可是倍频数为多少我不清楚,是固定的吗?那固定值又为多少呢?)


3. MCG_C6 = MCG_C6_PLLS_MASK | MCG_C6_VDIV(30);
  这里是设置VCO分频器为54分频(时钟源为PLL的输出),但是得到的时钟是什么时钟我没了解到,有什么用也不清楚!


大鸟们,留步解析下吧...

作者: 尕玍紿    时间: 2013-12-11 17:02
尕玍紿 发表于 2013-12-11 11:34
我觉得最主要的有三个地方:
1. MCG_C5 = MCG_C5_PRDIV(0x0b);  
这句是设置对外部时钟(50MHz)的分频, ...

第三点搞清楚了,就是设置PLL的倍频值的!
以下提供些资料,学习时钟配置和定时器PWM配置的时候找的:
http://www.cnblogs.com/my-life/archive/2013/02/24/2923983.html

[attach]53334[/attach]
[attach]53333[/attach]
[attach]53332[/attach]

另外有一点搞不清楚的:
系统时钟指的是core时钟,还是bus时钟?理解到的是core时钟,但是我在计算PWM的时候用core时钟算出来与测出来的不一致,而用bus时钟算出来的就跟测出来的一致了。感觉很怪,不知道我哪里搞混了....

(我用的是K60)
我的计算方法:
PWM的频率 = 定时器时钟源的频率 / 定时器预分频值 / 计数值 (如果为向上向下计数方式还有除以2)







欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2