注册 登录
查看: 2838|回复: 31

[其他] KL26的超频问题

[复制链接]
发表于 2014-2-22 20:17:20 | 显示全部楼层 |阅读模式
在Board\Inc\FIRE_MKL_conf.h平台配置头文件里配置超频

方式一:
#define PLL_CLK                PLL80
#define MAX_CORE_CLK            80
#define MAX_BUS_CLK             40

方式二:
#define PLL_CLK                PLL48
#define MAX_CORE_CLK            80
#define MAX_BUS_CLK             40

以上两种方式配置的数据,最终PLL_CLK、CORE_CLK、BUS_CLK分别获得的多少?怎么算的?

=======
by 山外メ雲ジ:修改标题和加入蓝色字体
KL26的频率由PLL分频得来,即PLL频率必然是最大的。
KL26只有 CORE 、BUS、Flash频率,而BUS和Flash频率都是相同的频率,故我们的代码里仅保留CORE和BUS频率设置。
频率设置是配置最大值,所以前面有个MAX的标记,但频率必须是从PLL分频而来,必须是整除关系。
即 CORE 和 BUS 只能在 PLL、PLL/2、PLL/3、……、PLL/15中取值
我们的代码会自动计算符合不大于最大值的最大频率。


推荐阅读:
K60 KL26 主频和总线频率的关系
http://www.vcan123.com/forum.php?mod=viewthread&tid=81&ctid=9


本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2014-2-22 20:34:35 | 显示全部楼层
KL没用过,不清楚,之前的K60没有MAX_CORE_CLK这个定义的啊
回复 支持 反对

使用道具 举报

发表于 2014-2-22 23:00:15 | 显示全部楼层
这个看源代码,应该比较容易懂啊

MCG和BUS 都是从PLL分频出来的,必须是整数倍关系

方式一:
#define PLL_CLK                PLL80
#define MAX_CORE_CLK            80
#define MAX_BUS_CLK             40

PLL是 80,CORE 一分频刚好就 80,BUS 二分频刚好是40,所以都符合最大值要求。即PLL 80、MCG 80、BUS 40.

方式二:
#define PLL_CLK                PLL48
#define MAX_CORE_CLK            80
#define MAX_BUS_CLK             40

PLL 是 48 ,CORE 一分频就 48,< 80 ,符合条件,所以CORE是 48。BUS 二分频 是 24 < 40,所以 BUS 是24.即 PLL 48 ,CORE 48 ,BUS 24
回复 支持 反对

使用道具 举报

发表于 2014-3-30 16:46:31 | 显示全部楼层
兄弟   你超频了么?我最近想超频啊!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-9 19:35:07 | 显示全部楼层
KL26 发表于 2014-3-30 16:46
兄弟   你超频了么?我最近想超频啊!!!

电磁觉得不需要超频。48、48、24就可以了。
回复 支持 反对

使用道具 举报

发表于 2014-4-9 19:44:22 | 显示全部楼层
BMN李 发表于 2014-4-9 19:35
电磁觉得不需要超频。48、48、24就可以了。

我是摄像头的  所以必须超频啊  你会不》 亲
回复 支持 反对

使用道具 举报

发表于 2014-4-9 22:11:48 | 显示全部楼层
KL26 发表于 2014-4-9 19:44
我是摄像头的  所以必须超频啊  你会不》 亲

超频,只需要改变 这些宏定义而已啊
回复 支持 反对

使用道具 举报

发表于 2014-4-9 22:26:41 | 显示全部楼层
风落小鱼 发表于 2014-4-9 22:11
超频,只需要改变 这些宏定义而已啊

亲 我试过  但是通过不了啊 而且程序找不到驱动了
回复 支持 反对

使用道具 举报

发表于 2014-4-9 22:30:47 | 显示全部楼层
KL26 发表于 2014-4-9 22:26
亲 我试过  但是通过不了啊 而且程序找不到驱动了

PLL200 这些定义是有专门的地方定义的,你跳到定义处看看。不是任意的
回复 支持 反对

使用道具 举报

发表于 2014-4-9 22:38:41 | 显示全部楼层
风落小鱼 发表于 2014-4-9 22:30
PLL200 这些定义是有专门的地方定义的,你跳到定义处看看。不是任意的

亲  你超频成功了么???求指导啊
回复 支持 反对

