转载: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. viewPager作为RecyclerView的itemView出现的显示问题

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/174 ViewPager作为RecyclerView的it ...

  2. MySQL数据库:排序及limit的使用

    排序 排序方式: 升序--asc(默认:从小到大) 降序--desc(由大到小) # 排序语法: order by 字段1 [asc]|desc[,字段2 [adc]|desc,--] limit # ...

  3. andorid popupwindow 更新时动画的实现,可实现一个窗口被一个窗口推上去的效果

    最近由于项目需要,一直在寻找一个弹出窗口,在另一个弹出窗口弹出时,推上去的效果,居然找不到,经过不懈的努力,终于实现了popupwindow在更新时的动画. 先上代码: import android. ...

  4. docker 存储卷 Volumes

    一,docker容器面临的困境: 容器运行中产生的数据,是放到容器栈的最顶层,当容器停止并被删除后,这些数据就被删除了. docker采用COW(写时复制)策略,导致性能低下.比如有个mysql容器, ...

  5. Oracle查看表结构

    目的:通过SQL进行查看表结构,因为使用PL/SQL连接工具,连接到公司的数据库上经常断开.故改为使用Navicat连接数据库,个人觉得这个查看表结构很困难. 查看表结构和约束精简 -- 查询指定表的 ...

  6. UVA 503 Parallelepiped walk

    https://vjudge.net/problem/UVA-503 题目 给出一个长方体和长方体上两点的坐标,求两点的沿着长方体表面走的最小距离 题解 沿着表面走就是在展开图上面走,如果分类讨论就需 ...

  7. LeetCode 5127. 删除被覆盖区间 Remove Covered Intervals

    地址 https://www.acwing.com/solution/LeetCode/content/7021/ 目描述给你一个区间列表,请你删除列表中被其他区间所覆盖的区间. 只有当 c < ...

  8. luoguP4022 [CTSC2012]熟悉的文章

    题意 显然这个\(L\)是可以二分的,我们只需要判断\(L\)是否合法即可. 显然有一个\(O(n^2)\)的DP: 设\(f_i\)表示当前匹配到\(i\)的最大匹配长度. \(f_i=max(f_ ...

  9. for(var i in items) 和 for(var i;i<items.length;i++) 区别

    前者循环的是属性,后者循环的才是数组. 若项目中对数组属性进行了扩展,那切记不能使用前者,否则在循环数组时扩展的函数体也会被当做数据返回. var data = { p1:1, p2:"b& ...

  10. Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) F2. Wrong Answer on test 233 (Hard Version) dp 数学

    F2. Wrong Answer on test 233 (Hard Version) Your program fails again. This time it gets "Wrong ...