历史上的今天

今天是:2024年08月27日(星期二)

正在发生

2021年08月27日 | 飞思卡尔XS128系列(一) PLL锁相环

发布者:ShimmeringStar 来源: eefocus关键字:飞思卡尔 手机看文章 扫描二维码
随时随地手机看文章

通俗点说,设置PLL锁相环就相当于超频,单片机超频的原因和PC机是一个道理。 分频的主要原因是外设需要的工作频率往往远低于CPU/MEMORY,这也和PC机南北桥的原理类似。


相对来说,PLL锁相环的设置还是比较简单的,因为东西很死,完全可以照搬。只是大家也不要太贪,设置太高相对来说不够稳定,进行过PC机超频的应该很有体会,一般我们现在用的XS128我觉得设置在80MHz是比较合适的,相比前几届比赛用的DG128,这个频率已经蛮高的了。还有就是SYNR,REFDV只有在CLKSEL_PLLSEL=0的情况下才能写入,不过这是系统默认状态。


多半大家可能还会有以下几点疑问:


1.PLL锁相环怎么设置?


答:通过写REFDV(CRG参考分频寄存器)和SYNR(CRG合成器寄存器)进行设置


2.代码里while(!CRGFLG_LOCK);这句是干什么的?


答:时钟校正同步


 

/**************************************************************************************

------------------------------------

Code Warrior 5.0

Target : MC9S12XS128

Crystal: 16.000Mhz 

============================================   

本程序主要包括以下功能:


设定系统工作在xxMHZ bus clock时钟下;


by:庞辉

*****************************************************************************************/


#include           /* common defines and macros */

#include      /* derivative information */

#pragma LINK_INFO DERIVATIVE "mc9s12xs128"


void SetBusCLK_16M(void)

{   

    CLKSEL=0X00; // disengage PLL to system

    PLLCTL_PLLON=1; // turn on PLL

    SYNR=0x00 | 0x01; // VCOFRQ[7:6];SYNDIV[5:0]

                        // fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)

                        // fPLL= fVCO/(2 × POSTDIV) 

                        // fBUS= fPLL/2 

                        // VCOCLK Frequency Ranges  VCOFRQ[7:6]

                        // 32MHz <= fVCO <= 48MHz    00

                        // 48MHz <  fVCO <= 80MHz    01

                        // Reserved                  10

                        // 80MHz <  fVCO <= 120MHz   11

    REFDV=0x80 | 0x01;  // REFFRQ[7:6];REFDIV[5:0]

                        // fREF=fOSC/(REFDIV + 1)

                        // REFCLK Frequency Ranges  REFFRQ[7:6]

                        // 1MHz <= fREF <=  2MHz       00

                        // 2MHz <  fREF <=  6MHz       01

                        // 6MHz <  fREF <= 12MHz       10

                        // fREF >  12MHz               11                         

                        // pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;

    POSTDIV=0x00;       // 4:0, fPLL= fVCO/(2xPOSTDIV)

                        // If POSTDIV = $00 then fPLL is identical to fVCO (divide by one).

    _asm(nop);          // BUS CLOCK=16M

    _asm(nop);

    while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;

    CLKSEL_PLLSEL =1;         //engage PLL to system; 

}


void SetBusCLK_32M(void)

{   

    CLKSEL=0X00; // disengage PLL to system

    PLLCTL_PLLON=1; // turn on PLL

    SYNR =0x40 | 0x03;  // pllclock=2*osc*(1+SYNR)/(1+REFDV)=64MHz;                      

    REFDV=0x80 | 0x01; 

    POSTDIV=0x00;  

    _asm(nop);          // BUS CLOCK=32M

    _asm(nop);

    while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;

    CLKSEL_PLLSEL =1;         //engage PLL to system; 

}


void SetBusCLK_40M(void)

{   

    CLKSEL=0X00; //disengage PLL to system

    PLLCTL_PLLON=1; //turn on PLL

    SYNR =0xc0 | 0x04;                        

    REFDV=0x80 | 0x01; 

    POSTDIV=0x00;       //pllclock=2*osc*(1+SYNR)/(1+REFDV)=80MHz;

    _asm(nop);          //BUS CLOCK=40M

    _asm(nop);

    while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;

    CLKSEL_PLLSEL =1;         //engage PLL to system; 

}


void SetBusCLK_48M(void)