使用道具 举报

发表于 2014-4-9 22:50:24 | 显示全部楼层
KL26 发表于 2014-4-9 22:38
亲  你超频成功了么???求指导啊

超频很容易的啊,例如配置为这样:

#define PLL_CLK                PLL200
#define MAX_CORE_CLK            100
#define MAX_BUS_CLK             40
回复 支持 反对

使用道具 举报

发表于 2014-4-10 10:17:26 | 显示全部楼层
风落小鱼 发表于 2014-4-9 22:50
超频很容易的啊,例如配置为这样:

#define PLL_CLK                PLL200

亲   你确定这超频了么?
回复 支持 反对

使用道具 举报

发表于 2014-4-10 13:10:49 | 显示全部楼层
风落小鱼 发表于 2014-4-9 22:50
超频很容易的啊,例如配置为这样:

#define PLL_CLK                PLL200

亲  你确定你这是超频了???你这不是总线时钟是40M???
回复 支持 反对

使用道具 举报

发表于 2014-4-10 13:27:39 | 显示全部楼层
KL26 发表于 2014-4-10 13:10
亲  你确定你这是超频了???你这不是总线时钟是40M???

你测测不就知道了。就是这样超频的啊!200 可以被40整除,所以bus就是40M
回复 支持 反对

使用道具 举报

发表于 2014-6-21 20:01:54 | 显示全部楼层
韦嘉淑 发表于 2014-4-10 13:27
你测测不就知道了。就是这样超频的啊!200 可以被40整除,所以bus就是40M

* 定义 PLL 超频 频率
*/
#define PLL_CLK                PLL200      // 从 PLL_e 里选择 已提供的 配置方案
                                          // core/bus 频率 都是 pll 整数倍分频而来

#define MAX_CORE_CLK            100        // core     (bus        >= pll/16  )
#define MAX_BUS_CLK             40         // bus      (bus        >= core/16  )

山哥 是这样超频的吗
强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

发表于 2014-6-21 20:28:19 | 显示全部楼层
电子555 发表于 2014-6-21 20:01
* 定义 PLL 超频 频率
*/
#define PLL_CLK                PLL200      // 从 PLL_e 里选择 已提供的  ...

可以,那bus 就是 100/3 = 33.33M
回复 支持 反对

使用道具 举报

发表于 2014-6-21 20:32:53 | 显示全部楼层
山外メ雲ジ 发表于 2014-6-21 20:28
可以,那bus 就是 100/3 = 33.33M

为什么是除以3 而不是其他呢 比如2 那不就是50 了吗
回复 支持 反对

使用道具 举报

发表于 2014-6-21 20:42:40 | 显示全部楼层
电子555 发表于 2014-6-21 20:32
为什么是除以3 而不是其他呢 比如2 那不就是50 了吗

设置不能超过40嘛,50就超过了40。而除3后的值是最接近40又不超过40
回复 支持 反对

使用道具 举报

发表于 2014-6-21 21:15:51 | 显示全部楼层
山外メ雲ジ 发表于 2014-6-21 20:42
设置不能超过40嘛,50就超过了40。而除3后的值是最接近40又不超过40

明白了 谢谢了
回复 支持 反对

使用道具 举报

发表于 2014-6-29 12:30:23 | 显示全部楼层
丁玉 发表于 2014-2-22 23:00
这个看源代码,应该比较容易懂啊

MCG和BUS 都是从PLL分频出来的,必须是整数倍关系

你好,,,在帖子上看到这句话:频率设置是配置最大值,所以前面有个MAX的标记,但频率必须是从PLL分频而来,必须是整除关系。即 CORE 和 BUS 只能在 PLL、PLL/2、PLL/3、……、PLL/15中取值。。

和你设置的
方式二:
#define PLL_CLK                PLL48
#define MAX_CORE_CLK            80
#define MAX_BUS_CLK             40

PLL 是 48 ,CORE 一分频就 48,< 80 ,符合条件,所以CORE是 48。BUS 二分频 是 24 < 40,所以 BUS 是24.即 PLL 48 ,CORE 48 ,BUS 24


有问题呢。。。望大神解释解释
回复 支持 反对

使用道具 举报

发表于 2014-6-29 12:33:37 | 显示全部楼层
丁玉 发表于 2014-2-22 23:00
这个看源代码,应该比较容易懂啊

