昨天把时钟系统给学习完了,因为有51和32的基础,学起来不是很难,一天解决了整个路线,今天写篇文章回顾下,主要先讲讲时钟的一些基本概念、时钟框图(时钟树)和相关寄存器的分析,其实S5PV210这个SoC的时钟系统已经比较复杂了,如果结合之前学习过的STM32一起看的话,这块很多概念会迎刃而解,有机会去整理下32里面的东西,写篇文章,好了,开始进入主题。
定义:时钟是同步工作系统的同步节拍,也可以说是同步工作系统工作的共同信号。
获得:第一种是通过外部直接输入时钟信号,适用于多个器件SoC需要同步工作的时候;第二种是外部晶振+内部时钟发生器产生时钟信号,适用于传统的时钟频率不是很高的单片机中,比如传统51、增强型51和一些8位的单片机中很多使用的都是这种;第三种是外部晶振+内部分频器+内部PLL倍频电路产生高高频时钟+内部分频器得到模块各自频率的时钟,适用于现在很多的嵌入式设备中,S5PV210就是属于这种。
分析:其实现在第一种方式已经很少遇到了,主要是因为芯片外部电路不适宜使用高频率,因为传导辐射难控制,并且高频的晶振实在是太贵了。我们的嵌入式SoC之所以使用第三种是因为工作的频率很好,不想普通的单片机,时钟频率实在是太低了,而且内部很多模块需要的时钟频率其实是不同的,无法做到统一供应,因此设计的时候是先PLL后得到一个最高的频率(标准1GHz),然后再使用分频器分出不同外设需要的时钟频率。
使用:软件开发的人可通过操作相应的寄存器,来实现对时钟系统输出时钟的控制。
这个概念其实在STM32里面是没有的,因为STM32的时钟系统还是比较简单的。时钟域其实就是把整个内部的时钟划分为几大块,主要划分的依据是使用时钟频率的高低归为一类。
S5PV210的时钟体系中有三个域:MSYS、DSYS和PSYS(主系统、显示系统和外设系统时钟),S5PV210外部有4个晶振接口,设计板子硬件的时候,可以根据需要来决定在哪里接晶振。
倍频PLL有四块:APLL、MPLL、EPLL和VPLL,可以通过寄存器设置参数,来实现不同的倍频效果。
MSYS域:ARMCLK(主频)、HCLK_MSYS(高频)、PCLK_MSYS(低频)、HCLK_IMEM(给iROM和iRAM)
DSYS域:HCLK_DSYS(高频)、PCLK_DSYS(低频)
PSYS域:HCLK_PSYS(高频)、PCLK_PSYS(低频)、SCLK_ONENAND
(1) S5PV210内部各个外设都是接在(内部AMBA总线)总线上面的,AMBA总线有1条高频分支叫AHB,有一条低频分支叫APB。上面的各个域都有各自对应的HCLK_XXX和PCLK_XXX。(ARM的CPU中很常见)
(2) SoC内部的各个外设其实是挂在总线上工作的,也即这个外设的时钟来自于它挂接的总线。譬如串口UART挂在PSYS域下的APB总线上,因此串口的时钟来源是PCLK_PSYS。
(3) iROM固有的BL0在启动的时候会自动执行,这个执行代码中包括了对时钟系统的初始化(第6步中),这个初始化的时钟频率是三星官方特别推荐的,他们原厂的工程师很明白PLL内部的工作原理,通过理论计算,之后结合实际测试,给出的比较合适的设置数据,大致的数据(各时钟的典型值)如下:
• freq(ARMCLK) = 1000 MHz(1G)(CPU频率,主频)
• freq(HCLK_MSYS) = 200 MHz(DMC0和DMC1设置的频率,高频)
(之前算内存的时候就是用这个200MHz来计算的)
• freq(HCLK_IMEM) = 100 MHz(给iROM和iRAM使用)
• freq(PCLK_MSYS) = 100 MHz(MSYS域的低频时钟)
• freq(HCLK_DSYS) = 166 MHz
• freq(PCLK_DSYS) = 83 MHz
• freq(HCLK_PSYS) = 133 MHz
• freq(PCLK_PSYS) = 66 MHz(串口那些是接在这里的)
• freq(SCLK_ONENAND) = 133 MHz, 166 MHz
位置:数据手册P361&P362,Figure3-3
第一张图从左到右依次完成了原始时钟生成->PLL倍频得到高频时钟->初次分频得到各总线时钟;第二张图是从各中间时钟(第一张图中某个步骤生成的时钟)到各外设自己使用的时钟(实际就是个别外设自己再额外分频的设置)。
先学:
01 MUX开关就是个或门,实际对应某个寄存器的某几个bit位的设置,设置值决定了哪条通道通的,分析这个可以知道右边的时钟是从左边哪条路过来的,从而知道右边时钟是多少。
02 DIV分频器,是一个硬件设备,可以对左边的频率进行n分频,分频后的低频时钟输出到右边。分频器在编程时实际对应某个寄存器中的某几个bit位,我们可以通过设置这个寄存器的这些对应bit位来设置分频器的分频系数(譬如左边进来的时钟是80MHz,分频系统设置为8,则分频器右边输出的时钟频率为10MHz)。
03 寄存器中的clock source x就是在设置MUX开关;clock divider control寄存器就是在设置分频器分频系数。
PLL是通过循环完成的,时钟从24MHz变成1GHMz是需要时间的,这段时间就是锁相环PLL的锁定周期,这个周期可以通过这个寄存器来进行设置,一般设置成默认值就行。
PLL_CON寄存器主要用来打开/关闭PLL电路(使用第31位ENABLE),设置PLL的倍频参数,查看PLL锁定状态等。
之所以有0和1是因为,有些寄存器位数不够,需要两个才能达到设置某种功能的作用,有些使用1个就行,这些就没有0和1。
到时候设置的时候,要结合时钟框图一起看,才知道需要设置什么。
CLK_SRC_MASK决定MUX开关n选1后是否能继续通过。默认的时钟都是打开的,好处是不会因为某个模块的时钟关闭而导致莫名其妙的问题,坏处是功耗控制不精细、功耗高。
初始化的值都是1,也就是默认都是打开的,防止某个模块不工作的时候,没有考虑到是这个寄存器的没有打开的原因。我们学习逻辑的时候不用关掉,防止代码都正确却无法工作这种情况。(这个是一开始的开关)
类似于CLK_SRC_MASK(这个是在后面的开关)。
这两类状态位寄存器,用来查看DIV和MUX的状态是否已经完成还是在进行中。其实就是通过状态告诉我们MUX、DIV的工作情况。
其中最重要的寄存器有3类:CON、SRC、DIV。其中CON决定PLL倍频到多少,SRC决定走哪一路,DIV决定分频多少。