MSYS:(main system)主时钟域,包括CPU,DDR内存条,IROM和IRAM等
DSYS:(display system)显示时钟域,就是一般的和视频有关的就在这个时钟域中,如HDMI,TVENC等
PSYS:(peripheral system)外围时钟域,就是GPIO接口,I2C接口,UART接口等这些外围设备就在这个时钟域上。
注释:每个时钟域通过一条BRG(异步总线的桥梁)连接在一起。
常见的时钟的来源:
外部直接输入时钟信号,SoC有个引脚用来输入外部时钟信号,用的很少。
外部晶振+内部时钟发生器产生时钟,大部分低频单片机都是这么工作的。
外部晶振+内部时钟发生器+内部PLL产生高频时钟+内部分频器分频得到各种频率的时钟,210属于这种。
从上图可知:
s5pv210有4个晶振时钟,
XRTCXTI:提供32.768KHz,RTC 使用;XRTCXTI and XRTCXTO pins
XXTI:CMU and PLL使用这个时钟为APLL、MPLL、VPLL、EPLL提供时钟。推荐频率24MHz。XXTI and XXTO pins
XUSBXTI:为APLL、MPLL、VPLL、EPLL、USB PHY提供时钟,推荐24MHz。XUSBXTI and XUSBXTO pins.
XHDMIXTI :27MHz,VPLL、HDMI PHY为TV解码器提供54MHz时钟。XHDMIXTI and XHDMIXTO pins
补充:我们的210芯片,一般是从XXTI这个接口进入,这个接口连接外部晶振(规定是24MHz),然后进入内部时钟发生器(syscon),再分别进入4个PLL,分别产生4种不同的高频时钟,各个高频时钟再经过内部的分频器分频得到各种频率的时钟。
下面是各种PLL可以产生的时钟的频率的范围:
HCLK_DSYS:DSYS时钟域的高频率线;
PCLK_DSYS:DSYS时钟域的低频率线;其他的依次类推
FOUT = MDIV X FIN / (PDIV × 2SDIV-1)
频率1000 MDVI:125、 PDIV:3、 SDIV:1;FOUT = MDIV X FIN / (PDIV × 2SDIV-1) 根据公式计算 FOUT = 1000MHz;
3、 MPLL_CON:寄存器,设置MPLL的倍频率#define CLK_SRC0 0xE0100200 //设置MUX开关(打开或关闭PLL)
#define APLL_LOCK 0xE0100000 //设置locking period,因为PLL倍频需要一定时间才能达到相应的频率。
#define MPLL_LOCK 0xE0100008
#define EPLL_LOCK 0xE0100010
#define VPLL_LOCK 0xE0100020 //
#define APLL_CON0 0xE0100100 //用来设置APLL的倍频率
#define MPLL_CON0 0xE0100108 //用来设置MPLL的倍频率
#define CLK_DIV0 0xE0100300 //用来分频
/*设置APLL倍频系数*/
#define APLL_MDIV (125)
#define APLL_PDIV (3)
#define APLL_SDIV (1)
/*设置MPLL倍频系数*/
#define MPLL_MDIV (667)
#define MPLL_PDIV (12)
#define MPLL_SDIV (1)
#define rCLK_SRC0 *((volatile unsigned int *)CLK_SRC0)
#define rAPLL_LOCK *((volatile unsigned int *)APLL_LOCK)
#define rMPLL_LOCK *((volatile unsigned int *)MPLL_LOCK)
#define rEPLL_LOCK *((volatile unsigned int *)EPLL_LOCK)
#define rVPLL_LOCK *((volatile unsigned int *)VPLL_LOCK)
#define rAPLL_CON0 *((volatile unsigned int *)APLL_CON0)
#define rMPLL_CON0 *((volatile unsigned int *)MPLL_CON0)
#define rCLK_DIV0 *((volatile unsigned int *)CLK_DIV0)
void clock_init(){
/*1-先关闭PLL以便打开locking period*/
rCLK_SRC0 = 0x0;
/*2-设置默认锁定时间*/
rAPLL_LOCK = 0x0FFF;
rMPLL_LOCK = 0x0FFF;
rEPLL_LOCK = 0x0FFF;
rVPLL_LOCK = 0x0FFF;
/*3-设置APLL和MPLL倍频升频率*/
rAPLL_CON0 = (1<<31) | (APLL_MDIV<<16) | (APLL_PDIV<<8) | (APLL_SDIV<<0);
rMPLL_CON0 = (1<<31) | (MPLL_MDIV<<16) | (MPLL_PDIV<<8) | (MPLL_SDIV<<0);
/*4-设置分频*/
rCLK_DIV0 = 0x14131440;
/*4-打开PLL*/
rCLK_SRC0 = 0x1111;
}