- 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