般来讲,MCU 的主时钟来源主要是外部晶振或外部时钟,比较常见的是外部晶振。 一般情况, 系统内所使用的时钟都是高频率的时钟,外部晶振一般达不到那么高的频率,所以
一般使用锁相环电路(PLL)进行倍频,而 210 正是通过外接 24MHz 的外部晶振,通过一定的倍频达到更高的频率。
S5PV210 拥有三个时钟域, 分别是主系统时钟(MSYS) 、 显示系统时钟(DSYS) 、以及外设相关系统时钟(PSYS) 。MSYS 主要是给 Cortex A8 处理器、DRAM 内存
控制器、 3D、内部 SRAM、 INTC 以及配置接口 SPERI 用的,最高可达到 200MHz; DSYS主要是给显示相关的模块用的,如: FIMC、 FIMD、 JPEG 等,最高可达到 166MHz
PSYS 主要用于 IO 外设用的,如:GPIO 、I2C 、WDT 、UART 等。
S5PV210有 4 种 PLL 电路,分别是 APLL(主要驱动 MSYS 时钟域) 、MPLL(主要驱动 DSYS时钟域) 、 EPLL (主要用于产生 audio 时钟)、 VPLL (主要用于 video 系统时
钟)。
经典的频率参数:
freq(ARMCLK) = 1000MHz
freq(HCLK_MSYS) = 200MHz
freq(HCLK_IMEM) = 100MHz
freq(PCLK_MSYS) = 100MHz
freq(HCLK_DSYS) = 166MHz
freq(PCLK_DSYS) = 83MHz
freq(HCLK_PSYS) = 133MHz
freq(PCLK_PSYS) = 66MHz
freq(SCLK_ONENAND) = 133MHz,166MHz
系统时钟配置的一般步骤
② 配置 PLL
③ 选择时钟源
④ 配置 MDIV、PDIV、SDIV 的分频系数
S5PV210 的经典配置参数
这里是APLL参数的推荐值.具体计算公式:
Equation to calculate the output frequency:
FOUT = MDIV X FIN / (PDIV ×2^SDIV-1)
参数直接配置是非常困难的,所以给出了一些常用的经典参数,直接查表用就可以了。具体公式和其他的推荐值都在210手册上面。
S5PV210 寄存器的配置
时间?因 为 PLL 设置完成过程需要一个起振的过程,这段时间内 PLL 输
出的频率还不稳定。
② xPLL 的配置需要设置 APLL_CON0、MPLL_CON 寄存器。
③ 时钟源的选择需要设置 CLK_SRC0 寄存器。
④ 时钟分频系需要配置 CLK_DIV0 寄存器。
#include"clock.h"
/*S5PV210有三个时钟域:
主系统时钟(MSYS) 显示系统时钟(DSYS),外设相关时钟(PSYS);
有4路PLL时钟
APPL(驱动MSYS),MPLL(驱动DSYS时钟域),EPLL(产生audio时钟),VPPL(主要video时钟);
FOUT=MDIV*FIN/(PDIV*2^(SDIV-1))
时钟关系:
MSYS:
-freq(ARMCLK) =freq(MOUT_MSYS)/N(1<N<8);
-freq(HCLK_MSYS) =freq(ARMCLK)/N(1<N<8);
-freq(PCLK_MSYS) =freq(HCLK_MSYS)/N(1<N<8);
-freq(HCLK_IMEM) =freq(HCLK_MSYS)/2;
DSYS:
-freq(HCLK_DSYS) =freq(MOUT_DSYS)/N(1-16);
-freq(PCLK_DSYS) =freq(HCLK_DSYS)/N(1-8);
PSYS:
freq(HCLK_PSYS)=freq(MOUT_PSYS)/N(1<N<16)
freq(PCLK_PSYS)=freq(HCLK_PSYS)/N(1<N<8);
freq(PCLK_ONENAND)=freq(HCLK_PSYS)/N(1<N<8);
*/
/*
* sys_clock_init()函数的总体设置时钟情况如下:
* ARMCLK=1000MHz, HCLKM=200MHz, HCLKD=166.75MHz
* HCLKP =133.44MHz, PCLKM=100MHz, PCLKD=83.375MHz,
* PCLKP =66.7MHz
*/
/*配置步骤:
1.设置系统锁相环电路(PLL)的锁定时间
2.配置PLL
3.选择时钟源
4.配置MDIV,PDIV,SDIV的分频系数。
每个时钟为了方便配置都给了写推荐值
例如:
APLL:
FIN TargetFout P M S FOUT (MHZ)
24 1000 3 125 1 1000
FOUT=125*24/(3*2^(1-1))=1000;
void sys_clock_init()
{
/*
* 由Fin通过PLL上升到一定的频率所需要的锁定时间
*/
APLL_LOCK = 0xFFFF;
MPLL_LOCK = 0xFFFF;
/*
* 使能APLL控制器,使能锁标志位,MDIV = 0x7d,PDIV = 0x3,SDIV = 0x1
* FOUTapll = MDIV * FIN / (PDIV*2^(SDIV-1))
* = 0x7d*24/(0x3*2^(0x1-1))
* = 125*24/(3*2) = 1000MHz
*/
/*
bit[31]:使能位;
bit[29]:锁定位;
bit[25:16]:MDIV;
bit[13:8]:PDIV;
bit[2:0]:SDIV;*/
APLL_CON0 = (1 << 31)|(1 << 29)|(0x7d << 16)|(0x3 << 8)|(0x1 << 0);
/*
* 使能MPLL控制器,使能锁标志位,MDIV = 0x29b,PDIV = 0xc,SDIV = 0x1
* FOUTmpll = MDIV * FIN / (PDIV*2^SDIV)
* = 0x29b*24/(0xc*2^1)
* = 667*24/(12*2) = 667MHz
*/
MPLL_CON = (1 << 31)|(1 << 29)|(0x29b << 16)|(0xc << 8)|(0x1 << 0);
/*
* 时钟源的设置
* ONENAND_SEL = HCLK_DSYS 高位
* MUX_PSYS_SEL = SCLKMPLL
* MUX_DSYS_SEL = SCLKMPLL /|\
* MUX_MSYS_SEL = SCLKAPLL |
* VPLL_SEL = FOUTVPLL |
* EPLL_SEL = FOUTEPLL |
* MPLL_SEL = FOUTMPLL
* APLL_SEL = FOUTAPLL 低位
*/
CLK_SRC0 = (1 << 28)|(1 << 12)|(1 << 8)|(1 << 4)|(1 << 0);
/*
* 设置系统时钟分频系数
* PCLK_PSYS_RATIO = 0x1 高位
* HCLK_PSYS_RATIO = 0x4
* PCLK_DSYS_RATIO = 0x1 /|\
* HCLK_DSYS_RATIO = 0x3 |
* PCLK_MSYS_RATIO = 0x1 |
* HCLK_MSYS_RATIO = 0x4 |
* A2M_RATIO = 0x4
* APLL_RATIO = 0x0 低位
*/
CLK_DIV0 = (0x1 << 28)|(0x4 << 24)|(0x1 << 20)|(0x3 << 16)|(0x1 << 12)|(0x4 << 8)|(0x4 << 4)|(0 << 0);
}
/*① MOUT_MSYS = FOUTapll = 1000MHz 而 ARMCLK 根据经典值为 1000 ,所以
APLL_RATIO = 0;
② SLKA2M = HCLK_MSYS = 200MHz,而 SCLKAPLL = 1000,所以 A2M_RATIO = 4;
③ HCLK_MSYS = 200MHz,而 ARMCLK = 1000,所以 HCLK_MSYS_RATIO = 4;
④ MOUT_DSY 来自 SCLKmpll 即 FOUTmpll = 667MHz,而 HCLK_DSYS 按照经典设
置应为 166MHz 所以,HCLK_DSY_RATIO 约为 3;
⑤ 按照 5.1 节讲的经典值设置可知 PCLK_DSYS = 166MHz,HCLK_DSYS=83MHz,故
PCLK_DSYS_RATIO = 1;
⑥ 由图 5.3 可知, MOUT_PSYS 与 MOUT_DSYS 的来源是一样的,故也是 FOUTmpll
= 667MHz,而 HCLK_PSYS = 133,故 HCLK_PSYS_RATIO = 4;
⑦ 按照 5.1 节讲的经典值设置可知 PCLK_PSYS = 66MHz,HCLK_PSYS=133MHz,故
PCLK_PSYS_RATIO = 1;*/