飞思卡尔Kinetis 60(K60)时钟系统分析

发布者:清晨微风最新更新时间:2021-10-14 来源: eefocus关键字:飞思卡尔  Kinetis  时钟系统 手机看文章 扫描二维码
随时随地手机看文章

前段时间学习了飞思卡尔K60芯片的时钟系统,对它的时钟系统有了个大致的了解,这里把自己的理解写下来分享一下,以备以后参考。

飞思卡尔 Kinetis系列是飞思卡尔推出的基于ARM CORTEX-M4为核心的微控制器


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.官方具体的例子

来源于飞思卡尔官方srcdriversmcgmcg.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.   

  18. // Select external oscilator and Reference Divider and clear IREFS to start ext osc

  19. // CLKS=2, FRDIV=3, IREFS=0, IRCLKEN=0, IREFSTEN=0

  20.   MCG_C1 = MCG_C1_CLKS(2) | MCG_C1_FRDIV(3);


  21.   /* if we aren't using an osc input we don't need to wait for the osc to init */

  22. #if (!defined(K60_CLK) && !defined(ASB817))

  23.     while (!(MCG_S & MCG_S_OSCINIT_MASK)){}; // wait for oscillator to initialize

  24. #endif


  25.   while (MCG_S & MCG_S_IREFST_MASK){}; // wait for Reference clock Status bit to clear


  26.   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


  27. // Now in FBE


  28. #if (defined(K60_CLK))

  29.    //MCG_C5 = MCG_C5_PRDIV(0x18);

  30.    MCG_C5 = MCG_C5_PRDIV(0x18); //基频2M 外部时钟源是50M时, 50/25=2M

  31. #else

  32. // Configure PLL Ref Divider, PLLCLKEN=0, PLLSTEN=0, PRDIV=5

  33. // The crystal frequency is used to select the PRDIV value. Only even frequency crystals are supported

  34. // that will produce a 2MHz reference clock to the PLL.

  35.   MCG_C5 = MCG_C5_PRDIV(crystal_val); // Set PLL ref divider to match the crystal used

  36. #endif


  37.   // Ensure MCG_C6 is at the reset default of 0. LOLIE disabled, PLL disabled, clk monitor disabled, PLL VCO divider is clear

  38.   MCG_C6 = 0x0;

  39. // Select the PLL VCO divider and system clock dividers depending on clocking option

  40.   switch (clk_option) {

  41.     case 0:

  42.       // Set system options dividers

  43.       //MCG=PLL, core = MCG, bus = MCG, FlexBus = MCG, Flash clock= MCG/2

  44.       set_sys_dividers(0,0,0,1);

  45.       // Set the VCO divider and enable the PLL for 50MHz, LOLIE=0, PLLS=1, CME=0, VDIV=1

  46.       MCG_C6 = MCG_C6_PLLS_MASK | MCG_C6_VDIV(1); //VDIV = 1 (x25)

  47.       pll_freq = 50;

  48.       break;

  49.    case 1:

  50.       // Set system options dividers

  51.       //MCG=PLL, core = MCG, bus = MCG/2, FlexBus = MCG/2, Flash clock= MCG/4

  52.      set_sys_dividers(0,1,1,3);

  53.       // Set the VCO divider and enable the PLL for 100MHz, LOLIE=0, PLLS=1, CME=0, VDIV=26

  54.       MCG_C6 = MCG_C6_PLLS_MASK | MCG_C6_VDIV(26); //VDIV = 26 (x50) 

  55.       pll_freq = 100;

  56.       break;

  57.     case 2:

  58.       // Set system options dividers

  59.       //MCG=PLL, core = MCG, bus = MCG/2, FlexBus = MCG/2, Flash clock= MCG/4

  60.       set_sys_dividers(0,1,1,3);

  61.       // Set the VCO divider and enable the PLL for 96MHz, LOLIE=0, PLLS=1, CME=0, VDIV=24

  62.       MCG_C6 = MCG_C6_PLLS_MASK | MCG_C6_VDIV(24); //VDIV = 24 (x48)

  63.       pll_freq = 96;

  64.       break;

  65.    case 3:

  66.       // Set system options dividers

  67.       //MCG=PLL, core = MCG, bus = MCG, FlexBus = MCG, Flash clock= MCG/2

  68.       set_sys_dividers(0,0,0,1);

  69.       // Set the VCO divider and enable the PLL for 48MHz, LOLIE=0, PLLS=1, CME=0, VDIV=0

  70.       MCG_C6 = MCG_C6_PLLS_MASK; //VDIV = 0 (x24)

  71.       pll_freq = 48;

  72.       break;

  73.   }

  74.   while (!(MCG_S & MCG_S_PLLST_MASK)){}; // wait for PLL status bit to set


  75.   while (!(MCG_S & MCG_S_LOCK_MASK)){}; // Wait for LOCK bit to set


  76. // Now running PBE Mode


  77. // Transition into PEE by setting CLKS to 0

  78. // CLKS=0, FRDIV=3, IREFS=0, IRCLKEN=0, IREFSTEN=0

  79.   MCG_C1 &= ~MCG_C1_CLKS_MASK;


  80. // Wait for clock status bits to update

  81.   while (((MCG_S & MCG_S_CLKST_MASK) >> MCG_S_CLKST_SHIFT) != 0x3){};


  82. // Now running PEE Mode


  83. return pll_freq;

  84. } //pll_init



