kinetis时钟模块MCG详解
MCG模块详解
一、MCG模块简介
MCG成为多用途时钟信号发生器,该模块为MCU和芯片内部各个模块提供时钟信号。MCG模块通过对输入的参考时钟进行分频和倍频处理,可以输出各种频率的时钟信号,并达到超频运行的目的。输入的参考时钟可以来自内部也可以来自外部时钟或外部晶振。输入的参考时钟一般经过分频后进入FLL(锁频环)或PLL(锁相环)进行倍频处理,当然也可以不通过FLL或PLL,而直接输出给各个模块。一般情况下,我们会选择外部晶振的参考时钟,分频后由PLL倍频的方法来达到超频运行的目的。
MCG模块框图如图1.1所示。
图1.1 MCG模块框图
MCG的核心是一个FLL(锁频环)和一个PLL(锁相环)。FLL和PLL都可以对输入的参考时钟倍频并锁定后输出,输出的时钟在SIM模块的控制下提供给CPU和各个模块。锁频环FLL的核心是一个DCO(数字控制振荡器),锁相环PLL的核心是一个VCO(电压控制振荡器)。如图1.2所示。
注意:MCG模块可输出多个时钟,比如MCGFFCLK、MCGPLLCLK、MCGOUTCLK等,详见图1.1。这些时钟可以为其它模块提供更多的时钟选择。在这些时钟中,最主要的是MCGOUTCLK。这个时钟是核心时钟、总线时钟、FLASH时钟的时钟来源。我们要实现PLL超频最终得到的也是MCGOUTCLK。
图1.2 MCG模块
不同的参考时钟,以及不同的对参考时钟的处理方式的组合,使得MCG模块有9种不同的工作模式。9种模式及相互之间的转换如图1.3所示。
图1.3 MCG模块的工作模式及相互转换
这9种模式我们未必都用到,一般情况下,我们都会使用PEE模式,PEE模式是选择外部晶振经过PLL倍频后输出时钟,可以达到较高的时钟频率。而上电复位后,MCG工作在FEI模式下。我们必须通过设置相关的寄存器,实现FEI到FBE的转换,再由FBE转换到PBE,最后再转换到PEE。下面我们就介绍一下我们用到的几种模式及在转换过程中用到的寄存器。
二、相关寄存器
1. MCG控制寄存器1(MCG_C1)
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Read |
CLKS |
FRDIV |
IREFS |
IRCLKEN |
IREFSTEN |
|||
Write |
||||||||
Reset |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
图1.4 MCG_C1寄存器
CLKS:时钟源选择。该位用于选择MCG的输出时钟MCGOUTCLK从何而来。在MCG的模式转换过程中,每一步都牵涉到CLKS的设置。注意,每次改变CLKS,输出的时钟并不是马上发生变化,而是有一个过程,必需查询相关的标志位以确保转换完成才能进行下一步设置,需查询的相关标志位在MCG_S寄存器中,有关该寄存器的内容稍后介绍。
图1.5 CLKS选择输出时钟
CLKS选择时钟如表1.1所示
CLKS |
描述 |
00 |
选择PLL或FLL输出 |
01 |
选择内部参考时钟 |
10 |
选择外部参考时钟 |
11 |
保留,缺省为00 |
表1.1CLKS选择输出时钟
FRDIV:锁频环FLL外部参考分频。当FLL的输入参考时钟来自外部晶振时,可通过设置FRDIV对这个来自晶振的参考时钟分频。分频后的时钟可以提供给FLL再倍频,并且这个时钟也可以提供给MCGFFCLK输出。对于有些模块,比如FTM,MCGFFCLK也是可供选择的一个时钟选项。FRDIV的分频系数和外部晶振的频率范围有关,频率范围在MCG_C2寄存器中的RANGE设置。
RANGE=0,分频比=2^FRDIV(FRDIV<=7),如果外部晶振RANGE!=0,则分频比=2^(FRDIV+5)。
注意:分频后提供给FLL倍频的参考时钟不得超过32K。
IREFS:FLL参考时钟源选择。FLL对输入的参考时钟倍频,而这个参考时钟可以来自芯片自带的内部慢速参考时钟,速率为32k,也可以来自外部晶振经由FRDIV设置的分频比分频后的时钟。选择哪一个输入到FLL由IREFS设置。
IREFS=0:选择外部时钟;
IREFS=1: 选择内部慢速参考时钟源。
注意,上电复位时,IREFS默认为1,即FLL对32K内部慢速时钟倍频后输出。
IRCLKEN、IREFSTEN:前面提到,MCG模块有多个时钟输出,其中一个就是MCGIRCLK,这个时钟来自于芯片内部自带的参考时钟,这个时钟也可以提供给某些模块作为时钟选项。IRCLKEN和IREFSTEN就是和这个时钟有关。如图1.6所示。如需要这个时钟,可设置IRCLKEN=1,如希望在停止模式下,该时钟也可以使用,则可设置IREFSTEN=1。在超频过程中,这两位可暂时忽略。
图1.6 MCGIRCLK输出设置
2. MCG控制寄存器2(MCG_C2)
图1.7 MCG_C2寄存器
RANGE:晶振频率范围选择,用于为使用的外部晶振选择频率范围,具体如表1.2所示
RANGE
描述
00
为晶振选择低频范围1K~32K
01
为晶振选择高频范3M~8M
1X
为晶振选择甚高频范围8M~32M
表1.2 RANGE选择
注意:一般情况下,如果使用32K晶振,则可选择RANGE=00,如晶振频率为3~32MHz,则可选择RANGE=01,如果使用更高频率的晶振,则可选择RANGE=1X。
HGO:高增益振荡器选择
HGO=0:设置晶振为低功耗操作;
HGO=1:设置晶振为高增益操作。
EREFS:外部参考选择。来自外部的时钟信号可以是外部直接输入的时钟脉冲,或来自晶体振荡器,可通过EREFS选择。
EREFS=0:外部参考时钟;
EREFS=1:外部振荡器。
注意:一般情况下,我们使用都是外部晶振,该位置1即可。
LP:低功耗选择,用于选择在bypass等模式下,FLL和PLL是否工作,主要出于省电考虑,超频过程中,该位可暂不考虑,默认即可。
IRCS:内部参考时钟选择。如果我们选择把芯片自带的内部时钟作为MCGOUTCLK输出,即设置MCG_C1寄存器中的CLKS=01,则有两个选择,一个是32K的慢速时钟,一个是2M的快速时钟,由IRCS选择。在PLL超频过程中,该位可忽略。
3. MCG控制寄存器5(MCG_C5)
PLLSTEN:设置stop模式下,PLL是否使能。PLL超频过程中,该位可忽略。
PRDIV:PLL外部参考时钟分频。我们选择外部晶振作为参考时钟输入到PLL时,需要先分频到2~4MHz的范围内才可以由PLL倍频后输出。PRDIV就是设置对外部时钟的分频系数。
注意:通过设置PRDIV,结果频率应在2M~4M范围内,当PLL使能,即将PLLCLKEN置1后,在锁相环PLL未锁定频率之前,不可改变PRDIV的值。
4. MCG控制寄存器6(MCG_C6)
PLLS:PLL选择,选择PLL还是FLL作为MCG的时钟源。当CLKS[1:0]=00时,我们可以选择MCGOUTCLK来自PLL或者FLL。到底是PLL还是FLL则由PLLS指定。
PLLS=1:选择PLL,设置PLLS之前,需要设置合适的PRDIV以产生2~4M的参考时钟。
VDIV:PLL压控振荡器倍频系数,VDIV决定参考时钟的倍数。当我们最终选择PLL倍频后输出到MCGOUTCLK时,需要设置VDIV得到我们需要的时钟频率。
注意:PLL最大55倍频,参考时钟最大4MHz,也就是PLL超频最高到220MHz。
5. MCG状态寄存器(MCG_S)
这个寄存器中包含反映MCG状态的标志位,供程序查询。在MCG的模式转换过程中,我们必须查询该寄存器中的某些标志位以确保转换完成。
LOLS:该位反映锁相环的锁定状态,失锁时置 1,写1清除,该位置1时,由MCG_CR6中的LOLIE决定是否产生中断。
LOCK:该位置1表示锁相环已经锁定。在锁定过程中,MGC的PLL时钟被禁止输出,直到LOCK置位。LOCK置位后,任何改变PRDIV或VDIV的操作都会清除LOCK位直到再次锁定频率。
PLLST:该位指示,PLLS的时钟源是来自FLL时钟还是PLL时钟。当我们改变PLLS在PLL和FLL时钟之间切换时,时钟输出的变化需要查询该位以确保切换完成。
IREFST:FLL内部参考时钟状态。当我们改变IREF,对FLL的参考时钟的来源切换时,需要查询该位以确保切换完成才可进行下一步。
CLKST:指示当前的时钟模式。当我们改变CLKS,改变MCGOUTCLK的时钟来源时,需要查询该位以确保切换完成才可进行下一步。
IRCST:内部参考时钟状态。如改变IRCS,则须查询该位,该位和PLL超频无关。
MCG模块和PLL超频有关的寄存器都已经列出来,还有些寄存器和PLL超频无关,不做详细介绍,如想进一步了解可参考数据手册,K10P100M100SF2RM.pdf第24章。
模式转换
如图1.3所示,我们必须通过设置相关的寄存器,实现FEI到FBE的转换,再由FBE转换到PBE,最后再转换到PEE。
1. FEI转换到FBE
FEI模式下,时钟的产生如图1.11所示。FEI是系统复位后MCG默认的工作模式,输出的时钟MCGOUTCLK来自FLL。FLL的参考时钟来自内部32K慢速时钟,FLL倍频后大约20MHz。
以4MHz外部晶振为例,首先设置MCG_C2寄存器,代码如下:
MCG_C2 = MCG_C2_RANGE(1) | MCG_C2_HGO_MASK | MCG_C2_EREFS_MASK;
MCG_C2=0X1C;
MCG_C1 = MCG_C1_CLKS(2) | MCG_C1_FRDIV(3);
当设置完毕后,需查询MCG_S中的几个状态位以确保状态切换完成,才能进行后面的操作,查询状态位的代码如下:
while (!(MCG_S & MCG_S_OSCINIT_MASK)){} //等待锁相环初始化结束
while (MCG_S & MCG_S_IREFST_MASK){} //等待时钟切换到外部参考时钟
while (((MCG_S & MCG_S_CLKST_MASK) >> MCG_S_CLKST_SHIFT)!= 0x2){} //等待MCGOUTCLK切换到外部时钟输出
2. FBE切换到PBE
MCG_C5 = MCG_C5_PRDIV(1);//分频在2~4MHz之间,分频后频率2MHz
MCG_C6 = MCG_C6_PLLS_MASK |MCG_C6_VDIV(26); //选择PLL,倍频50倍
SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIV1(0)| SIM_CLKDIV1_OUTDIV2(1)| SIM_CLKDIV1_OUTDIV3(1) |SIM_CLKDIV1_OUTDIV4(3);
//MCG=PLL, core = MCG, bus = MCG/3,FlexBus = MCG/3, Flash clock= MCG/8
如按以上分频设置,当最终转换到FEE模式后,则系统核心频率为100MHz,BUS和FLEXBUS都为50MHz,FLASH为25MHz。
while (!(MCG_S &MCG_S_PLLST_MASK)){}; // 等待切换到PLL
while (!(MCG_S &MCG_S_LOCK_MASK)){}; //等待PLL锁定频率
3. PBE切换到PEE
在上面完成后,PLL输出的时钟已经准备完毕,只需要最后通过设置MCG_C1中的CLKS,把MCGOUTCLK的来源从外部晶振切换到PLL时钟即可。代码如下:
MCG_C1 &= ~MCG_C1_CLKS_MASK;//CLKS=00,PLL输出
while (((MCG_S & MCG_S_CLKST_MASK)>> MCG_S_CLKST_SHIFT) != 0x3){};//等待切换完毕。
kinetis时钟模块MCG详解相关推荐
- matlab中sinks,MATLAB Simulink模块库详解(二)Sinks篇
MATLAB Simulink模块库详解(二)Sinks篇 Simulink模块库概述 1.Sources模块库,为仿真提供各种信号源 2.Sinks模块库,为仿真提供输出设备元件 3.Continu ...
- STM32开发 -- 惯导模块开发详解
如需转载请注明出处:https://juyou.blog.csdn.net/article/details/93476976 STM32开发 – GPS模块开发详解 这篇文章已经对于GPS模块开发讲得 ...
- 用matlab仿真pwm整流器的方法,MATLAB-PWM整流仿真模块建立详解.pdf
MATLAB-PWM整流仿真模块建立详解 Page System Name 1 psb3levelVSC 2 psb3levelVSC/DC Regulator 3 psb3levelVSC/DC R ...
- python shelve模块_python3 shelve模块的详解
python3 shelve模块的详解 一.简介 在python3中我们使用json或者pickle持久化数据,能dump多次,但只能load一次,因为先前的数据已经被后面dump的数据覆盖掉了.如果 ...
- ngnix的upstream模块配置详解
2019独角兽企业重金招聘Python工程师标准>>> ngnix的upstream模块配置详解 2017年04月04日 13:10:03 阿里-橙鹰-潘民兰 阅读数:15409 标 ...
- python中configparser详解_Python中的ConfigParser模块使用详解
1.基本的读取配置文件 -read(filename) 直接读取ini文件内容 -sections() 得到所有的section,并以列表的形式返回 -options(section) 得到该sect ...
- python中importlib模块安装_Python中标准模块importlib详解
Python中标准模块importlib详解 模块简介 Python提供了importlib包作为标准库的一部分.目的就是提供Python中import语句的实现(以及__import__函数).另外 ...
- python3 json模块_详解python 3.6 安装json 模块(simplejson)
JSON 相关概念: 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON,XML等.反序列化就是从存储区域(JSON,XML)读取反 ...
- python标准库对象导入语句_Python标准库之Sys模块使用详解
sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分. 处理命令行参数 在解释器启动后, argv 列表包含了传递给脚本的所有参数, 列表的第一个元素为脚本自身的名称. 使用sy ...
- Spring Boot的每个模块包详解
Spring Boot的每个模块包详解,具体如下: 1.spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. 2.spring-boot-s ...
最新文章
- Oracle根据日期区间查询Date类型的数据
- 2019.9.19最小生成树知识点总结
- 玩转运维编排服务的权限:Assume Role+Pass Role
- 【广州】Web前端工程师
- C++中未初始化的bool值的问题
- UVa 1635 无关的元素(唯一分解定理+二项式定理)
- Windows投屏android电视,Windows电脑无线投屏到电视
- android studio 融云,融云 SDK 是否支持 AndroidX
- jemalloc java_jemalloc 5.0.0 全新版本发布,内存分配管理
- tcp协议服务器如何做物联网平台,物联网IoT终端设备如何选择接入协议——(TCP、UDP、MQTT、CoAP、LwM2M哪一个更适合?)...
- 怎样用c语言画二次函数图像,利用几何画板演示动态的二次函数
- UVA11584---区间DP
- sap开发语言_海纳易拓:认识SAP顾问的职业前景
- 光猫修改上报服务器地址,怎样改光猫的ip地址!急求!!
- confluent-kafka-go依赖库编译体验优化
- 武汉大学和厦门大学计算机,武汉大学和厦门大学谁更强,为什么有人说这两所大学名气大于实力...
- 模拟高校的三个老师同时分发80份学习笔记
- awk ——awk将每个输入行解释为一条记录而将一行上的每个单词(由空格或行由制表符分隔)解释为每个字段。
- #第五章“拷问”既往的股市理论5.1有人情味的“拷问”
- spring配置读取properties文件