{   

    CLKSEL=0X00; //disengage PLL to system

    PLLCTL_PLLON=1; //turn on PLL

    SYNR =0xc0 | 0x05;                        

    REFDV=0x80 | 0x01; 

    POSTDIV=0x00;       //pllclock=2*osc*(1+SYNR)/(1+REFDV)=96MHz;

    _asm(nop);          //BUS CLOCK=48M

    _asm(nop);

    while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;

    CLKSEL_PLLSEL =1;         //engage PLL to system; 

}


void SetBusCLK_64M(void)

{   

    CLKSEL=0X00; //disengage PLL to system

    PLLCTL_PLLON=1; //turn on PLL

    SYNR =0xc0 | 0x07;                        

    REFDV=0x80 | 0x01; 

    POSTDIV=0x00;       //pllclock=2*osc*(1+SYNR)/(1+REFDV)=128MHz;

    _asm(nop);          //BUS CLOCK=64M

    _asm(nop);

    while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;

    CLKSEL_PLLSEL =1;         //engage PLL to system; 

}


void SetBusCLK_80M(void)

{   

    CLKSEL=0X00; //disengage PLL to system

    PLLCTL_PLLON=1; //turn on PLL

    SYNR =0xc0 | 0x09;                        

    REFDV=0x80 | 0x01; 

    POSTDIV=0x00;       //pllclock=2*osc*(1+SYNR)/(1+REFDV)=160MHz;

    _asm(nop);          //BUS CLOCK=80M

    _asm(nop);

    while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;

    CLKSEL_PLLSEL =1;         //engage PLL to system; 

}


void SetBusCLK_88M(void)

{   

    CLKSEL=0X00; //disengage PLL to system

    PLLCTL_PLLON=1; //turn on PLL

    SYNR =0xc0 | 0x0a;                        

    REFDV=0x80 | 0x01; 

    POSTDIV=0x00;       //pllclock=2*osc*(1+SYNR)/(1+REFDV)=176MHz;

    _asm(nop);          //BUS CLOCK=88M

    _asm(nop);

    while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;

    CLKSEL_PLLSEL =1;         //engage PLL to system; 

}


void SetBusCLK_96M(void)

{   

    CLKSEL=0X00; //disengage PLL to system

    PLLCTL_PLLON=1; //turn on PLL

    SYNR =0xc0 | 0x0b;                        

    REFDV=0x80 | 0x01; 

    POSTDIV=0x00;       //pllclock=2*osc*(1+SYNR)/(1+REFDV)=192MHz;

    _asm(nop);          //BUS CLOCK=96M

    _asm(nop);

    while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;

    CLKSEL_PLLSEL =1;         //engage PLL to system; 

}


void SetBusCLK_104M(void)

{   

    CLKSEL=0X00; //disengage PLL to system

    PLLCTL_PLLON=1; //turn on PLL

    SYNR =0xc0 | 0x0c;                        

    REFDV=0x80 | 0x01; 

    POSTDIV=0x00;       //pllclock=2*osc*(1+SYNR)/(1+REFDV)=208MHz;

    _asm(nop);          //BUS CLOCK=104M

    _asm(nop);

    while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;

    CLKSEL_PLLSEL =1;         //engage PLL to system; 

}


void SetBusCLK_120M(void)

{   

    CLKSEL=0X00; //disengage PLL to system

    PLLCTL_PLLON=1; //turn on PLL

    SYNR =0xc0 | 0x0d;                        

    REFDV=0x80 | 0x01; 

    POSTDIV=0x00;       //pllclock=2*osc*(1+SYNR)/(1+REFDV)=240MHz;

    _asm(nop);          //BUS CLOCK=120M

    _asm(nop);

    while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;

    CLKSEL_PLLSEL =1;         //engage PLL to system; 

}


void main(void) 

{

  

  EnableInterrupts;


  for(;;) 

  {   

     _asm(nop);

  }   

}


3.为什么代码中会有多多少少的几句空语句?


 

[1] [2]
关键字:飞思卡尔 引用地址:飞思卡尔XS128系列(一) PLL锁相环

上一篇:飞思卡尔智能车 电机PID
下一篇:xs128 双定时器PIT0和PIT1

推荐阅读

