1、ARM软件访问硬件的核心理论ARM软件访问硬件的核心理论-时钟信号 驱动数字电路运转是的时钟信号,时序电路都需要一个外部时钟信号来驱动,完成计时,同步,计数,时序控制等各种功能。象CPU也是用时序信号驱动来完成各种运算的,而且象ARM带的模块绝大部分与时序都有关,因此理解时钟信号对于底层编程非常重要。一.时钟信号的源头-晶振 数字电路的时钟信号的来源是哪里呢?主流的设计方案是使用晶振这种外部器件来产生稳定的电流波形。这是性效比最高一个方案,晶振是一块水晶加一些电路的小器材,但是它只需要输入很小的电流就是持续稳定出时钟波形。 这是因为水晶有一个奇特的特性,如果给他通电,他就会产生机械振荡,反之,
2、如果给他机械力,他又会产生电,这种特性叫机电效,。这称为压电效应。 更奇妙的是如在极板间所加的是交变电压,就会产生机械变形振动,同时机械变形振动又会产生交变电场。一般来说,这种机械振动的振幅是比较小的,其振动频率则是很稳定的。但当外加交变电压的频率与晶片的固有频率(决定于晶片的尺寸)相等时,机械振动的幅度将急剧增加,这种现象称为压电谐振,因此石英晶体又称为石英晶体谐振器。 其特点是频率稳定度很高。石英表就是使用这个原理制而成. 晶片会产一个稳定的波形,只要持续的供电,这种电能-机械能-电能转换会让波形不断生成. 在要求得到高稳定频率的电路中,必须使用石英晶体振荡电路。石英晶体具有高品质因数,振
3、荡电路采用了恒温、 稳压等方式以后,振荡频率稳定度可以达到 10(-9)至 10(-11)。广泛应用在通讯、时钟、手表、计算机需要高稳定信号的场合 . 数字电路中重要器件晶振就是使用这一原理制作而成.晶振是石英晶体谐振器和石英体时钟振荡器的统称。不过由于在消费类电子产品中,谐振器用的更多,所以一般的概念把晶振就等同于谐振器理解了。后者就是通常所指钟振。在电路图通常用如下图标表示它是一种机电器件,是用电损耗很小的石英晶体经精密切割磨削并镀上电极焊上引线做成。晶振在数字电路的作用就是供一个基准时间.数字电路都是按时序的进行工作的, 在某个时刻专门完成特定的任务,因此几乎每个电路都有会接收外部时钟信
4、号的管脚.如果这个时钟信号发生混乱.整个电路就工作不正常了.在一个整体设备里,如开发板,或 PC 主板.所有电路通常共享一个晶振.便于各部分保持同步。有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法保持同步。二.系统主频-内部时钟频率- 一般晶振称为外部时钟频率,它需要把信号引入数字电路给CPU和其它模块使用,局限于材料的物理特性,一般的晶振的频率并不是太高,如S3C2440/S3C6410上的晶振的频率一般是12MHz/20MHz,而对应的CPU的需要使用时钟信号高达400MHz/600MHz,或者更高.这个时候,需要把较低外部时钟信号增加频率到CPU可以接受的频率。这称为倍
5、频.S3C6410的主频最高可到667Mhz.锁相环电路 倍频的功能是由一种特殊电路-锁相环电路来完成的。 锁相环电路(Phase-Locked Loop,缩写 PLL) , PLL基本上是一个闭环的反馈控制系统,它使 PLL 的输出可以与一个参考信号保持固定的相位关系。PLL 在电路的作用之一是起到倍频的作用.即可以输出系统时钟的固定倍数频率. 因为在ARM CPU启动后,最开始必须做的事情是配置倍频的比率。这样当输入外部时钟频率一定的情况下,按照倍频的比例,就可以得到CPU的频率,用不同频率运行,这在嵌入式CPU的,一个系统出于不同目的可能会以不同频率运行,低频运算速度慢但是省电,高频速度
6、快但能耗大。 但是CPU本身是有一个设计最高频率的,如果强行配置成高于设计频率的速度运行,就是人们称的超频。有可能带加速CPU老化,运行时散热增加的问题。 一般为了保险,软件开发都都会配成产商给几种标准频率。三.设备频率 在SOC的CPU上,除了CPU内核以外,在一个物理芯片上,还有一些其它模块,以S3C6410为例,它带了I2C,UART,USB HOST等多个模块,这一些模块通过AHB总线与CPU内核相连.这一些模块同样需要时钟信号来驱动。 但是ARM的主频信号相对这一些模块来说,频率显得过高。这个时候象S3C2440中内核会提供两种较低频率的时钟信号。 HCLK和PCLK两种时钟信号给设
7、备使用。divider 分频器 但是对一些低频模块,PCLK的频率仍然显得过高,这时需要模块自己使用分频器(divider)来把频率进一步降低。降到多少值一般取决于软件的需求,因此各个模块的分频参数一般都是可以调整的。因此初始化相关模块时,软件做一件重要事件就是设置分频参数。Prescaler 预分频因子在有一些模块,如果需要编程来设定分频的比率,通常是用Prescaler即预分频因子这个参数来设定分频后的值,假设输入频率是Fin,分频后输出的频率是Fout,而三者有如下关系Fout = Fin /(Prescaler + 1 ) 在某一些模块里,分频后的频率仍然是太高,可能需要再次分频,这时
8、分频的参数一般称为divider value.这样公式变成Fout = Fin /(Prescaler + 1 )/divider以PWM的定时器的参数为例,它的设置就有如下几个值以供电系统为例来给这种系统时钟打一个比方 晶振就是发电站,它通过PLL倍频后变成高压电,给CPU传输使用,而模块又使用分频器把高压电降下来给自己使用。ARM软件访问硬件的核心理论-S3C6410 时钟分析S3C6410的ARM内核是 ARM1176JZF-S ,在1.1V下最高可以跑 533MHz,1.2V可以跑 667MHz。S3C6410用的是可以使用外部晶振(XXTIpll)和外部时钟(XECTCLK),两种方
9、式输入时钟信号。它是由跳线OM0决定,这一位为0时,选择XXTIpll,否则选择XEXTCLK。APLL/MPLL/EPLL S3C6410提供三种PLL,它们是APLL,MPLL和EPLL.他们提高不同倍数来给不同模块来使用.理论上可PLL可以倍频到1.6GHz.APLL即ARM PLL, MPLL即 Main PLL, EPLL即extra PLL,由上框图可以看出,APLL倍频后信号给ARM11内核,MPLL倍频信号给ARM周边 AXI,AHB,APB三个总线,中间各个设备常用的HCLK和PCLK时钟频率也是从这里分频出去的。其中AXI/AHB总线设备使用 HCLK频率,APB总线设备使
10、用PCLK频率。而EPLL主要是给需要特殊频率的设备UART/IIC/IIS等设备提供的HCLK/PCLK/HCLKX2/ ARM11内核最高可以达到667MHz主频,而其内部自带一个分频器(divider)- DIVRAM,最高可以做到16分频. 而ARM11内核与其它内部模块通过三个总线AXI/AHB/APB相连,AXI总线/AHB总线设备,运行速度最高可达到133MHz的.即HCLK频率 而APB总线的设备最高是66MHZ,即PCLK频率. S3C6410还会有一额外的 HCLKX2 两个DDR控制器,DDR0和DDR1的来单独使用,它最高可以到266MHz,单独这样处理会降低功耗。 如
11、果觉得HCLK频率过高,可以通过DIVHCLK 分频器通过一频降频,PCLK也能通过DIVPCLK来分频。 在上图还出现在DIVJPEG和DIVSEC,这里是因为硬件JPEG加速模块和安全模块这两个虽然是挂在AHB总线上,但不能运行在133MHZ频率之上,因此这两个模块需要两个特殊分频器(DIVCLKJPEG 和DIVCLKSECUR)来单独分频。这样有如下换算关系。注意后面的写法 0/668MHZ 这里不是分数表达,前面是预分频因子 !(即SFR)后面分频后的输出频率.它有 Fout = Fin / (SFR +1) 关系以最后一行为例,前面两列是倍频后时钟频率,这里当APLL倍频后达到66
12、7MHZ,MPLL倍频到266MHz后,后面各列经过各个分频器后输出时钟频率,而且这里变化是APLL的频率,而MPLL倍频后的时钟频率始终为266MHZ.DIVarm分频因子为0,即从APLL输入到CPU后仍然是 667MHZ因此在S3C6410软件中,我们可以把如下频率看成是常量DIVhclkx2 分频因子为0,这样从MPLL输入,得到HCLKX2的时钟频率为 266MHZ.DIVhclk 分频因子为1,这样从MPLL输入,得到HCLK的时钟频率为 133MHZ.DIVclkjpeg/DIVpclk/DIVclkjsecuse 分频因子均为3,这样从MPLL输入,得到 PCLK的时钟频率为
13、66MHZ,CLKJPEG/CLKSECUSE也是如此特殊时钟频率 有不少模块采用特殊的时钟频率,这一些模块往往采用EPLL作为输入时钟频率,如LCD的时钟频率如何判断IP模块所属总线?S3C6410比较简单,它有三个寄存器,HCLK_GATE, PCLK_GATE,SCLK_GATE用来判断各个模块需要使用哪一个时钟频率。只要看哪一个模块在哪一个GATE寄存器,即采用哪种频率使用PCLK的设备SCLK_GATE是指明一些模块采用特殊频率S3C6410 APLL /MPLL 锁相环倍数设定 在S3C6410系统中,锁相环的倍和输入频率,还有输出频率都不是随便设定,而且有要求,并能满足一定公式。APLL倍数一般输入晶振要求 12mHZ.基本是衡定不变的,以Fin表示。这样要求CPU在不同频率下运行,它的频率用Fout表示,必须要调整参数,其中需要满足如下公式下列公式中MDIV/PDIV/SDIV就是软件开发者要设置的值 为了简化开发,一般会有如下固定值给开发来设定其中APLL的设置由APLL_CON来设置,MPLL的设置由EPLL_CON来设置它们有如下格式 如想设置主频为667MHz ,则寄存器要设为 rAPLL_CON = (131) |(33 16) | ( 3 8) | (1 0);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1