转载:https://blog.csdn.net/hcx25909/article/details/7164650

1.飞思卡尔K60时钟系统

    
    飞思卡尔K60时钟系统如上图所示,可以发现器件的源时钟源一共有4个:
    ①内部参考时钟源,包括 Fast IRC和 slow IRC (IRC--Internal Reference Clock)
    ②外部参考时钟源,只一个EXTAL管脚作为时钟输入,这个可以使用有源晶体振荡器来实现
    ③外部晶体谐振器,使用EXTAL和XTAL两个管脚来输入
    ④外部32K RTC 谐振器,用于实时时钟的时钟输入
    在图中可以看到,要为系统提供时钟信号,关键是要最终生成 MCGOUTCLK 输出。MCGOUTCLK 再经过分频便可以提供Core/system clocks、Bus clock、FlexBus clock和Flash clock。MCGOUTCLK 的产生有3个途径:
    ①由内部参考时钟源 Fast IRC 直接提供,这个时钟源集成在芯片的内部(包括Slow IRC),频率是2M
    ②由 FLL 或者 PLL 模块来提供
    ③由外部时钟来直接提供,包括外部参考时钟源(1个管脚输入)、外部晶体谐振器经内部OSC logic产生的XTAL_CLK 和 RTC OSC logic 的时钟输出。
 
    一般情况下,MCGOUTCLK 是由PLL或者FLL倍频来产生的,飞思卡尔官方的例程最终是由PLL模块来产生。图中可以看到PLL模块的时钟输入是OSCCLK或者RTC OSC logic。我的板子以外部参考时钟源提供PLL时钟,最终经PLL倍频产生MCGOUTCLK。即 EXTAL-->PLL模块-->MCGOUTCLK.
 
2.关于时钟模式
 
 
   从图中可以看到,该芯片一共包含8种工作时钟模式,外加Stop模式。系统在RESET后直接进入默认的FEI模式。图中,F--FLL、P--PLL、E--Enable或者EXTAL(外部时钟)、B--Bypass(旁路)、I--Internal(内部参考时钟)、L--Low Power.
·FLL 启用、内部参考时钟(FEI), 内部参考时钟提供FLL的时钟,FLL驱动MCGOUT
·FLL 启用、外部参考时钟(FEE), 外部参考时钟提供FLL的时钟,FLL驱动MCGOUT
·FLL 旁路、内部参考时钟(FBI),FLL虽然在运作但由内部时钟参考源驱动MCGOUT 
·FLL 旁路、外部参考时钟(FBE),FLL虽然在运作但由外部时钟参考源驱动MCGOUT 
·PLL 旁路、外部参考时钟(PBE),PLL虽然在运作但由外部时钟参考源驱动MCGOUT 
·PLL 启用、外部参考时钟(PEE),外部参考时钟提供PLL的时钟,PLL驱动MCGOUT
·BLPI FLL和PLL都禁用,内部时钟参考源驱动MCGOUT
·BLPE FLL和PLL都禁用,外部时钟参考源驱动MCGOUT
 
    由于系统在重启后默认进入FEI模式,我们的目标是要跳到PEE模式,所以要涉及到模式的转化。图中由FEI到PEE是不能直接跳转的,必须经由其他模式来转换。
 
 