进入系统作为一个启动器,可连接更多职能组件与系统,统触发或唤醒其他睡眠状态的系统组件。大陆集团生物识别进入系统可以触发智能玻璃、摄像头与指纹传感器,在车辆个性化和认证领域打开了全新的可能性。该系统独立于的目前使用的进入技术。大陆集团相关负责人曾表示,“生物识别技术的集成使我们在系统集成领域的专业实力发挥到了极致,我们能够将进入控...
随着科技的发展,机器人必然逐渐进入我们的生活,甚至在许多领域替代人类。以下是目前全球范围内最先进的一些机器人:Actroid-F这种实验性机器人的目标,是创造最逼真的仿人类机器人,它们可以说话,眨眼,识别面部表情,并根据判断做出反应REEM全尺寸的人形机器人,能够充当向导,接待员,用多种语言发表演讲幽灵泳者一种无人驾驶水下机器人,可模仿鲨鱼...
原理图:单片机源程序如下:#include "reg52.h"#include "main.h"#include "mfrc522.h" #include <string.h>//M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令//4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反unsigned char code data2[4] = {0x12,0,...
8月25日晚间,赛微电子公布2021年半年度报告,公司上半年实现营业收入约3.95亿元,同比增长9.74%;归属于上市公司股东的净利润约7206.41万元,同比增长515.57%;归属于上市公司股东的扣除非经常性损益的净利润约-549.06万元;基本每股收益0.1128元/股。对于业绩变动的主要原因,赛微电子称,报告期内,公司半导体业务继续快速发展,尤其主营业务MEMS(微机...

史海拾趣

问答坊 | AI 解惑

Altium Designe 和 DXP画的PCB 转换 99格式后 覆铜不见了 解决方法

本帖最后由 dontium 于 2015-1-23 13:21 编辑 blog.ednchina./freeeedoooom/187419/message.aspx …

查看全部问答∨

便携式电子血压计设计

便携式电子血压计设计,详细电路见附件 [ 本帖最后由 emily 于 2009-1-12 15:18 编辑 ]…

查看全部问答∨

电子电路知识点总结

1、 纯净的单晶半导体又称本征半导体,其内部载流子自由电子空穴的数量相等的。 2、 射极输出器属共集电极放大电路,由于其电压放大位数约等于1,且输出电压与输入电压同相位,故又称为电压跟随器(射极跟随器)。 3、 理想差动放大器其共模电压 ...…

查看全部问答∨

关于Protell99使用

很多朋友是做工程师,特别像画板这类,基本上软件显示的都是英文,而事实上没有多少工程师是英文通,但是他们一样能运用自如,像Protell他是可以汉化的,汉文是直观的,但是没有几个人会这样去做,原因只是汉译后的不全面?…

查看全部问答∨

遇到ucos2的一个关于任务莫名其妙被挂起的问题 忘大侠提醒点拨一下

51的CPU  Ucos2的操作系统    问题描述如下:  在TASK10(优先级为15)中我用于大量的数据解析和处理  涉及到大量的数据读出和存储               & ...…

查看全部问答∨

avr外围电路

我用avr mega16单片机运行一个最简单的程序,在学习板上能运行,我把单片机焊在另一块电路板上就不能用了,输出的电平不正确(只连接了vcc和gnd).下面是程序,谁帮我解决一下啊。 //////////////////////////////////// //T0_DEMO // //PA口接LED的 ...…

查看全部问答∨

请教该用什么传感

我想做一个汽车动态称重系统,其中首先要选择一种传感器采集汽车的重量信号,为免去数模转换,我想用一种直接可以把模拟量转换成离散数字信号量的传感器。各位大侠,帮忙指教下该用哪个公司哪个型号的传感器啊?多谢!…

查看全部问答∨

LM3S8962 I2C 总线部分学习分享

内部I2C总线模块介绍: 内部集成电路 (I2C) 总线通过采用两线设计(串行数据线SDA和串行时钟线SCL)来提供双向的数据传输,并连接到串行存储器(RAM和ROM)、网络设备、LCD、音频发生器等外部 I2C设备上。 I2C总线也可在产品的开发和生产过程中用于 ...…

查看全部问答∨

ise10以上和spnplify2009的综合差别有多少啊

ise10以上和spnplify2009的综合差别有多少啊,设计多大规模能明显显示出来啊…

查看全部问答∨

IAR编译选项设置的疑问?

使用STM32,IAR环境下 其中一个片段代码如下:if((analog(5) - analog(6))>10 && (analog(7) - analog(6))>10)// -----1{printf("m2");}else if((analog(5) - analog(7))>&n ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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