MCG和BUS 都是从PLL分频出来的,必须是整数倍关系

哦。。其实想问  #define MAX_BUS_CLK 与#define MAX_CORE_CLK最大可以设置为多少?
回复 支持 反对

使用道具 举报

发表于 2014-6-29 12:46:52 | 显示全部楼层
sisi123 发表于 2014-6-29 12:33
哦。。其实想问  #define MAX_BUS_CLK 与#define MAX_CORE_CLK最大可以设置为多少?

CORE 最大为 110M, BUS 为 48 ,有可能配置为最大时会不稳定。所以建议 CORE 在 100内,BUS在40内
回复 支持 反对

使用道具 举报

发表于 2014-6-29 13:39:51 | 显示全部楼层
山外メ雲ジ 发表于 2014-6-29 12:46
CORE 最大为 110M, BUS 为 48 ,有可能配置为最大时会不稳定。所以建议 CORE 在 100内,BUS在40内

#define PLL_CLK                PLL200      // 从 PLL_e 里选择 已提供的 配置方案
#define MAX_CORE_CLK            100        // core     (bus        >= pll/16  )
#define MAX_BUS_CLK             40         // bus      (bus        >= core/16  )

这样配置行不行。。还有就是  我可不可以将  PLL_CLK 设置成  160 呢?我看配置里面没有,可不可以配置成160 呢?如果可以,怎么设置呢?  谢谢山外哥指点迷津
回复 支持 反对

使用道具 举报

发表于 2014-6-29 13:56:44 | 显示全部楼层
sisi123 发表于 2014-6-29 13:39
#define PLL_CLK                PLL200      // 从 PLL_e 里选择 已提供的 配置方案
#define MAX_CORE_ ...

我们里面有一些推荐配置方案,你直接从推荐方案里选择就好。
不是任意选择的,是需要根据寄存器来配置的
回复 支持 反对

使用道具 举报

发表于 2014-6-29 13:58:44 | 显示全部楼层
山外メ雲ジ 发表于 2014-6-29 13:56
我们里面有一些推荐配置方案,你直接从推荐方案里选择就好。
不是任意选择的,是需要根据寄存器来配置的

#define PLL_CLK                PLL200      // 从 PLL_e 里选择 已提供的 配置方案
#define MAX_CORE_CLK            100        // core     (bus        >= pll/16  )
#define MAX_BUS_CLK             40         // bus      (bus        >= core/16  )

那这样设置好不好呢?
回复 支持 反对

使用道具 举报

发表于 2014-10-30 10:19:18 | 显示全部楼层
这个好
顶两下
回复 支持 反对

使用道具 举报

发表于 2015-5-5 09:30:06 | 显示全部楼层
1、频率设置是配置最大值,所以前面有个MAX的标记,但频率必须是从PLL分频而来,必须是整除关系。即 CORE 和 BUS 只能在 PLL、PLL/2、PLL/3、……、PLL/15中取值。
2、* 定义 PLL 超频 频率
*/
#define PLL_CLK                PLL200      // 从 PLL_e 里选择 已提供的 配置方案
                                          // core/bus 频率 都是 pll 整数倍分频而来

#define MAX_CORE_CLK            100        // core     (bus        >= pll/16  )
#define MAX_BUS_CLK             40         // bus      (bus        >= core/16  )

BUS为什么不是pll5分频?它是CORE三分频吗?

回复 支持 反对

使用道具 举报

发表于 2015-5-5 10:20:23 | 显示全部楼层
liukai422 发表于 2015-5-5 09:30
1、频率设置是配置最大值,所以前面有个MAX的标记,但频率必须是从PLL分频而来,必须是整除关系。即 CORE  ...

bus是从core整数倍分频。
回复 支持 反对

使用道具 举报

发表于 2016-2-27 17:15:08 | 显示全部楼层
* 定义 PLL 超频 频率
*/
#define PLL_CLK                PLL200      // 从 PLL_e 里选择 已提供的 配置方案
                                          // core/bus 频率 都是 pll 整数倍分频而来

#define MAX_CORE_CLK            100        // core     (bus        >= pll/16  )
#define MAX_BUS_CLK             40         // bus      (bus        >= core/16  )



超频只设置这里就可以了吗
回复 支持 反对

使用道具 举报

