07 初始化时钟

来源:互联网 发布:gnu与linux 编辑:程序博客网 时间:2024/06/06 04:37

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代码:






补充复习图:


0 0
原创粉丝点击