jicheng0622

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

0
阅读(6348) 评论(18)

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

    前几天看了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模块完整驱动代码文件。

  1. 写的不错,附件如何下载

  2. 写的不错,附件如何下载

  3. 写的不错楼主

  4. ***此内容已被管理员屏蔽***

  5. 回复:回复
    回复:回复
    回复:回复

    同学,内核时钟和系统时钟的关系俺没弄明白,MCG配置的是不是只是系统时钟啊?有没有配置内核时钟的实例啊!

    我博客里挂载的附件里就有实例,可以参考看一下~

    我已经把内核时钟设成了96M bus时钟48 flash48 但是IO口翻转速度最快只能到1.4M为什么啊!

    这个正常,翻转IO需要若干内核周期+总线周期+flash周期构成(即经过取指令,取数据,运算,再输出数据到外设),所以自然要降很多了,一般速度快的场合一般不会用IO模拟~

  6. 回复:回复
    回复:回复

    同学,内核时钟和系统时钟的关系俺没弄明白,MCG配置的是不是只是系统时钟啊?有没有配置内核时钟的实例啊!

    我博客里挂载的附件里就有实例,可以参考看一下~

    我已经把内核时钟设成了96M bus时钟48 flash48 但是IO口翻转速度最快只能到1.4M为什么啊!

  7. 回复:回复

    同学,内核时钟和系统时钟的关系俺没弄明白,MCG配置的是不是只是系统时钟啊?有没有配置内核时钟的实例啊!

    我博客里挂载的附件里就有实例,可以参考看一下~

  8. 同学,内核时钟和系统时钟的关系俺没弄明白,MCG配置的是不是只是系统时钟啊?有没有配置内核时钟的实例啊!

  9. 回复:回复

    FEI模式默认的时钟有没有个准确值?配置串口用20M做参数有出入啊

    FEI模式是系统上电默认的模式,它的时钟是内部时钟,在手册上可以找到时钟准确值,貌似是4M,我忘了,你可以去查查~

  10. FEI模式默认的时钟有没有个准确值?配置串口用20M做参数有出入啊

  11. 回复:回复

    因為我們現在洗了一個板子想說有內振就不要用振盪器了,可是現在還是無法有任何動作,調了一些內振用暫存器也無法有反應

    真不知該怎麼辦>_<

    如果用K60的话,把启动代码文件里那个初始化MCG函数屏蔽掉再下到Flash里,这时候不用外部晶振就可以运行了

  12. 因為我們現在洗了一個板子想說有內振就不要用振盪器了,可是現在還是無法有任何動作,調了一些內振用暫存器也無法有反應

    真不知該怎麼辦>_<

  13. 回复:回复

    那如果要改為內部震盪該如何改呢~~~??謝謝阿

    系统上电默认是内部振荡的,如果你想从设置好的PEE模式转回内部振荡FEI等可以参考我上面的MCG运行模式转换图

  14. 那如果要改為內部震盪該如何改呢~~~??謝謝阿

  15. 回复:回复

    飞思卡尔的东西是好的,就是市场做得,呵呵。

    不过,每年的FTF办得很气势。

    嗯,问题出在决策层上了,呵呵,FTF啊,真希望以后有机会能参加,每年都只能通过一些视频照片过眼瘾了,哈哈~