微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 关于arm时钟频率的设置及编程

关于arm时钟频率的设置及编程

时间:11-21 来源:互联网 点击:

这个主要是基于PLL的特点。简单的描述就是,上电复位后,几个ms后晶振起振。当OSC时钟信号稳定之后,nRESET电平拉高(这是硬件自动检测过程)。这个时候,PLL开始按照默认的PLL配置开始工作,但是特殊性就在于PLL在上电复位后开始是不稳定的,所以s3c2410设计为把Fin在上电复位后直接作为Fclk,这是MPLL是不起作用的。如果要想是MPLL起作用,那么方法就是写入MPLLCON寄存器值,然后等待LOCKTIME时间后,新的Fclk开始工作。下面把这些步骤分来来描述,软件步骤部分结合程序进行。

1、上电几个ms后,晶振输出稳定。Fclk=晶振频率。nRESET恢复高电平后,cpu开始执行指令,这完全是硬件动作,不需要软件设置。

2、第一步软件工作: 设置P M S divider control,也就是设置MPLLCON寄存器。

关于PMS,可以看Figure 7-2.寄存器MPLLCON的设置呢,其实有一定的规则,并非你想要的每个Fclk频率都可以得到。官方推荐了一个表PLL VALUE SELECTION TABLE,要按照这个进行。否则的话,就需要自己按照公式推算,但是mizi公司并不保证你的设置是合适的。所以,如果想要工作在200MHz,还是按照vivi的推荐值即可。

@ step1:set P M S divider control
movr1,#CLK_CTL_BASE
ldr r2,=vMPLLCON_200
strr2,[r1,#oMPLLCON]

其中,Mdiv=0x5c,Pdiv=0x04,Sdiv=0x00.公式Mpll(Fclk)=(m×Fin)/(p×(2^s))

3、第二步软件工作: 设置CLKdivN。

这一步是设置分频系数,即Fclk为cpu主频,Hclk由Fclk分频得到,Pclk由Hclk分频得到。假设Hclk是Fclk的二分频,Pclk是Hclk的二分频,那么分频系数比就是Fclk:Hclk:Pclk=1:2:4.那么Hclk为100MHz,总线时钟周期为10ns。Pclk为50MHz。

@ step2:change clock divider
movr1,#CLK_CTL_BASE
movr2,#vCLKdivN
strr2,[r1,#oCLKdivN]

4、第三步软件工作: CLKdivN的补充设置

IfHdivN=1,the CPU bus mode has to be changed from the fast bus mode to the asynchronous bus modeusingfollowing instructions.
MMU_SetAsyncBusMode
mrc p15,0,r0,c1,c0,0
orr r0,r0,#R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0
IfHdivN=1andthe CPU bus mode is the fast bus mode,the CPU will operate by the HCLK.Thisfeature can be used to change the CPU frequency as a half without affecting the HCLKandPCLK.

看了上段话,只需要翻译出来就可以了。

@ FCLK:HCLK=1:2
.macroMMU_SetAsyncBusMode
mrc p15,0,r0,c1,c0,0
orr r0,r0,#(R1_iA|R1_nF)
mcr p15,0,r0,c1,c0,0
.endm
@ step3:set asynchronous bus mode
MMU_SetAsyncBusMode

5、第四步软件工作:等待locktime时间,让新的Fclk生效

@ step4:stay locktime
movr1,#CLK_CTL_BASE
ldr r2,=vLOCKTIME
strr2,[r1,#oLOCKTIME]

6、对外设的影响

在这个实验中,主要是有两个需要改变,一个外设是UART,一个外设是SDRAM。

(1)UART,它是接在APB总线上,所以对应的时钟信号为Pclk,现在为50MHz。如果想要设置波特率为115200bps,那么根据公式UBRdiv0=(int)(PCLK/(bps*16))-1计算,应该为26。如果放到程序中,那么应该注意形式。具体如下:

UBRdiv0=((int)(PCLK/16./UART_BAUD_RATE)-1);

(2)SDRAM,主要的影响因素为刷新频率。前面在SDRAM中没有具体分析,现在可以详细说明。使用了两片HY57V561620CT-H,查看手册其刷新频率为8192 refresh cycles/64ms,所以刷新周期64ms/8192=7.8125us。看寄存器REFRESH的各个位的设置情况:

·REFEN[23]:开启自动模式,设为1

·TREFMD[22]:设为Auto refresh模式,设为0

·Trp[21:20]:看看RAS precharge Time,查看SDRAM手册,发现-H系列此参数至少为20ns,现在Hclk对应的时钟周期为10ns,所以至少应该为2个clock。可以设为00

·Tsrc: Semi Row Cycle Time,也就是RAS Cycle Time,至少65ms,所以至少得6.5clock,按照可选值,应该设置为11

·Refresh[10:0]:

公式refresh period = (2^11 - refresh_count +1)/Hclk,由此推导出refresh_count=2^11+1-refresh period*Hclk。带入数值,计算得出1268=0x04f4,这个数值要用四舍五入,减少误差。

·其余的保留值,均设置为0

由此得出该寄存器的值应该为0x008c04f4。


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top