jicheng0622

【原创】玩转Kinetis之教你将K60主频超到200MHz以上

0
阅读(6603)

    最近忙碌的状态稍微缓解了些,终于可以甩开膀子干点自己一直想干的事了。说起来,自己还颇有点向往有充足的自由时间的时候,毕竟前段时间积压了好多东西,是该捡起来一件件的把它做了,趁着自己还年轻还有激情,所以撸胳膊抹袖子开整吧,呵呵~

    今天就先挑一件来说说吧。“超频”这个词估计大家都不会陌生,很多玩计算机的都会尝试去把自己电脑的CPU超频玩一些高端大型游戏(咳咳,当然玩的high的时候别忘了小心你的主板别烧了),而对我们这些搞嵌入式的IT男来说,估计就只能用这样的情怀去折磨MCU了(当然前提得是有PLL或者FLL的MCU)。记得那是2008年的第一场雪,比往年来的稍晚了些…(没收住,又开始整词儿了,呵呵),那一年我第一次接触飞思卡尔的9S12 16位的单片机(MC9S12DG128,搞过智能车的童鞋都懂的),额定主频是25MHz,我把它超到40MHz,后来又换了MC9S12XS128,额定主频是40MHz,我又把它超到80MHz(晕,敢情我有超频强迫症啊,呵呵),一直到如今的ARM K60,额定主频为100MHz(VLQ100),所以。。。咳咳。。。

    本来自己曾经试着把它超过120以上的,不过之后出现了系统不稳定而且也的确还不需要太高的主频,索性就放下了就没有再去管它。直到前几天,师弟过来跟我说超到200MHz以上了,我仔细问了问才恍然所悟,发现了之前主频超不上去的问题所在。

    这里首先需要澄清几个概念,我们通常所说的主频一般是指内核时钟或者系统时钟(即core_clk或system_clk)。而对K60来说,其内部还有总线时钟(Bus_clk)、外部总线时钟(FlexBus_clk)、flash时钟(Flash_clk),而这几个时钟互相关联且每个都是有其频率限制的(如下图1所示),所以当我们要超频内核时钟的时候还不得不考虑其他时钟承受极限(姑且用这个词吧),颇有些捉襟见肘的感觉是吧,不过这点人家飞思卡尔帮咱想好了,呵呵。在我们用MCG模块内部的PLL将输入时钟超频到200MHz作为MCGOUTCLK输出的时候还需要一道关卡(如下图2),也就是说虽然这几个时钟属于同宗(都来自MCGOUTCLK),但是也可以通过不同的分频器(OUTDIV[1:4])约束不同的时钟范围,这里想起一个形象的例子(呵呵,不要嫌我俗)。MCGOUTCLK就类似以前的官家大老爷,娶了四房姨太太(OUTDIV[1:4]),分别生了四个少爷(即core_clk、Bus_clk、FlexBus_clk和Flash_clk),每个少爷都是老爷的儿子,不过在家中地位却是由姨太太的排序决定的,其中大房的大少爷(core_clk)地位最高(频率范围最大),四房的小少爷(flash_clk)地位最低(频率范围最小),不过他们的地位最高也不会超过老爷(其他clk<=MCGOUTCLK),呵呵,有点意思吧~

image

图1

image

图2

    经过上面的分析之后,就可以开始着手超频了。经过验证,其实系统频率超不上去就是“小少爷”(flash_clk)拖了后腿,当我们将MCGOUCLK超到200MHz的时候,OUTDIV1的分频可以设置为1分频,保证内核频率为200MHz,但却要同时保证其他几个时钟不要超过太多,尤其是Flash_clk的限制要严格(建议不要超过30MHz),因为flash_clk过高就代表取指令的频率过高,指令出错就会造成系统程序跑飞。

    说到这里,可能有些人会质疑,把主频超的那么高,但取指令的速度上不去有个啥用,岂不是颇有些大马拉小车的感觉吗,其实不然,这里我说两点。一个是通过RAM调试或者将函数声明成RAM执行函数的时候是可以加快执行速度的,另一个就是当做一些数学运算的时候作用就很明显了,因为一般可能会单纯用到CPU内部的ALU和寄存器组,后者数据访问多一些(注意Cortex-M4是哈佛结构,数据与指令总线独立的),自然其运算速度就上去了,所以还是好处多多的,呵呵~

    好了,今儿个说到这里了,倒点水喝去,还是那句话,转载请注明原作者jicheng0622信息及文章出处AET,谢谢支持,未完待续~