07 初始化时钟

1:s5pv210的时钟域

MSYS:(main system)主时钟域,包括CPU,DDR内存条,IROM和IRAM等

DSYS:(display system)显示时钟域,就是一般的和视频有关的就在这个时钟域中,如HDMI,TVENC等

PSYS:(peripheral system)外围时钟域,就是GPIO接口,I2C接口,UART接口等这些外围设备就在这个时钟域上。

注释:每个时钟域通过一条BRG(异步总线的桥梁)连接在一起。


07 初始化时钟_第1张图片


2.晶振

前言:

常见的时钟的来源:

   外部直接输入时钟信号,SoC有个引脚用来输入外部时钟信号,用的很少。

   外部晶振+内部时钟发生器产生时钟,大部分低频单片机都是这么工作的。

   外部晶振+内部时钟发生器+内部PLL产生高频时钟+内部分频器分频得到各种频率的时钟,210属于这种。

07 初始化时钟_第2张图片

从上图可知:

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可以产生的时钟的频率的范围:

07 初始化时钟_第3张图片


3.s5pv210推荐时钟设置:

07 初始化时钟_第4张图片

  HCLK_DSYS:DSYS时钟域的高频率线;

  PCLK_DSYS:DSYS时钟域的低频率线;其他的依次类推

4.分频框图

根据推荐值来设置相应的MUX开关、PLL锁相环倍频、DIV分频器的值来得到相应的时钟。
07 初始化时钟_第5张图片

5.相应寄存器

1、xPLL_LOCK寄存器,设置locking period,一般为默认值。因为PLL倍频需要一定时间才能达到相应的频率。
07 初始化时钟_第6张图片
2、APLL_CON0寄存器:用来设置APLL的倍频率。

07 初始化时钟_第7张图片

 

07 初始化时钟_第8张图片

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的倍频率

07 初始化时钟_第9张图片

07 初始化时钟_第10张图片

FOUT = MDIV X FIN / (PDIV X 2SDIV) 

 SDIV:1、  PDIV:12、  MDIV:667;FOUT = 667MHz;

4、 CLK_SRC0 寄存器,设置MUX开关
设置各时钟前首先要关闭4个PLL的MUX开关,设置好相应寄存器以后在把PLL的MUX开关打开。
07 初始化时钟_第11张图片

5. CLK_DIV0寄存器:设置各个分频器的值,最终得到各个时钟。
07 初始化时钟_第12张图片

补充:

按照上面分析分频值应该是rCLK_DIV0 = 0x14131400;笔者发现运行有错误,经过调试后发现在寄存器说明中有这样一句话:
There are operating frequency limitations. The maximum operating frequency of SCLKAPLL, SCLKMPLL,
SCLKA2M, HCLK_MSYS, and PCLK_MSYS are 1GHz, 667 MHz, 400 MHz, 200 MHz, and 100 MHz,
respectively.
 
大致意思:有 工作频率的限制,SCLKA2M最大频率为200MHZ。所以按照上面的分频SCLKA2M = 1000MHZ,笔者取分频系数为4即SCLKA2M = 1000/(4+1) = 200MHZ较为稳定。rCLK_DIV0 = 0x14131440;

代码:

注意!!!:start.S
07 初始化时钟_第13张图片
我认为设置SVC栈应该在初始化时钟的前面(开辟栈才能调用C语言),我以前跟老师学习的时候顺序在后面了,但也没出现错误。。。我怀疑是智能机制,先留个疑问。

clock.c代码:
#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;
}






补充复习图:

07 初始化时钟_第14张图片

你可能感兴趣的:(cortex-A8裸机编程)