S5P4418裸机开发(五):时钟

S5P4418裸机开发(五):时钟_第1张图片

  • 4个PLL,生成一些列时钟

S5P4418裸机开发(五):时钟_第2张图片

  • PLL计算公式 :PLLx = (m * Fin) / (p * 2^s) 文档上写的有点问题;
  • m = MDIV; p = PDIV; s = SDIV;

S5P4418裸机开发(五):时钟_第3张图片

  • 修改PLL的值后,PWRMODE.CHGPLL必须置‘1’
  • 还有CLKMODEREG0.UPDATE_PLL[x]也要置‘1’

S5P4418裸机开发(五):时钟_第4张图片
S5P4418裸机开发(五):时钟_第5张图片

寄存器

功能
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的配置,打印出来看看;
S5P4418裸机开发(五):时钟_第6张图片

  • 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

你可能感兴趣的:(嵌入式)