3.官方具体的例子
来源于飞思卡尔官方\src\drivers\mcg\mcg.c
  1. unsigned char pll_init(unsigned char clk_option, unsigned char crystal_val)
  2. {
  3. unsigned char pll_freq;
  4. if (clk_option > 3) {return 0;} //return 0 if one of the available options is not selected
  5. if (crystal_val > 15) {return 1;} // return 1 if one of the available crystal options is not available
  6. //This assumes that the MCG is in default FEI mode out of reset.
  7. // First move to FBE mode
  8. #if (defined(K60_CLK) || defined(ASB817))
  9. MCG_C2 = 0;
  10. #else
  11. // Enable external oscillator, RANGE=2, HGO=1, EREFS=1, LP=0, IRCS=0
  12. MCG_C2 = MCG_C2_RANGE(2) | MCG_C2_HGO_MASK | MCG_C2_EREFS_MASK;
  13. #endif
  14. // after initialization of oscillator release latched state of oscillator and GPIO
  15. SIM_SCGC4 |= SIM_SCGC4_LLWU_MASK;
  16. LLWU_CS |= LLWU_CS_ACKISO_MASK;
  17. // Select external oscilator and Reference Divider and clear IREFS to start ext osc
  18. // CLKS=2, FRDIV=3, IREFS=0, IRCLKEN=0, IREFSTEN=0
  19. MCG_C1 = MCG_C1_CLKS(2) | MCG_C1_FRDIV(3);
  20. /* if we aren't using an osc input we don't need to wait for the osc to init */
  21. #if (!defined(K60_CLK) && !defined(ASB817))
  22. while (!(MCG_S & MCG_S_OSCINIT_MASK)){}; // wait for oscillator to initialize
  23. #endif
  24. while (MCG_S & MCG_S_IREFST_MASK){}; // wait for Reference clock Status bit to clear
  25. while (((MCG_S & MCG_S_CLKST_MASK) >> MCG_S_CLKST_SHIFT) != 0x2){}; // Wait for clock status bits to show clock source is ext ref clk
  26. // Now in FBE
  27. #if (defined(K60_CLK))
  28. //MCG_C5 = MCG_C5_PRDIV(0x18);
  29. MCG_C5 = MCG_C5_PRDIV(0x18); //基频2M 外部时钟源是50M时, 50/25=2M
  30. #else
  31. // Configure PLL Ref Divider, PLLCLKEN=0, PLLSTEN=0, PRDIV=5
  32. // The crystal frequency is used to select the PRDIV value. Only even frequency crystals are supported
  33. // that will produce a 2MHz reference clock to the PLL.
  34. MCG_C5 = MCG_C5_PRDIV(crystal_val); // Set PLL ref divider to match the crystal used
  35. #endif
  36. // Ensure MCG_C6 is at the reset default of 0. LOLIE disabled, PLL disabled, clk monitor disabled, PLL VCO divider is clear
  37. MCG_C6 = 0x0;
  38. // Select the PLL VCO divider and system clock dividers depending on clocking option
  39. switch (clk_option) {
  40. case 0:
  41. // Set system options dividers
  42. //MCG=PLL, core = MCG, bus = MCG, FlexBus = MCG, Flash clock= MCG/2
  43. set_sys_dividers(0,0,0,1);
  44. // Set the VCO divider and enable the PLL for 50MHz, LOLIE=0, PLLS=1, CME=0, VDIV=1
  45. MCG_C6 = MCG_C6_PLLS_MASK | MCG_C6_VDIV(1); //VDIV = 1 (x25)
  46. pll_freq = 50;
  47. break;
  48. case 1:
  49. // Set system options dividers
  50. //MCG=PLL, core = MCG, bus = MCG/2, FlexBus = MCG/2, Flash clock= MCG/4
  51. set_sys_dividers(0,1,1,3);
  52. // Set the VCO divider and enable the PLL for 100MHz, LOLIE=0, PLLS=1, CME=0, VDIV=26
  53. MCG_C6 = MCG_C6_PLLS_MASK | MCG_C6_VDIV(26); //VDIV = 26 (x50)
  54. pll_freq = 100;
  55. break;
  56. case 2:
  57. // Set system options dividers
  58. //MCG=PLL, core = MCG, bus = MCG/2, FlexBus = MCG/2, Flash clock= MCG/4
  59. set_sys_dividers(0,1,1,3);
  60. // Set the VCO divider and enable the PLL for 96MHz, LOLIE=0, PLLS=1, CME=0, VDIV=24
  61. MCG_C6 = MCG_C6_PLLS_MASK | MCG_C6_VDIV(24); //VDIV = 24 (x48)
  62. pll_freq = 96;
  63. break;
  64. case 3:
  65. // Set system options dividers
  66. //MCG=PLL, core = MCG, bus = MCG, FlexBus = MCG, Flash clock= MCG/2
  67. set_sys_dividers(0,0,0,1);
  68. // Set the VCO divider and enable the PLL for 48MHz, LOLIE=0, PLLS=1, CME=0, VDIV=0
  69. MCG_C6 = MCG_C6_PLLS_MASK; //VDIV = 0 (x24)
  70. pll_freq = 48;
  71. break;
  72. }
  73. while (!(MCG_S & MCG_S_PLLST_MASK)){}; // wait for PLL status bit to set
  74. while (!(MCG_S & MCG_S_LOCK_MASK)){}; // Wait for LOCK bit to set
  75. // Now running PBE Mode
  76. // Transition into PEE by setting CLKS to 0
  77. // CLKS=0, FRDIV=3, IREFS=0, IRCLKEN=0, IREFSTEN=0
  78. MCG_C1 &= ~MCG_C1_CLKS_MASK;
  79. // Wait for clock status bits to update
  80. while (((MCG_S & MCG_S_CLKST_MASK) >> MCG_S_CLKST_SHIFT) != 0x3){};
  81. // Now running PEE Mode
  82. return pll_freq;
  83. } //pll_init