发表于 2016-2-27 17:17:04 | 显示全部楼层
bug.com 发表于 2016-2-27 17:15
* 定义 PLL 超频 频率
*/
#define PLL_CLK                PLL200      // 从 PLL_e 里选择 已提供的  ...


回复 支持 反对

使用道具 举报

发表于 2016-2-29 13:12:00 | 显示全部楼层

kl26这样是最高了吗
回复 支持 反对

使用道具 举报

发表于 2016-5-7 15:38:53 | 显示全部楼层
山外メ雲ジ 发表于 2014-6-21 20:28
可以,那bus 就是 100/3 = 33.33M

山外哥 *! *  @brief      PLL超频
*  @param      PLL_e       频率设置参数
*  @return     超频频率(MHz)
*  @since      v5.0
*  @warning    此函数只能在 复位后没进行任何频率设置情况下调用,即MCG在FEI模式下才可调用
*  Sample usage:       uint8 clk = pll_init(PLL100);        //超频
*/
uint8 pll_init(PLL_e pll)
{

    mcg_div_count( pll);

    SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK;      //PTA18 和 PTA19 用于 晶振

    // set clock dividers to desired value
    SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIV1(mcg_div.core_div) |  SIM_CLKDIV1_OUTDIV4(mcg_div.bus_div);


    //上电复位后,单片机会自动进入 FEI 模式,使用 内部参考时钟

    //FEI -> FBE
    OSC0_CR  =  ( 0
                  | OSC_CR_ERCLKEN_MASK     //使能 外部参考时钟
                  //| OSC_CR_SC2P_MASK      //配置电容
                  //| OSC_CR_SC4P_MASK      //配置电容
                  //| OSC_CR_SC8P_MASK      //配置电容
                  | OSC_CR_SC16P_MASK       //配置电容
                 );

    MCG_C2 =    ( 0
                | MCG_C2_RANGE0(2)
                | MCG_C2_EREFS0_MASK
                );

    MCG_C1 = (0
              | MCG_C1_CLKS(2)
              | MCG_C1_FRDIV(7)
              | MCG_C1_IRCLKEN_MASK
              );

    while (MCG_S & MCG_S_IREFST_MASK) {};                       //等待FLL参考时钟 为 外部参考时钟(S[IREFST]=0,表示使用外部参考时钟,)

    while ((MCG_S & MCG_S_CLKST_MASK)  != MCG_S_CLKST(0x2)) {}; //等待选择外部参考时钟

    //现在已经进入了 FBE模式

    //FBE -> PBE


    MCG_C5 = MCG_C5_PRDIV0(mcg_cfg[pll].prdiv);                      //分频, EXTAL_IN_MHz/( PRDIV+1)
    MCG_C6 = MCG_C6_PLLS_MASK | MCG_C6_VDIV0(mcg_cfg[pll].vdiv) ;    //倍频, EXTAL_IN_MHz/( PRDIV+1)  * (VDIV+24)

    while (!(MCG_S & MCG_S_PLLST_MASK)) {};                         //等待时钟源选择PLL

    while (!(MCG_S & MCG_S_LOCK0_MASK)) {};                          //等待 PLL锁了(锁相环)

    // 现在已经进入了 PBE 模式

    // PBE -> PEE
    //MCG_C1 &= ~MCG_C1_CLKS_MASK;
    MCG_C1 = MCG_C1_IRCLKEN_MASK;

    while (((MCG_S & MCG_S_CLKST_MASK) ) != MCG_S_CLKST(0x3)) {};//等待选择输出PLL

    // 现在已经进入了 PEE 模式

    SIM_SOPT2 |= (0         //选择 PLL时钟
              | SIM_SOPT2_PLLFLLSEL_MASK
             );

    return mcg_cfg[pll].clk;
}
这一个跟直接配置宏定义有什么不同吗  没有看懂这个超频函数 不是说超频只需要修改宏定义就可以吗?

/*
* 定义 PLL 超频 频率
*/
#define PLL_CLK                PLL200     // 从 PLL_e 里选择 已提供的 配置方案
                                          // core/bus 频率 都是 pll 整数倍分频而来

#define MAX_CORE_CLK            100        // core     (bus        >= pll/16  )
#define MAX_BUS_CLK             40         // bus      (bus        >= core/16  )



回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部