从零开始基于S5PV210的嵌入式时钟系统的分析
--参考朱有鹏ARM裸机教程
1、什么是时钟?SOC为什么需要时钟?
(1)时钟是同步工作系统的同步节拍。
(2)SOC内部有很多器件,比如CPU、串口、DRAM控制器,GPIO等内部外设
这些东西要彼此协同工作,需要一个共同的时钟系统来指挥。
这些就是我们SOC的时钟系统。
2、时钟一般是如何获得的?
SOC时钟获得一般是由下面的几种方式获得:
1、外部直接输入时钟信号,SOC有一个引脚用来输入外部时钟信号,一般我们的51单片机
就是用这种方式进行的,也就是多个单片机都可以用这个晶振共同工作。
2、外部晶振+内部时钟发生器产生时钟,大部分单片机都是这么工作的。
3、外部晶振+内部时钟发生器+内部PLL产生的高频时钟+内部分频器分频得到的各种
频率的时钟。
(2)我们S5PV210属于第三种,为什么要这么设计?
第一问?为什么不使用外部高频的晶振产生高频信号直接给CPU?
主要是因为我们芯片外部电路不适于使用高频率,因为传导辐射比较难控制。
而且高频率的晶振非常贵。
第二问?为什么要内部先进行倍频,然后再分频,而不是先分频,然后再倍频?
因为我们SOC内部有很多部件都需要时钟,而且各自需要的时钟频率是不同的。
没有办法统一供应,因此设计思路:
先得到一个最高的频率,然后各个外设再根据自己需要的频率,通过分频器来进行分频。
因为倍频器比较难设计,分频器比较容易设计,所以使用这种方式。
3、时钟和系统性能的关系?
(1)一般SOC时钟频率都是可以人为控制编程,频率的高低对系统的性能有很大的影响。
(2)S5PV210建议工作频率在800MHZ~1000MHZ,一般我们设计主频为1GHZ。
如果你设计为1.2GHZ就叫做超频。
系统的性能会提升,但是发热也会增大,因此会影响系统的稳定性。
4、时钟和外设编程的关系?
每一个外设工作都需要一定频率的时钟,这些时钟都是由时钟系统提供的。
时钟系统可以通过编程来控制,因此我们程序员可以为每一个外设指定时钟的来源。
时钟分频来源,从而指定这个外设的工作时钟。
5、时钟和功耗控制的关系?
(1)SOC中各种设备工作时,时钟频率越高其功耗越大,发热越大。
越容易不稳定,需要外部的散热条件更加的苛刻。
(2)SOC内部有很多外设,这些外设不用的使用最好关掉(为什么需要关掉,因为会一定的浪费电)
也就是说我们给某个外设断掉时钟,他就不工作了。
6、S5PV210的时钟域的概念:
CLOCK DOMAIN
210的时钟的体系是非常复杂的:
1、时钟域:MSYS、DSYS、PSYS
(1)因为S5PV210的时钟体系比较复杂,内部外设模块太多,因此把整个内部的时钟
划分为3大块:
MSYS:
CPU内核:DRAM_CONCTROL(DMC0、DMC1各自接了256MB),IRAM、IROM
DSYS:
FIMC:视频编解码:HDMI,都是跟音视频有关的模块。
都是提供了硬件的解码器。
PSYS:
内部外设的意思:和内部的各种外设时钟有关,
串口,SD接口,I2C,AC97是用来连接声卡的,这些外设一般都是比较低速的。
联系:
51单片机:因为CPU的主频和其余外设是差不多快的,12MHZ
STM32103:一般是72MHZ,但是有些外设是运行不到这么快的,所以需要对
主频进行分频才能使用。
S5PV210:更多的外设,所以需要进行三级分类,使得每一种外设的时钟都能正常的工作。
7、时钟来源:晶振+时钟发生器
(1)S5PV210有4个晶振接口,我们设计板子硬件时可以根据需要来确定
在哪里接晶振,接了晶振之后,上电相应的模块就会产生晶振和原始的时钟。
原始时钟再经过一系列的刷选开关进行PLL电路生成倍频后的高频时钟。
高频时钟再经过分频到达我们芯片内部各模块上。
模块内部还有进一步的分频器,进行再一次的分频器进行再一次的分频。
XRTCXTI可以直接进入RTC,SYSTEM Timer
USB工作的时钟只能从XUSBXTI这个端口进来。
如果是0还是1的话,我们就可以知道MUS开关。
提供了4个锁相环的工作模式:
APLL、MPLL、VPLL、EPLL
APLL = 30MHZ~1GHz
MPLL = 50MHZ~2GHz
EPLL = 10MHZ~60MHZ
在标准的S5PV210的标准中,
APLL:Cortex-A8内核 MSYS域的重要的时钟。
MPLL&EPLL:DSYS和PSYS
VPLL: Video视频相关的模块。
8、时钟域详解:
MSYS域:
ARMCLK:给CPU内核工作的时钟,也就是我们平常工作的主频:
MOUT_MSYS/n
HCLK_MSYS: MSYS域的高频时钟: DMC0、DMC1使用
PCLK_MSYS: MSYS域的低频时钟:
HCLK_MSYS: 给IROM和IRAM(合称IMEM)使用
PSYS域:
HCLK_PSYS:高频时钟
PCLK_PSYS:低频时钟
总结:
我们210内部各个外设都是接在(内部AMBA总线)总线上面的
AMBA总线有一条高频分支叫做AHB
有一条低频分支叫做APB:上面的各个域都有各自对应的HCLK_XXx
和PCLK_XXX,其中HCLK_XXX是XXX这个域中AHB总线的工作频率;
PCLK_XXX这个域中APB总线的工作频率。
SOC内部的各个外设其实是挂在总线上工作的,也就是说,这个外设的时钟来自于
它挂载的总线。譬如我们这个串口UART挂在我们PSYS域下的APB总线上。
因此串口的时钟来源是PCLK_PSYS。
我们可以分析记住和分析上面的时钟域和总线的数值,来确定我们各个外设的具体时钟的频率。
各种时钟的典型值(默认值,IROM中设置的值)
IROM内部设置的典型值:
当210刚上电时,默认是外部晶振+内部时钟发生器产生的24MHZ频率的时钟
直接给ARMCLK的,
这时候的主频就是24MHZ,运行非常慢。
IROM代码执行时,第6步中初始化了时钟系统,这时候给
系统一个默认推荐的运行频率,这个时钟频率是三星推荐的值。
210工作性能稳定性和稳定性最佳的频率。
UBOOT里面也是重新设置了一遍:
(3)各时钟的典型值:
我们自己设置时钟就是按照这个时钟来设置。
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