jicheng0622

【原创】从零入手Kinetis系统开发(六)之MCG模块

0
阅读(8082)

    这个假期在家待的好长啊,呵呵,所以也是好久没敲博客了,真是手指、大脑各种生疏啊,幸亏积极性还在,所以在摩拳擦掌的准备了几天后,又忍不住继续未完的事业了,哈哈(咳咳,又有点吹大了)。

    前几天看了garfield发的新闻,飞思卡尔又亏损了,哎,拔凉拔凉的,凄凄惨惨戚戚啊,想起赵大叔的小品里一句“海燕,你长点心吧”,我只想说声“飞思卡尔,你也长点心吧”,貌似自从我知道飞思卡尔这个名字起,你就一直在亏损啊,呜呜,让俺们这些一直在坚定不移地用你的片子的飞丝们(咳咳,自己起的,哈哈)情何以堪啊。是真心希望你能在2012龙年来个龙抬头,呵呵~

    新年刚回来话有点多,见谅见谅了,不过貌似都习惯了,只有啰嗦一阵后才能文思上涌,所以时间宝贵的网友们可以直接跳到下面实质内容,哈哈~其实在家这些天,自己也没闲着,而是在整理和规划从零入手这个系列的思路,希望能更好的展现自己的学习成果和大家交流探讨,而且很欣慰的是看到了一些网友通过该系列也收获了一些成果和开源分享的精神,特别是fzjz网友还分享了他的GPIO成果。既然开了好头,那就让我们继续下去,年轻人,最宝贵的不就是这一股子冲劲吗,哈哈~

    言归正传,本篇主要介绍了Kinetis的MCG模块(多功能时钟产生器模块),期间可能涉及几个SIM模块(系统集成模块)的寄存器,但因为不是本篇重点介绍的内容就不特别介绍,之后会有专门介绍SIM模块的一篇,敬请期待,呵呵。掌握MCG模块,离不开下面几张图表,这几个图表是非常重要的,根据图表再结合官方例程或者本篇附件里我整理的MCG例程一步一步就可以轻松掌握MCG模块,下面揭开MCG神秘面纱:

    (1)概述:MCG模块,即多功能时钟产生器,在设计之初就是为了满足提供给MCU多种可选择的时钟源的需要,其包含了一个FLL(锁频环),一个PLL(锁相环)和两个内部参考时钟源和外部,另外MCG还控制一个外部振荡器(XOSC),可以把晶体振荡器作为外部参考时钟。MCG模块可以选择FLL或者PLL作为系统时钟也可以选择内部或外部参考时钟作为系统时钟,提供多种运行模式,满足不同性能不同功耗的要求,非常方便。

    (2)图表:如下图为MCG模块三个重要的图表,分别介绍如下,

    下图为系统时钟的分配图,系统时钟即Core clock,Bus clock,FlexBus clock,Flash clock分频自MCGOUTCLOCK,而MCGOUTCLOCK则包含四种种时钟源(具体时钟源的分配则有SIM模块控制)即IRC(内部参考时钟),外部参考时钟,FLL(锁频环)和PLL(锁相环),其中FLL又取自IRC和外部参考时钟,PLL则只能取自外部参考时钟。

图表1 时钟分配图

    下图为MCG的内部剖析图,比较详细,涉及到相关寄存器的控制,具体在下面的程序讲解里会介绍。

图表2 MCG内部结构图

    下图为MCG几种运行模式之间的转换图表,注意系统复位默认为FEI模式,但是要转换到某种模式必须遵守下图表的顺序一步一步的来,否则可能会遇到不可预料的错误。例如从FEI到PEE,我们可以从中选取一条路线来走(通过程序)FEI->FBE->PBE->PEE。(可能会觉着比较麻烦,不过也是没办法,安全第一,咳咳)

图表3 MCG运行模式转换图

    (3)部分代码剖析(本篇附件包含完整代码):由于程序里注释已经详细的解释清楚了,这里就不赘述了只列举了主要函数和形参列表,有问题可以下面留言,呵呵。

上图的为主要的MCG初始化函数SystemClockInit()和形参want_clock和crystal_val的可选项

    (4)不同模式功耗对比(根据不同需要选择不同的模式):

    好长时间没写这么多东西了还是有点生疏,大家见谅,如果有些地方不明白可以下面留言,随时解答,呵呵。未完待续~

    附件为MCG模块完整驱动代码文件。