K60时钟分析的更多相关文章

  1. 飞思卡尔K60时钟分析

    推荐:NXP官方软件config tool,图形化界面可导出代码 K60芯片的时钟系统由振荡器(OSC).实时振荡器(RTC OSC).多功能时钟发生器(MCG).系统集成模块(SIM)和电源管理器( ...

  2. MINIX3 内核时钟分析

    MINIX3 内核时钟分析  4.1 内核时钟概要  先想想为什么 OS 需要时钟?时钟是异步的一个非常重要的标志,设想一下,如 果我们的应用程序需要在多少秒后将触发某个程序或者进程,我们该怎么做到? ...

  3. stm32时钟分析

    转载自http://blog.chinaunix.net/uid-21658993-id-3129667.html   在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL. 其实是 ...

  4. KVM 时钟分析

    1. 关于GToffset: KVM的guset时钟为gc0_COUNT 其中:mfc0 gc0_count = c0_COUNT+GToffset vcpu_run 以及 vcpu_reenter的 ...

  5. MINIX3 导读分析

    一个操作系统的分析是属于一个非常庞大的工程,操作系统就像是一个人造的 人,每一个模块想完全发挥功效,很有可能需要很多模块的支持才能够实现.所 以在分析 MINIX3 时,我认为同时看多个模块对于理解 ...

  6. Minix2.0操作系统kernel文件分析

    详细分析  MINIX消息机制的核心: mpx386.s start.c proc.c 保护模式分析: src/kernel/exception.c src/kernel/protect.c src/ ...

  7. LCD RGB 控制技术讲解 — 时钟篇(上)

    时序图 下面是LCD RGB 控制的典型时序图  天啊,一下就上这玩意,怎么看??? 其实要解释上面的时序图,我们还需要了解一些LCD的显示过程.所以现在只是有个印象,稍后我们详细讲解. LCD显示流 ...

  8. LCD RGB 控制技术讲解 — 时钟篇(上)【转】

    1. 时序图 下面是LCD RGB 控制的典型时序图 天啊,一下就上这玩意,怎么看??? 其实要解释上面的时序图,我们还需要了解一些LCD的显示过程.所以现在只是有个印象,稍后我们详细讲解. 2. L ...

  9. minix2.0内核组织结构与公用头文件说明

    Minix2.0操作系统的源代码由两个目录组成:include/目录和src/目录 include/目录包含了操作系统所有的头文件(即.h文件) src/目录下包含了操作系统所有的源文件(.c或.s文 ...

随机推荐

  1. May 19th, 2019. Week 21st, Sunday

    Fight for what matters to you. 为自己珍视的东西奋斗吧! We all want to make our life goals true, and we all expe ...

  2. MATLAB实例:为匹配真实标签,对训练得到的标签进行调整

    MATLAB实例:为匹配真实标签,对训练得到的标签进行调整 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. MATLAB程序 munkres.m ...

  3. java 反编译工具 jd-gui

    下载地址    http://java-decompiler.github.io/         一般使用windows 版本  看你使用的操作系统了 解压  点击exe 进入 选择你编译后的cla ...

  4. 站点部署,IIS配置优化指南[转]

    站点部署,IIS配置优化指南 目录 一.       设置应用程序池默认设置 二.       常规设置 三.       优化回收策略 四.       性能 五.       IIS初始化(预加载 ...

  5. 如何在AbpNext项目中使用Mysql数据库

    配置步骤: 1.更改.Web项目的appsettings.json的数据库连接字符串.如:server=0.0.0.0;database=VincentAbpTest;uid=root;pwd=123 ...

  6. python奇闻杂技

    第一天 01 从计算机到程序设计语言 02 python环境配置 03 实例一:温度转换 04 python语法分析 第二天 01 深入理解python语言 02 实例二,python蟒蛇配置 03 ...

  7. GPG 密码修改

    一.前言 相信大家在使用gpp的时候都会遇到这样子都情况: 忘记密码 想要定时更换密码,保证安全 此时不用担心,gpg  的密码更新特别简单. 二.步骤说明 1> 执行命令获 gpg2 --li ...

  8. Python连载42-异步协程函数

    一.  asyncio 1.python3.4开始引入标准库之中,内置对异步io的支持 2.asyncio本身是一个消息循环 3.步骤: (1)创建消息循环 (2)把协程导入 (3)关闭 4.举例: ...

  9. Java连载39-构造方法详解

    ​一. 1.多行注释:CTRL + shift + / 2.当一个类中没有定义任何构造方法的话,系统默认给该类提供一个无参数的构造方法,这个构造方法被称为缺省构造器. public class D39 ...

  10. angular ng-bind-html异常Attempting to use an unsafe value in a safe context处理

    在angular中使用ng-data-html渲染dom时,遇到了一个Attempting to use an unsafe value in a safe context错误,官方给出的理由是‘试图 ...