天天看點

飛思卡爾16位單片機(六)——鎖相環測試

一、鎖相環介紹

        在前面的幾個實驗中,我們沒有涉及到單片機的總線時鐘的設定。這是因為飛思卡爾16位單片機在不進行總線時鐘設定的情況下預設的總線時鐘為外部輸入晶振頻率的1/2。我們的實驗電路中用的外部晶振的頻率為16MHz,是以在不設定總線時鐘的情況下,總線時鐘頻率為8MHz。在工程應用中,8MHz的總線頻率比較低,XEP100單片機允許總線頻率為40MHz,實際測試最高可以運作在80MHz的總線頻率下。但不建議設定過高的總線頻率,原因之一是頻率越高穩定性越差;另外過高的總線頻率會影響晶片的壽命。為了獲得比較高的總線頻率,就需要使用鎖相環,通過鎖相環(PLL)可以對晶振頻率進行倍頻,進而形成比較高的總線頻率。鎖相環子產品的功能框圖如下圖所示

飛思卡爾16位單片機(六)——鎖相環測試

        這裡隻介紹兩個比較重要的參數SYNDIV和REFDIV,總線時鐘通過這兩個參數計算得到,計算公式如下:

飛思卡爾16位單片機(六)——鎖相環測試

其中,

飛思卡爾16位單片機(六)——鎖相環測試

是晶振的頻率

SYNDIV和REFDIV這兩個參數通過設定REFDV和SYNR這兩個寄存器中的SYNDIV和REFDIV位進行修改。

二、執行個體測試

        我們通過一個簡單的實驗來了解鎖相環的用法,在本文的資源中,可以下載下傳例程的代碼。

代碼的主要部分是對鎖相環的初始化,代碼如下:

#define  BUS_CLOCK		   80000000	   //總線頻率
#define  OSC_CLOCK		   16000000	   //晶振頻率

/*************************************************************/
/*                      初始化鎖相環                         */
/*************************************************************/
void INIT_PLL(void) 
{
    CLKSEL &= 0x7f;       //設定OSCCLK作為系統時鐘
    PLLCTL &= 0x8F;       //禁止鎖相環
 
    //PLLCLK=2×OSCCLK×(SYNDIV+1)/(REFDIV+1), fbus=PLLCLK/2
    #if(BUS_CLOCK == 120000000) 
        SYNR = 0xcd;
    #elif(BUS_CLOCK == 104000000) 
      SYNR = 0xcc;
    #elif(BUS_CLOCK == 96000000) 
      SYNR = 0xcb;
    #elif(BUS_CLOCK == 88000000) 
      SYNR = 0xca;
    #elif(BUS_CLOCK == 80000000) 
      SYNR = 0xc9;
    #elif(BUS_CLOCK == 72000000) 
      SYNR = 0xc8;
    #elif(BUS_CLOCK == 64000000) 
      SYNR = 0xc7;
    #elif(BUS_CLOCK == 56000000) 
      SYNR = 0xc6;
    #elif(BUS_CLOCK == 48000000) 
      SYNR = 0xc5;
    #elif(BUS_CLOCK == 40000000) 
      SYNR = 0x44;
    #elif(BUS_CLOCK == 32000000)
      SYNR = 0x43;     
    #elif(BUS_CLOCK == 24000000)
      SYNR = 0x42;
    #elif(BUS_CLOCK == 16000000)
      SYNR = 0x01;
   #endif 

    REFDV = 0x81;
    PLLCTL |=0x70;  //使能鎖相環
    asm NOP;
    asm NOP;
    while(!(CRGFLG&0x08)); //PLLCLK鎖定
    CLKSEL |= 0x80;        //設定PLLCLK為系統時鐘
}
           

這段代碼比較簡單,主要是根據期望的總線頻率BUS_CLOCK,對SYNR和REFDV寄存器進行設定,然後通過PLLCTL寄存器使能鎖相環,然後等待鎖相環工作穩定,最後把單片機的總線時鐘源設定為鎖相環時鐘。

       在上面的代碼中,我們看到條件判斷語句前邊都帶有“#”,這與不帶“#”的條件有什麼差別呢?

       帶“#”的代碼稱為預處理部分。所謂預處理是指在進行編譯的第一遍掃描(詞法掃描和文法分析)之前所作的工作。通俗一些說:預處理指令是由程式設計軟體完成的,而不是有單片機完成的。例如:本實驗的代碼中定義了BUS_CLOCK為80000000,是以經過程式設計軟體處理之後,最後這段代碼等效于SYNR=0xc9;,而不是将這段代碼都下載下傳到單片機中。

       預處理是C語言的一個重要功能,它由預處理程式負責完成。當對一個源檔案進行編譯時,系統将自動引用預處理程式對源程式中的預處理部分作處理,處理完畢自動進入對源程式的編譯。C語言提供了多種預處理功能,如宏定義、檔案包含、條件編譯等。合理地使用預處理功能編寫的程式便于閱讀、修改、移植和調試,也有利于子產品化程式設計。

       在程式的主函數中,也比較簡單,就是一段閃燈的代碼。

       将程式下載下傳到單片機中運作,可以看到LED燈快速閃爍。

       将程式的主函數中的設定鎖相環的語句打雙斜線//INIT_PLL();,使此句隐去,即不對鎖相環進行設定,此時總線頻率為8MHz。然後将程式再次燒寫到單片機中運作,可以看到LED燈的閃爍頻率明顯降低。