MC9S12G128 PLL设置

对于一款单片机的使用,首先要知道的就是总线时钟,对于飞思卡尔单片机MC9S12G128而言,其时钟有下图所示:

MC9S12G128 PLL设置_第1张图片

如大多单片机那样,MC9S12G128单片机也有外部晶振和内部晶振,而总线时钟是经过各种分频和变频得到,总线时钟的设置,直接关系到定时器、串口波特率等,在这里选用的是外部晶振经过变换得到的总线时钟。

如下图所示,fbus为最后要得到的总线时钟频率,其等于fPLL/2,那么又要确定fPLL的频率,而fPLL跟fVCO以及分频有关,分频的在寄存器中中设置,一共5位。

MC9S12G128 PLL设置_第2张图片

而fVCO又可根据下图求得,fVCO跟fREF及倍频有关,倍频值SYNDIV可在寄存器中设置,一共6位。

MC9S12G128 PLL设置_第3张图片

最后,fREF可根据下图求得,其跟,fOSC和分频值REFDIV有关,fOSC是晶振频率,这里是用的外部晶振频率,REFDIV是可在寄存器中设置,一共4位。

MC9S12G128 PLL设置_第4张图片

到这里,我们就知道了总线时钟频率是怎么得到的,其初始化程序如下:

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

系统时钟配置参考表:

VCOCLK Frequency Ranges      VCOFRQ[1:0]

32MHz <= fVCO<= 48MHz            00

48MHz < fVCO<= 50MHz             01

Reserved                         10

Reserved                         11

 

REFCLK Frequency Ranges      REFFRQ[1:0]

(OSCE=1)

1MHz <= fREF <= 2MHz             00

2MHz < fREF <= 6MHz              01

6MHz < fREF <= 12MHz             10

fREF >12MHz                      11

 

If PLL has locked (LOCK=1)        fVCO = 2 × fREF × (SYNDIV + 1)

 

                                           fOSC            

If XOSCLCP is enabled (OSCE=1)    fREF= -------------

                                        (REFDIV + 1) 

                                                  

If XOSCLCP is disabled (OSCE=0)   fREF = fIRC1M

 

                                           fVCO

If PLL is locked (LOCK=1)         fPLL= -------------

                                       (POSTDIV + 1)

 

                                          fVCO

If PLL is not locked (LOCK=0)     fPLL= -------

                                           4

                                         

                                           fPLL

If PLL is selected (PLLSEL=1)     fbus= ----------

                                            2

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

void SetBusClock()

{  

 

 CPMUPROT = 0x26;            //保护时钟配置寄存器 

 CPMUCLKS_PSTP = 0;          //禁用PLL 

 CPMUCLKS_PLLSEL = 1;        //选择PLL作为系统时钟源 

 CPMUOSC_OSCE = 1;           //外部晶振使能 

   

 CPMUSYNR = 0x07;           //fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)                       

 CPMUREFDIV = 0x01;         //16M:07,0F;32M:07,07;64M:07,03 

     

 CPMUPOSTDIV = 0x00;         // PLLCLOCK = VCO CLOCK / (POSTDIV + 1)  

                               

 _asm(nop); 

 _asm(nop); 

   

 CPMUPLL=0x10;               //锁相环调频启用,用以减少噪音 

     

 while(CPMUFLG_LOCK == 0);   //等待PLL稳定  

CPMUPROT = 0x00;            //关闭保护时钟                                    

}




你可能感兴趣的:(飞思卡尔MC9S12G128)