八个字搞定一切MCU时钟模块配置
用飞思卡尔单片机图得就是它的稳定可靠,如果因为时钟配置而影响稳定性,岂不是暴殄天物?那干脆用STM32好了~~~
时钟是数字器件的心脏,协调着整个器件的工作时序,器件上电后首要工作通常是配置时钟。
MK系列的时钟模块看起来显得较复杂,其实只要掌握了几个要点,就再也不用纠结于FEI、FEE、FBI、FBE、PBE、PEE、BLPI、BLPE。。。了。
MK时钟配置要点:
1、 设置OUTDIV1~4,确保所有步骤这四个时钟频率均处于安全范围。
2、 配置FLL/PLL,配置OSC,确保OSC输出频率在FLL/PLL规定范围内。
3、 启动OSC,启动FLL/PLL,等待它们稳定。
4、 切换到所设置的时钟源。
前面有网友发了MK60的时钟配置图,需要16个步骤,我觉得太复杂了。
原帖地址
这里来张清晰点的MK64时钟结构图:
说了一堆,还是纸上谈兵,下面来几个实例吧。
/**************************************************************
使用外部50MHz时钟倍频为100MHz主频
**************************************************************/
SIM_CLKDIV1 = 0x01130000u; // 步骤1:设置输出时钟分频因数:1/2/2/4
Delay();
MCG_C5 = 0x0Fu; //步骤2:设置PLL输入分频因数(16分频)
MCG_C6 = 0x08u; //步骤3:设置PLL倍频因数(32倍频)
MCG_C5_PLLCLKEN0 = 1; //步骤4:开启PLL
Delay();
while (!MCG_S_LOCK0) ; //步骤5:等待PLL锁定
Delay();
MCG_C6_PLLS = 1; //步骤6:切换到PLL时钟
Delay();
while (((MCG_S >> 2) & 0x03) != 0x03) ; //步骤7:确认已切换到PLL时钟
Delay();
SIM_SOPT2_PLLFLLSEL0 = 1; //步骤8:选择MCGPLLCLK时钟源
Delay();
/****************** 简单而抽象,才是真正的美 *******************/
只要8条语句就可完成配置,现在是不是感觉简单得多?
下面是使用外部12MHz晶振倍频为120MHz主频的实例:
/**************************************************************
使用外部12MHz晶振倍频为120MHz主频
**************************************************************/
SIM_CLKDIV1 = 0x01240000u; // 设置输出时钟分频因数:1/2/3/5
Delay();
MCG_C5 = 0x03u; // 设置PLL输入分频因数(4分频)
MCG_C6 = 0x10u; // 设置PLL倍频因数(40倍频)
MCG_C2 = 0x9Cu; // 配置并启动OSC
MCG_C5_PLLCLKEN0 = 1; // 开启PLL
Delay();
while (!MCG_S_OSCINIT0) ; // 等待OSC时钟就绪
Delay();
while (!MCG_S_LOCK0) ; // 等待PLL锁定
Delay();
MCG_C6_PLLS = 1; // 切换到PLL时钟
Delay();
while (((MCG_S >> 2) & 0x03) != 0x03) ; // 确认已切换到PLL时钟
Delay();
SIM_SOPT2_PLLFLLSEL0 = 1; // 选择MCGPLLCLK时钟源
Delay();
/****************** 简单而抽象,才是真正的美 *******************/
如果用内部32KHz RC振荡器倍频为96MHz主频,那就更简单了:
/**************************************************************
使用内部32KHz RC振荡器倍频为96MHz主频
**************************************************************/
SIM_CLKDIV1 = 0x01130000u; // 设置输出时钟分频因数::1/2/2/4
Delay();
MCG_C2_IRCS = 1; // 选择内部4MHz RC振荡器
Delay();
MCG_C1_CLKS0 = 1; // 切换到内部4MHz RC振荡器
Delay();
MCG_C4 |= 0x03u << 5; // 设置DCO频率范围
Delay();
MCG_C1_CLKS0 = 0; // 选择MCGFLLCLK时钟源
Delay();
while (((MCG_S >> 2) & 0x03) != 0x00) ; // 确认已切换到FLL时钟
Delay();
/****************** 简单而抽象,才是真正的美 *******************/
注意:上面的例子需要注意各步骤之间的延时。
虽然以上讲的是飞思卡尔MK单片机,但对所有其它MCU也同样适用。
所有这些,可以归结为简单的八个字:
说来惭愧,老衲至今不知道“FEI、FEE、FBI、FBE、PBE、PEE、BLPI、BLPE”是何意思。。。 第一张图好像在论坛见过 哪八个字? bbstr 发表于 2014-12-30 18:22
哪八个字?
最后一张图片的最后八个字。 讲得很清楚。问下是哪八个字? 逆向配置,顺向切换。怎么理解? fengyunyu 发表于 2014-12-30 18:26
逆向配置,顺向切换。怎么理解?
一楼的第二张图,标出了相对于时钟流的配置方向和切换方向。
1、配置是一个逆向的,主要的任务是中间的一些分频或者倍频这些参数
2、切换是一个开关,有50mhz
到内核的时钟要经过重重关卡。需要顺向的配置这些具有开关性质的位吧。。有的还需要等待一段时间,才能维持稳定
3、顺向切换的时候,后边的关卡是不能够提前打开的吧。。也就是说,必须要由前到后,
如果先配置了后边会出现什么情况呢 1、一般的逻辑思维是正向配置 正向切换楼主提出正向切换 逆向配置 具体到代码里边,实际上是分为配置逻辑部分和切换逻辑部分的 。。
2、学到俩名词哈。 ls解释很清楚 多看手册
要么不用 这图片画的挺炫的 ,八字总结的很好 这个从哪里来的,有什么根据吗? laoshuhunya 发表于 2014-12-30 18:20
说来惭愧,老衲至今不知道“FEI、FEE、FBI、FBE、PBE、PEE、BLPI、BLPE”是何意思。。。 ...
这个在手册里很明确 laoshuhunya 发表于 2014-12-30 18:20
说来惭愧,老衲至今不知道“FEI、FEE、FBI、FBE、PBE、PEE、BLPI、BLPE”是何意思。。。 ...
这个在手册里很明确 我是来学习的。。。。。 楼主做的很用心啊,谢谢! 总结的很好,有个大的概念了,不是乱糟糟啦 是哪八个字,没看到啊 holts2 发表于 2014-12-31 11:34
是哪八个字,没看到啊
逆向配置,顺向切换。 图片上可以看到
逆向配置,顺向切换。 没理解这几个字的含义 一般都是使用库文件提供的配置不做太大的改动 分析的不错 子鱼 发表于 2014-12-31 11:47
逆向配置,顺向切换。 图片上可以看到
为什么不可以顺向配置,顺向切换 ? 等待的时候是否加超时处理好一点 请看数据手册 我才6个字
是记住这8个么?
FEI、FEE、FBI、FBE、PBE、PEE、BLPI、BLPE 最后一张图,真牛逼 找了好久才找到那八个字 学习了,感谢分享 ...最后的图片好喜感。。不过楼主做的的确还不错 飞思卡尔的时钟管理真是强大啊 这个方法太好了,本来不太名词飞思这些步骤,这一看明了了 这八个字好难找,看了三遍才找到 不是很理解,慢慢消化了 八个字找不到 本帖最后由 897152237 于 2015-1-5 22:13 编辑
楼主NC么?STM32很差么?FSL的稳定是体现在时钟上么?
ps:我不想骂人的,就是看不惯胡乱喷别的架构或芯片不行的人,吃透了再说,楼主修改楼主位措辞后,我修改评论,谢谢! 技术也可以以那么快乐……{:biggrin:}{:biggrin:}
页:
[1]