关键字:飞思卡尔  Kinetis  时钟系统 引用地址:飞思卡尔Kinetis 60(K60)时钟系统分析

上一篇:飞思卡尔KL16时钟配置
下一篇:飞思卡尔双车蓝牙互联教程

推荐阅读最新更新时间:2024-11-10 11:07

飞思卡尔凭借OpenCL环境激发开放式开发
“无人驾驶车辆”概念引发了全世界对这项新技术的想象,当前推出的高级驾驶员辅助系统(ADAS)则加快了这场革命的到来。虽然这些市场蕴藏巨大商机,难题也随之而来,必须首先予以解决。飞思卡尔半导体如今已经解决了无人自动驾驶技术发展道路上的两大难题—一是ADAS系统开发缺乏开放标准这一难题,二是一项虽然看似普通但尚无人填补的空白,即以消费者为中心的芯片解决方案对于关键无人驾驶汽车应用是否足够安全,从而积极推动行业发展。 飞思卡尔宣布即将推出基于OpenCL(开放运算语言)的汽车开发环境,旨在为类似的汽车OEM和一级供应商打开市场,在更多车辆中更快实现高级驾驶员辅助技术和其他ADAS技术。公司还呼吁一级ADAS系统提供商及其供应商,采用完全符
[嵌入式]
Proteus—AVR单片机(ATMEGA16单片机)系统时钟时钟选项设置
在设置之前呢,我得把ATMEGA16里面的datasheet里面的资料说说,当然是关于系统时钟和时钟选项的 一、系统时钟及时钟选项(这里主要是介绍原理,三里面会介绍如何设置,其实你会了一,那后面的二和三就相当简单了~~你懂得,就是根据一来的 ) 1. 时钟系统及其分布: Figure 11为AVR的主要时钟系统及其分布。这些时钟并不需要同时工作。为了降低功耗, 可以通过使用不同的睡眠模式来禁止无需工作的模块的时钟。 1)CPU 时钟- clkCPU CPU时钟与操作AVR内核的子系统相连,如通用寄存器文件、状态寄存器及保存堆栈指针 的数据存储器。终止CPU 时钟将使内核停止工作和计算。 2)I/O 时钟- clkI/O I/
[单片机]
Proteus—AVR单片机(ATMEGA16单片机)<font color='red'>系统</font><font color='red'>时钟</font>及<font color='red'>时钟</font>选项设置
MSP430F5529 (三)统一时钟系统UCS-2
实验二:将MCLK和SMCLK配置为XT1(F5529的XT1为32.768KHZ) /*1.配置IO口5.4和5.5为XT1功能。*/ /*2.配置XCAP为XCAP_3,即12PF的电容。*/ /*3.清除XT1OFF标志位。*/ /*4.等待XT1起振。*/ #include msp430.h void main(void){ P1SEL |= BIT0;P1DIR |= BIT0;//测量ACLK用 P2SEL |= BIT2;P2DIR |= BIT2;//测量SMCLK用 P7SEL |= BIT7;P7DIR |= BIT7;//测量MCLK用 P5SEL |= BIT4|BIT5; /
[单片机]
MSP430F5529 (三)统一<font color='red'>时钟</font><font color='red'>系统</font>UCS-2
飞思卡尔看门狗详解
目前接触到的单片机中都有看门狗模块,不过写过的程序也比较简单,程序能够稳定运行,所以就不怎么理会这看门狗,因此也不知道看门狗是怎么回事。 最近写了个超声波测距的程序,运行过程中程序老是会无故停止,就是死机了。因此不得不重新面对看门狗,经过两天的奋斗,终于让看门狗顺利工作了。下面记一下XS128的看门狗的相关寄存器及用法。 看门狗模块用于检测程序的正常运行,启动看门狗后,必须在看门狗复位之前向ARMCOP中依次写入0X55和0XAA ,这样看门狗就会重新启动计时。如果在规定时间内没有完成向ARMCOP中依次写入0X55和0XAA的操作,就会引起看门狗复位。这样可以使程序重新运行,减小程序跑死的危害。 看门狗的设置比较简单
[单片机]
飞思卡尔单片机DZ60---TPM1输出比较
#include hidef.h /* for EnableInterrupts macro */ #include derivative.h /* include peripheral declarations */ //输出比较试验 //定时计数器寄存器(TPMxCNTH:TPMxCNTL)中的值与通道寄存器(TPMxCnVH:TPMxCnVH)相匹配时,会产生一个中断标志位 //并且会在管理管脚强制执行所选的输出操作。输出比较可以选择用于强制将管脚设置为0或1,翻转管脚电平(本试验采用? //或忽略。本试验使能了TPM1中通道0(对应管理管脚为PTD2 ,led3 // TPM1中通道1 (对应管理管脚为PTD3?,
[单片机]
freescale单片机单精度浮点与16进制与ascii之间的转换
//---将单精度浮点转换成unsigned char数组,然后将unsigned char数组转换成ascii码字符串 float BallData = {-8.925133}; unsigned char *f2char; unsigned char ControlData ; void float2uchar2ascii(void) { unsigned char i = 0; f2char = //float to unsiged char //8个floatd对应于32个unsigned char,所以f2char为32位 //f2char ={0xC10E
[单片机]
飞思卡尔那些事之离散型光电管路径识别
光电管路径识别算法 资源: 1、红外光电发射接收管 2、电压比较器 3、HCS12的IO口 4、HCS12的ATD模块 5、HCS12的ECT模块 原理: 1、红外发射管,将红外线信号发射出去,当遇到遮挡物是,会反射回来。如果当部分为黑色时,则不会发射回来(黑色能吸收光线,红外线在遇到黑色遮挡物时,被吸收)。接收管在接收到反射的红外线时,其两端的电阻发生变化,从而可以输出不同的电压值,最后根据这些电压值来识别路径。 2、电压比较器能将连续量转变成开关量,在大于设定的阈值时,输出高电平,小于设定的阈值时,则输出低电平。 3、ADC能将模拟量转换成计算机可以识别的数字量,可是自己对这些数字信号进行处理,对路径信息进行识别。 方案: 1、
[单片机]
飞思卡尔S12系列中断PIT资料总结和分享
  核心内容就在这张图上:   相信大家都明白总线的概念,在图中可以看到6个定时器模块,Micro Timer 0、Micro Timer 1、Timer 0、Timer 1、Timer 2、Timer 3,其中前两个是8位的,后四个是16位的。从图中可以看出PIT模块是以总线时钟(Bus Clock)为基准时钟的,总线时钟通过8位Micro Timer 0和Micro Timer 1倍频形成两个基时钟,即Micro Timer Base 0和Micro Timer Base 1,这两个基时钟通过16位Timer给PIT提供时钟(通过寄存器PITMUX设置)。   原理讲完了,其实相对于PIT模块是一个24位的定时器(5
[单片机]
<font color='red'>飞思卡尔</font>S12系列中断PIT资料总结和分享

推荐帖子

CC3200 相关资料!
CC3200相关资料!Datasheethttp://www.ti.com/lit/ds/symlink/cc3200.pdf寄存器CC3200SimpleLinkWi-FiWirelessMCUTechnicalReferenceManualhttp://www.ti.com/lit/ug/swru367/swru367.pdfCC3200相关资料!不知道cc3200价格几何?linyu0395发表于2014-6-2510:04
蓝雨夜 无线连接
1602显示后怎么使用了清屏还是清不了啊!急救!!!
最近在做一个小实验,用DSB1802和1602和键盘来实现,处理器用52的单片机!可是在显示了之后我再按键盘没反映。复位后又只能显示我最先按下的键所对应的程序!急求帮忙啊!程序如下,//sbitE=P2^7;//1602使能引脚sbitRW=P2^6;//1602读写引脚sbitRS=P2^5;//1602数据/命令选择引脚//voidL1602_init(void)//1602的初始化程序{enable(
carlry 嵌入式系统
开关电源设计入门
开关电源设计入门开关电源设计入门非常感谢,很需要这本书,THX谢谢分享了各位电源大神,如果有需要电源环路分析仪样机测试,我司可以协助免费提供,谢谢。0755-29959275FrodoChen
tonytong 电源技术
关于一个系统实现多种功能的汇编程序.
我的系统里有LED显示.串口通信,D/A转换这些功能,且都是独立实现的..对于每一种功能,例如,LED显示的程序可分主程序和子程序.串口通信的程序也分主程序和子程序..D/A转换也分主程序和子程序,而且,初始化也各不相同.而且都有中断服务程序那在我实际写的时候,我怎么写好我的主程序和子程序?关于一个系统实现多种功能的汇编程序.根据你的应用逻辑来组织...同时根据各应用的特殊要求综合考虑
zyandll 嵌入式系统
micropythhon在STM32的配置中新增了USB允许选项
STM32分支中,已经加入了USB允许选项,默认是禁止的(没有添加)。#defineMICROPY_HW_ENABLE_USB(1)如果不加入这个选项,就会造成升级后没有USB设备。因此对于自定义的板子必须手工在mpconfigboard.h文件中加入这个选项,此外还需要在usb配置中加入一行//USBconfig#defineMICROPY_HW_USB_FS(1)否则也无法正确编译。micropythhon在STM32的配置中新增了USB允许选项
dcexpert MicroPython开源版块
keil注册问题
下了个keil3,但是怎么也注册不了,试了几个注册机。怀疑是注册步骤出错了,求详细注册步骤感谢!!!keil注册问题可以啊,多下几个试试,这东西上百度一搜到处都是的QQ:604914729,我有截图,晚上传给你,看看。也很可能是你的破解文件有问题。我以前刚装WIN7的时候也是怎么注册都不行,明明显示注册号有效到201X年就是2K的限制还在后来在安全模式下注册就好了好象没遇到过~~~用注册机生成注册码后拷到File-》licensemanagement里面就可以了啊。我的一
lixin811013 嵌入式系统
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved