首页 > 编程知识 正文

偶数分频时钟是异步时钟吗,时钟分频器的作用

时间:2023-05-05 05:03:39 阅读:153034 作者:2359

如果33558www.Sina.com/CPU是计算机的大脑,电流是计算机的血液,那么时钟就是计算机的心脏,时钟频率决定着处理器运算的速度,它的每一次“跳动”都使处理器不断不同的是,人的各个部位的心率相同,但计算机有多个频率,每个部位可能有不同的频率。 例如,“大脑”有一个频率,“手”有一个频率,“脚”有另一个频率。 这样,就产生了两个问题。 如何产生这些不同的频率呢? 处理器如何与不同频率的外围设备交互?

如何产生这些不同的频率?

为了获得稳定的时钟,通常使用由石英和振荡电路构成的石英振子供给,石英可以提供稳定的频率。 一般来说,计算机系统至少需要一个晶体振荡器,某些特殊外围设备也有自己的晶体振荡器,如网卡、显卡等,但如果大多数连接到cup的外围设备没有自己的晶体振荡器,则需要cpu提供时钟cpu如何为这些外围设备提供不同的时钟?

ARM处理器主要为外围设备提供两种类型的连接总线:高级高性能总线和APB总线。 这两种总线的时钟在未初始化前相同,频率等于外部晶振提供的频率,初始化后它们可以为外设提供不同的时钟。

AHP和APB总线的内容将在后面的章节中作为补充知识来理解。 因为他们和我们分析uboot的启动过程没什么关系。 这2种总线初始化后,由于时钟不同,所以所连接的外围设备也不同。 如下图所示,部分工作频率高的外围设备连接到存储器、nandflash、LCD控制器等的AHB总线,工作频率低的外围设备连接到UART串行、Watchdog、GPIO、USB等的APB总线()

在这里,这些外围设备是如何连接到总线的无关紧要,但首先要知道一件事。 连接到同一总线的外围设备的时钟相同。 如果AHB和APB表都不能满足外围设备的需要,PWM TImer需要帮助。

上图为s3c2440的时钟生成图,看起来很复杂,但其实并非如此。 您只需知道图的红框部分即可启动uboot,但在创建UBS驱动或照相机驱动时,会涉及图的灰绿色部分。 我们只分析uboot启动过程中涉及的内容,所以不详细说明USB和cam的部分。

图中的红色框表示主时钟的生成过程,灰色的绿色框表示USB时钟的生成过程,红色线表示输出HCLK,绿色线表示PCLK,黄色线表示FCLK。

引导时,需要设置时钟分频。 分频的目的是生成PCLK、FCLK、HCLK三种时钟。 PCLK用于APB总线,HCLK用于AHB总线,FCLK用于cpu。 另外,可以从datasheet的电气参数一章中调查FCLK、HCLK、PCLK的最大值。按照图中的步骤来分析一下这三种钟表是如何制作的。 下图是上图的简要概要:

1 .时钟源

为了减少外部环境对开发板的电磁干扰,降低制作成本,开发板的外部晶振时钟频率通常较低。 从图中的第一个红框可以看出,cpu可以连接两种外部时钟源。 一个是振荡时钟源,另一个是时钟信号。 前者为晶体振荡电路,后者为其他振荡器产生的时钟信号。 例如,由信号发生器生成的时钟信号两者都是特定频率的正弦波形,但是cpu的布线方式不同。

从此表中可以看出,s3c2440可以连接两个时钟源。 一个是主时钟源,另一个是USB时钟源。 如果主时钟源需要连接晶振源,则OM3需要为0,即接地。 同样,如果需要将晶振源连接到ubs时钟源,OM2将接地。 从电路图中可以看出,OM2和OM3均接地,另外XTIpll引脚和XTOpll引脚连接有外部12M晶体振动,因此这里开发板的时钟源为12M的外部晶体振动。 (USB的时钟源在此不讨论)

应该注意的是,从晶体振荡器提供的时钟仅仅在开启电源之后振荡,因为从外部提供的信号时钟已经在没有开启时钟的时候振荡,所以对于晶体振荡器的时钟源需要特殊的预处理——频率转换锁定。

