07 初始化时钟

1:s5pv210的时钟域

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

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

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

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



2.晶振

前言:

常见的时钟的来源:

   外部直接输入时钟信号,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可以产生的时钟的频率的范围:


3.s5pv210推荐时钟设置:

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

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

4.分频框图

根据推荐值来设置相应的MUX开关、PLL锁相环倍频、DIV分频器的值来得到相应的时钟。

5.相应寄存器

1、xPLL_LOCK寄存器,设置locking period,一般为默认值。因为PLL倍频需要一定时间才能达到相应的频率。

2、APLL_CON0寄存器:用来设置APLL的倍频率。

 

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

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

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

4、 CLK_SRC0 寄存器,设置MUX开关
设置各时钟前首先要关闭4个PLL的MUX开关,设置好相应寄存器以后在把PLL的MUX开关打开。


5. CLK_DIV0寄存器:设置各个分频器的值,最终得到各个时钟。

补充:

按照上面分析分频值应该是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

我认为设置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;
}






补充复习图:


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

种瓜大爷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值