关于S3C2410时钟
这个主要是基于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 mov r1, #CLK_CTL_BASE ldr r2, =vMPLLCON_200 str r2, [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 mov r1, #CLK_CTL_BASE mov r2, #vCLKdivN str r2, [r1, #oCLKdivN] |
4、第三步软件工作: CLKdivN的补充设置
If HdivN = 1, the CPU bus mode has to be changed from the fast bus mode to the asynchronous bus mode using following 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 If HdivN=1 and the CPU bus mode is the fast bus mode, the CPU will operate by the HCLK. This feature can be used to change the CPU frequency as a half without affecting the HCLK and PCLK. |
看了上段话,只需要翻译出来就可以了。
@ FCLK:HCLK=1:2 .macro MMU_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 mov r1, #CLK_CTL_BASE ldr r2, =vLOCKTIME str r2, [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。
S3C2410 CPU默认的工作主频为12MHz,使用PLL电路可以产生更高的主频供CPU及外围器件使用。S3C2410有两个PLL:MPLL和UPLL,UPLL专用与USB设备。MPLL用于CPU及其他外围器件。
通过MPLL会产
S3C2410时 相关文章:
- s3c2410 的时钟设置(11-23)
- S3C2410时钟&电源管理单元(11-11)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