2 .变频器锁定

接通电源后不久,晶体振子OSC开始提供晶体振子时钟。 系统电源刚接通,电压信号等还不稳定。 此时,如果复位信号(nRESET )降低,则外部晶体振子直接成为系统时钟FCLK。 这时的FCLK是不规则的,为了使cpu使用规则的时钟频率,需要使用clock disable一段时间。 该时间为图中的Lock Time,在该时间中电压逐渐稳定,时钟频率也调整为新的稳定状态(vcoisadaptedtonewclockfrequency ) ),而且在该时间中,FCLK为0,即ccoisadaptedtonewclockfrequency 在这个Lock Time结束后,请注意这个Lock Time此时的FCLK频率是晶体振子提供的频率。 他们的大小相同,经过倍增后,这个值会变化数倍。

>  下面是变频锁定时间的设定寄存器:0~15位是设置主时钟源锁定时间的,后15位是设置USB锁频时间的,这里不考虑,值得注意的是对应的锁频时间可以从datasheet的电气数据表中查到(PLL Lock Time)。

  

  3.倍频设置(锁相环)

  当cpu能够获取到稳定的时钟时,就需要对时钟进行倍频了,现在知道外部晶振输入的时钟时12M,那怎样把这个时钟提高到100MHz,甚至是400MHz呢?这就涉及到了时钟生成图的第二个红框框了(注意框框上面的S,P,M字样),这个叫锁相环(PLL),主频的倍频操作是由MPLL来设置的,而USB的倍频操作是由UPLL来设置的,UPLL暂时不讨论。所以要让外部时钟经过变化,扩大到400M,就需要对MPLLCON寄存器进行设置。

  

  从上图可以看出,不管是MLLCON或者UPLLCON,都由三个部分组成,主分频、预分频、后分频控制位,这些分频数值决定了12M进去的频率,将会输出多大频率,下面这张表是手册的推荐设置:比如我们要将12M是时钟频率倍频成405M,则需要MDIV=0x7f,PDIV=0x2,SDIV=1,注意49M和96M是给USB的UPPLCON设置的。

  

  当然也可以不参考这个表格,使用计算公式

  

  4.设置比例(分频器)

  设置完PLL寄存器以后,当稳定的时钟通过锁相环则会输出更大倍数的频率,而这个更大倍数的频率则是FCLK,现在这个值则是400MHz,而不是12MHz了,现在我们得到了想要的FCLK,那怎么得到PCLK和HCLK呢?下面就涉及到分频器的设置。

  

  怎么设置HDIVN和PCIVN的数值,主要查找下面的表:

  

  比如我们要将HCLK设置为100,PCLK设置为50, 那么HCLK=FCLK/4,PCLK=FCLK/8,查表可知为1:4:8,所以HDIVN=0x2,PDIVN=0x1, dvin_UPLL是UBS的时钟,这里不讨论。

  但是根据datasheet说明,当HDIV设置为非0的时候,cpu总线模式要进行改变,默认情况下FCLK=HCLK,cpu工作在fast bus mode快速总线模式下,HDIV设置为非0后,FCLK和HCLK不再相等,要将cpu改为异步总线模式,需要使用对应的代码进行设置。

  

  所以上面三步的代码可总结如下:

  [plain] view plain copy#define S3C2410_MPLL_200MHZ ((0x5c《《12)|(0x04《《4)|(0x00))

  #define S3C2440_MPLL_200MHZ ((0x5c《《12)|(0x01《《4)|(0x02))

  /*

  * 对于MPLLCON寄存器,[19:12]为MDIV,[9:4]为PDIV,[1:0]为SDIV

  * 有如下计算公式:

  * S3C2410: MPLL(FCLK) = (m * Fin)/(p * 2^s)

  * S3C2410: MPLL(FCLK) = (2 * m * Fin)/(p * 2^s)

  * 其中: m = MDIV + 8, p = PDIV + 2, s = SDIV

  * 对于本开发板,Fin = 12MHz

  * 设置CLKDIVN,令分频比为:FCLK:HCLK:PCLK=1:2:4,

  * FCLK=200MHz,HCLK=100MHz,PCLK=50MHz

  */

  void clock_init(void)

  {

  // LOCKTIME = 0x00ffffff; // 使用默认值即可

  CLKDIVN = 0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1

  /* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */

  __asm__(

  “mrc p15, 0, r1, c1, c0, 0n” /* 读出控制寄存器 */

  “orr r1, r1, #0xc0000000n” /* 设置为“asynchronous bus mode” */

  “mcr p15, 0, r1, c1, c0, 0n” /* 写入控制寄存器 */

  );

  /* 判断是S3C2410还是S3C2440 */

  if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002))

  {

  MPLLCON = S3C2410_MPLL_200MHZ; /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */

  }

  else

  {

  MPLLCON = S3C2440_MPLL_200MHZ; /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */

  }

  }

  对于USB和CAM的时钟设置都是相似的,这里就不累述了

  补充:

  前面介绍了锁相环寄存器的设置,这里对锁相环的工作原理作一个简述。一个12MHz的时钟经过锁相环以后,产生了400MHz的FCLK时钟,它是怎么办到的呢?

  锁相环的作用比较多,不仅可以倍频,还可以合成频率,音频解码等,实现原理有所不同,下图是S3c2440的锁相环实现原理图:

  

  (1)当外部时钟Fin进入锁相环的时候,预分频器(Divider P)会将该时钟进行处理得到Fref信号,这个信号是reference参考信号,用于后面分频的相位参考。

  (2)Fref将第一次进入PFD(Phase Frequency Detector)相位鉴定器,它主要完成Fref和Fvco的相位鉴定,当输出和输入信号的频率和相位保持恒定不变的时候,锁相环进入相位锁定的状态,当输出和输入信号的频率和相位有差异的时候,则会发送信号给PUMP。

  (3)PUMP会将PFD的控制信号转换成合适电压信号给循环滤波器

  (4)滤波器会对从PUMP过来的波形进行过滤,然后将信号送给VCO

  (5)VCO(Voltage Controlled Oscillator),压控振荡器,这里是倍频的关键步骤,压控振荡器的振荡频率会随时间而变,锁相环进入“频率牵引”,自动跟踪捕捉输入信号的频率,然后将输出进行主分频(Divider M),产生Fvco.

  (6)Fvco会进入PFD与Fref进行相位和频率的差异对比,如果处在差异,则继续进入循环,如果没有差异,则PFD停止向PUMP发送信号,锁相环进入相位锁定的状态。

  (7)当锁相环进入相位锁定的状态,VCO的输出将通过后分频器(Divider S)输出MPLL或者UPLL。

  所以要使用锁相环,就需要设置XPLLCON的P,M,S;关于锁相环的更具体的原理,请GOOGLE。

  至于分频器的工作原理比较简单,主要是改变波形的占空比达到将高频变低频的效果,所以需要设置HDIVN和PDIVN。

  总结:这篇文章分析了怎么设置时钟分频,让cpu以及外部设备工作在更高的频率上面,主要涉及三个寄存器的设置——LOCKTIMRE,MPLLCON,CLOCKDIVN

  再回忆一下开发板启动的过程,当开发板上电的时候,启动过程是:进入管理模式——关看门狗——关中断——时钟分频。。.

  在设置时钟分频以前,cpu都是工作在12Mhz频率的,当设置完时钟分频后,cpu的工作频率将是400MHZ,这相当于完成了一个蜕变,从一个kxdh变成了超人,多了几十倍的反应速度,更加高效的执行后面的代码。想想如果没有对时钟进行倍频处理,仍然让它运行在12MHz,处理同一件任务多要30多倍的时间,将是一件多么折磨人的事情。

  接下来将会继续对时钟这个问题进行分析,虽然这里分析了怎么设置时钟分频,但是这只是开始,后面将对省电模式,快启动,慢启动,实时时钟,pwm时钟等内容进行讲解。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。