S5P4418裸機開發(五):時鐘

這裏寫圖片描述

  • 4個PLL,生成一些列時鐘

這裏寫圖片描述

  • PLL計算公式 :PLLx = (m * Fin) / (p * 2^s) 文檔上寫的有點問題;
  • m = MDIV; p = PDIV; s = SDIV;

這裏寫圖片描述

  • 修改PLL的值後,PWRMODE.CHGPLL必須置‘1’
  • 還有CLKMODEREG0.UPDATE_PLL[x]也要置‘1’

這裏寫圖片描述
這裏寫圖片描述

寄存器

功能
CLKMODEREG0 更新PLL[x]的PMS值
CLKMODEREG1 保留
PLLSETREG0 PLL0設置寄存器
[30] PLL擴頻使能,忽略non-dithered PLL
[29] 電源
[28] 旁路PLL輸出
[27:24] 預分頻
[23:0] PMS
PLLSETREG1 PLL1
PLLSETREG2 PLL2
PLLSETREG3 PLL3
CLKDIVREG0 FCLK/HCLK設置寄存器; FCLK:HCLK = 4:1
[14:9] HCLK分頻係數
[8:3] FCLK分頻係數
[2:0] 選擇時鐘源PLL[x]
CLKDIVREG1 BCLK/PCLK設置寄存器; BCLK:PCLK = 2:1
CLKDIVREG2 MDCLK/MCLK/MBCLK/MPCLK設置寄存器;
MDCLK:MCLK:MBCLK:MPCLK = 4:4:2:1
CLKDIVREG3 GR3DBCLK/GR3DPCLK設置寄存器;和GPU有關
CLKDIVREG4 MPGBCLK/MPGPCLK設置寄存器;和MFC有關
PLLSETREGx_SSCG 擴頻
GPIOWAKEUPRISEENB 上升沿檢測使能寄存器
GPIOWAKEUPFALLENB 下降沿檢測使能寄存器
GPIORSTENB GPIO重置使能寄存器
GPIOWKENB GPIO喚醒使能寄存器
INTENB GPIO中斷使能寄存器
GPIOINTPEND GPIO中斷掛起寄存器
RESETSTATUS 復位相關寄存器
The priority of Reset - POR > GPIO > Watchdog > Software
INTENABLE 中斷使能寄存器
INTPEND 中斷掛起寄存器
PWRCONT 電源管理控制寄存器
[4] 外部晶振電源模式選擇
[3] 軟件復位使能
[1] RTC喚醒使能
PWRMODE 電源管理模式寄存器
[15] R:PLL是否穩定 W:PLL是否改變
PADSTRENGTHGPIOAL SCRATCH REGISTER
SYSRSTCONFIG SYSTEM RESET COFIGURATION REGISTER

時鐘配置

SD卡燒的是友善的安卓鏡像,2nboot部分幫我們做了PLL的配置,打印出來看看;
這裏寫圖片描述

  • PLL0:550MHz ----- PMS:3 275 2
  • PLL1:800MHz ----- PMS:3 200 1
  • PLL2:800MHz ----- PMS:3 200 1
  • PLL3:612MHz ----- PMS:2 102 1
  • FCLK:爲CPU核提供時鐘;
    • 手冊推薦使用PLL0來生成FCLK,友善使用的是PLL1;
    • FCLK分頻係數是1,即不分頻,FCLK = 800MHz;
  • HCLK:分頻係數4,HCLK = 200MHz;
  • BCLK由PLL2生成,PCLK由BCLK分頻後得到,上圖中PCLK的分頻係數是2,這個分頻是在BCLK的基礎上再進行分頻,所以BCLK : PCLK = 2 : 1。PCLK = 200MHz。HCLK同理。
修改CPU運行速度

LED點燈的基礎上修改,CPU默認頻率是800MHz,我們讓燈閃爍的慢一些;
兩種方式;

  • 修改PMS值,將PLL的頻率降下來;

    • 相關寄存器PLLSETREG1, PWRMODE, CLKMODEREG0
    void chg_pll(){
    
        PLLSETREG1 &= ~((0x3F << 18) | (0x3FF << 8) | (0xFF << 0));
        PLLSETREG1 |= (3 << 18) | (96 << 8) | (4 << 0);    // 修改PMS
    
    
        PWRMODE |= (1 << 15);           //寫1表示要修改PLL值
        CLKMODEREG0 |= (1 << 1);        // Update P,M,S values for PLL[1]
        while((PWRMODE >> 15) & 1);     //等待PLL穩定
    }
    
  • 修改FCLK分頻係數,注意FCLK和HCLK的比例;

    • 相關寄存器CLKDIVREG0, PWRMODE.chgpll,修改分頻係數也要將PWRMODE.chgpll置位,要不然不起效果,或者着說只要動頻率都要改這一位;
    void chg_div(){
        CLKDIVREG0 &= ~((0x3F << 3)  | (0x3F << 9));        // (0x7 << 0) | 
        CLKDIVREG0 |= (((1 - 1) << 3) | ((4 - 1) << 9));    // FCLK = 800 / 10;  HCLK = 800 / 40;
        PWRMODE |= (1 << 15); 
    
        while((PWRMODE >> 15) & 1);
    

}
```

工程文件:
碼雲_3_chgpll

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章