作者:Andrew Huang
bluedrum@163.com
驱动数字电路运转是的时钟信号,时序电路都需要一个外部时钟信号来驱动,完成计时,同步,计数,时序控制等各种功能。象CPU也是用时序信号驱动来完成各种运算的,而且象ARM带的模块绝大部分与时序都有关,因此理解时钟信号对于底层编程非常重要。
一.时钟信号的源头---------晶振
----------------------------------------------------------------------------
数字电路的时钟信号的来源是哪里呢?主流的设计方案是使用晶振这种外部器件来产生稳定的电流波形。这是性效比最高一个方案,晶振是一块水晶加一些电路的小器材,但是它只需要输入很小的电流就是持续稳定出时钟波形。
这是因为水晶有一个奇特的特性,如果给他通电,他就会产生机械振荡,反之,如果给他机械力,他又会产生电,这种特性叫机电效,。这称为压电效应。
更奇妙的是如在极板间所加的是交变电压,就会产生机械变形振动,同时机械变形振动又会产生交变电场。一般来说,这种机械振动的振幅是比较小的,其振动频率则是很稳定的。但当外加交变电压的频率与晶片的固有频率(决定于晶片的尺寸)相等时,机械振动的幅度将急剧增加,这种现象称为压电谐振,因此石英晶体又称为石英晶体谐振器。 其特点是频率稳定度很高。石英表就是使用这个原理制而成.
晶片会产一个稳定的波形,只要持续的供电,这种电能->机械能->电能转换会让波形不断生成. 在要求得到高稳定频率的电路中,必须使用石英晶体振荡电路。石英晶体具有高品质因数,振荡电路采用了恒温、 稳压等方式以后,振荡频率稳定度可以达到 10^(-9)至 10^(-11)。广泛应用在通讯、时钟、手表、计算机……需要高稳定信号的场合 .
数字电路中重要器件晶振就是使用这一原理制作而成. 晶振是石英晶体谐振器和石英体时钟振荡器的统称。不过由于在消费类电子产品中,谐振器用的更多,所以一般的概念把晶振就等同于谐振器理解了。后者就是通常所指钟振。
它是一种机电器件,是用电损耗很小的石英晶体经精密切割磨削并镀上电极焊上引线做成。
晶振在数字电路的作用就是供一个基准时间.数字电路都是按时序的进行工作的, 在某个时刻专门完成特定的任务,因此几乎每个电路都有会接收外部时钟信号的管脚.如果这个时钟信号发生混乱.整个电路就工作不正常了. 在一个整体设备里,如开发板,或 PC 主板.所有电路通常共享一个晶振. 便于各部分保持同步。有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法保持同步。
二.系统主频--------内部时钟频率
--------------------------------------------------------------
一般晶振称为外部时钟频率,它需要把信号引入数字电路给CPU和其它模块使用,局限于材料的物理特性一般的晶振的频率并不是太高,如S3C2440/S3C6410上的晶振的频率一般是12MHz/20MHz,而对的应的CPU的需要使用时钟信号高达400MHz/600MHz,或者更高.这个时候,需要把较低外部时钟信号增加频率到CPU可以接受的频率。这称为倍频. S3C6410 的主频 最高可到667Mhz.
锁相环电路
倍频的功能是由一种特殊电路---锁相环电路来完成的。 锁相环电路(Phase-Locked Loop,缩写 PLL) , PLL基本上是一个闭环的反馈控制系统,它可以使 PLL 的输出可以与一个参考信号保持固定的相位关系。PLL 在电路的作用之一是起到倍频的作用.即可以输出系统时钟的固定倍数频率.
因为在ARM CPU启动后,最开始必须做的事情是配置倍频的比率。这样当输入外部时钟频率一定的情况下,按照倍频的比例,就可以得到CPU的频率,用不同频率运行,这在嵌入式CPU的,一个系统出于不同目的可能会以不同频率运行,低频运算速度慢但是省电,高频速度快但能耗大。
但是CPU本身是有一个设计最高频率的,如果强行配置成高于设计频率的速度运行,就是人们称的超频。有可能带加速CPU老化,运行时散热增加的问题。
一般为了保险,软件开发都都会配成产商给几种标准频率。
三.设备频率
----------------------------------------
在SOC的CPU上,除了CPU内核以外,在一个物理芯片上,还有一些其它模块,以S3C6410为例,它带了I2C,UART,USB HOST等多个模块,这一些模块通过AHB总线与CPU内核相连.这一些模块同样需要时钟信号来驱动。
但是ARM的主频信号相对这一些模块来说,频率显得过高。这个时候象S3C2440中内核会提供两种较低频率的时钟信号。 HCLK和PCLK两种时钟信号给设备使用。
divider 分频器
但是对一些低频模块,PCLK的频率仍然显得过高,这时需要模块自己使用分频器(divider)来把频率进一步降低。降到多少值一般取决于软件的需求,因此各个模块的分频参数一般都是可以调整的。因此初始化相关模块时,软件做一件重要事件就是设置分频参数。
Prescaler 预分频因子
在有一些模块,如果需要编程来设定分频的比率,通常是用Prescaler即预分频因子这个参数来设定分频后的值,假设输入频率是Fin,分频后输出的频率是Fout,而三者有如下关系
Fout = Fin /(Prescaler + 1 )
在某一些模块里,分频后的频率仍然是太高,可能需要再次分频,这时分频的参数一般称为divider value.这样公式变成
Fout = Fin /(Prescaler + 1 )/divider