SylixOS 基於ZYNQ的時鐘頻率修改詳解

  1. 概述

    本文檔以ZYNQ7000平臺爲例,詳細介紹如何去修改ZYNQ的時鐘頻率。函數

     

  2. 時鐘頻率修改流程

    ZYNQ7000的時鐘頻率修改流程,如圖 2.1所示。具體步驟以下:ui

    步驟一:解除ZYNQ7000的寄存器寫鎖定;spa

    步驟二:向對應寄存器寫入咱們須要設置的PLL倍頻值和PLL配置參數;文檔

    步驟三:進行PLL的旁路模式轉換和軟件重啓,使咱們剛剛設置的PLL倍頻值和PLL配置參數生效;it

    步驟四:從新使寄存器處於寫鎖定狀態。軟件

    圖 2.1 ZYNQ7000的時鐘頻率修改流程圖配置

    ZYNQ7000的ARM_PLL_CLK時鐘頻率修改的具體的代碼實現如程序清單 2.1所示。不一樣平臺的解除和鎖定寫鎖定的方式可能不一樣,對於ZYNQ7000平臺,須要寫入0xDF0D到SLCR_UNLOCK寄存器解除寫鎖定,寫入0x767B到SLCR_LOCK寄存器能夠使相關寄存器的寫操做無效。程序

    程序清單 21 ZYNQ7000的時鐘頻率修改代碼im

    /*********************************************************************************************************
    ** 函數名稱: zynqPllFeedBackSet
    ** 功能描述: zynq的ARM_PLL_CLK時鐘倍頻設置
    ** 輸 入  : NONE
    ** 輸 出  : NONE
    ** 返  回  : NONE
    *********************************************************************************************************/
    VOID  zynqPllFeedBackSet (VOID)
    {
        UINT32  uiClkCtrl;
        UINT32  uiFeedBackDiv;
        UINT32  uiNum;
    
        uiNum = read32(ZYNQ_SLCR + SLCR_LOCKSTA);
        if (0 != uiNum) {
           write32(SLCR_UNLOCK_MAGIC, ZYNQ_SLCR + SLCR_UNLOCK);             /*  寫入0xDF0D,解除寫鎖定      */
           uiNum = 0;
        }
    
        /*
         * 設置ARM_PLL的倍頻值
         */
        uiClkCtrl      = read32(ZYNQ_SLCR + ARM_PLL_CTL);
        uiFeedBackDiv  = uiClkCtrl &~ XZYNQ_SLCR_ARM_PLL_CTRL_PLL_FDIV_MASK;
        uiFeedBackDiv |= (SLCR_FEED_BACK_DIV_VALUE << XZYNQ_SLCR_ARM_PLL_CTRL_PLL_FDIV_OFFSET);
        write32(uiFeedBackDiv, ZYNQ_SLCR + ARM_PLL_CTL);
    
        /*
         * 設置ARM_PLL的配置參數
         */
        uiClkCtrl      = read32(ZYNQ_SLCR + ARM_PLL_CTL);
        write32(SLCR_ARM_PLL_CFG, ZYNQ_SLCR + ARM_CLK_CFG);
    
        /*
         * 進行PLL的旁路模式轉換和軟件重啓,使咱們剛剛設置的PLL倍頻值和PLL配置參數生效
         */
        write32(SLCR_ARM_PLL_CTRL_BYPASS_FORCE | uiClkCtrl, ZYNQ_SLCR + ARM_PLL_CTL);
        write32(SLCR_ARM_PLL_CTRL_RESET | uiClkCtrl, ZYNQ_SLCR + ARM_PLL_CTL);
        read32(ZYNQ_SLCR + PLL_STATUS);
        write32(uiClkCtrl &~ SLCR_ARM_PLL_CTRL_RESET, ZYNQ_SLCR + ARM_PLL_CTL);
        write32(uiClkCtrl &~ SLCR_ARM_PLL_CTRL_BYPASS_FORCE, ZYNQ_SLCR + ARM_PLL_CTL);
    
        if (0 == uiNum) {
            write32(SLCR_LOCK_MAGIC, ZYNQ_SLCR + SLCR_LOCK);                /*  寫入0x760B,打開寫鎖定      */
            uiNum = 1;
        }
    }
     

     

     

  3. PLL的頻率設置

    ZYNQ7000的時鐘頻率設置的參數列表,如圖 3.1所示。其中PLL_FDIV爲PLL的倍頻值,PLL CP、PLL RES、LOCK CNT爲PLL的配置參數。d3

    圖 3.1 PLL頻率的參數設置列表

  4. 免責聲明

    內部交流文檔,僅針對ZNYQ相關平臺,若發現相關錯誤或者建議,請及時聯繫文檔建立者進行修訂和更新。

相關文章
相關標籤/搜索