- 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