一、对clock的根本知道
第七部分是“clock & power management”,总结如下:
1 s3c2410的clock & power management模块包括三个部分:clock control、usb control、power control。现在的关注点是clock control。
2、s3c2410有两个pll(phase locked loop,锁相环,在高频中学过,能够完成倍频,s3c2410的高频便是由此电路发生的)。其间一个是MPLL,M即为main,用来发生三种时钟信号:Fclk(给CPU核供应时钟信号,咱们所说的s3c2410的cpu主频为200MHz,便是指的这个时钟信号,相应的,1/Fclk即为cpu时钟周期)、Hclk(为AHB bus peripherals供应时钟信号,AHB为advanced high-performance bus)、Pclk(为APB bus peripherals供应时钟信号,APB为advanced peripherals bus)。在这儿,需求了解一下AMBA system architecture了。这个能够到官方网站www.arm.com下载相关材料。简略的说,AMBA是一种协议,这种协议现已称为片上安排通讯的事实上的标准(the de facto standard for on-chip fabric communication)。下面给出英文描绘:
The AMBA protocol is an open standard, on-chip bus specification that details a stategy for the interconnection and management of functional blocks that makes up a system-on-chip(SoC).It facilitates “right-first-time” development of embedded processors with on
需求知道的是,AMBA总线是ARM提出的一种解决方案,它并非仅有的标准,可是由于ARM的广泛运用,AMBA总线也就成为了事实上的标准了。现在 AMBA总线最新为AMBA 3 specification版别,包括AMBA 3 AXI Interface、AMBA 3 AHB Interface、AMBA 3 APB Interface、AMBA 3 ATB Interface。而s3c2410还只能支撑AMBA 2 specification,这个版别包括AMBA 2 AHB Interface、AMBA 2 APB Interface。也便是在s3c2410的框图中看到的两种总线接口。需求留意的是,这两种总线所连的外设是有差异的。AHB总线衔接高速外设,低速外设则经过APB总线互连。明显,对不同总线上的外设,应该运用不同的时钟信号,AHB总线对应Hclk,APB总线对应Pclk。那么事前就应该弄清楚,每条总线对应的外设有那些,这样在设置好时钟信号后,对应外设的初始化的值就要依此而确认了。
AHB bus上的外设有LCD controller(CONT代表controller,控制器)、USB Host CONT、ExtMaster、Nand CONT和nand flash boot loader、bus CONT、interrupt CONT、power management、memory CONT(sram/nor/sdram等)。
APB bus上的外设有UART、USB device、SDI/MMC、Watch Dog Timer、bus CONT、spi、iic、iis、gpio、rtc、adc、timer/pwm。
3、主时钟源来自外部晶振或许外部时钟。复位后,MPLL尽管默许发动,可是假如不向MPLLCON中写入value,那么外部晶振直接作为体系时钟。 EDUKIT-III的外部晶振有两个,一是用于体系时钟,为12MHz;一个用于RTC,为32.768KHz。曾经试验没有向MPLLCON写入数值,所以体系时钟都是12MHz。从这儿也能够发现一个问题,假如外部晶振开端没有焊上,那么体系是无法正常发动的。由于依照上述规矩,复位后还没有写入 MPLLCON,这时又没有能够运用的时钟源,所以不会发动。也便是硬件完成后,这个12MHz的晶振是必定要焊上的,才干进行后续的硬件测验作业。
二、clock设置的进程
首要应该读懂下一段:
Power-On Reset (XTIpll) Figure 7-4 shows the clock beha The PLL restarts the lockup sequence toward the new frequency on |
这个首要是依据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))【m=MDIV+8, p=PDIV+2,s=SDIV】
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会发生三个部分的时钟频率:FCLK、HCLK、PLCK。FCLK用于CPU核,HCLK用于AHB总线的设备(比方SDRAM),PCLK用于APB总线的设备(比方UART)。从时钟结构图中能够检查到运用不同时钟频率的硬件。
Figure 7-1. Clock Generator Block Diagram
(注:这儿要留意从图中看出,Uart运用的是PCLK,后边Uart试验会用到)
下面介绍MPLL的发动流程:
(注:下面内容部分直接摘录自《s3c2410彻底开发流程》,Clock部分写了非常好)
S3c2410 datasheet 224页“Figure 7-4. Power-On Reset Sequence”展现了上电后MPLL发动的进程
请跟从FCLK的图画了解发动进程:
1、上电几毫秒后,晶振输出安稳,FCLK=晶振频率,nRESET信号康复高电平后,
CPU开端履行指令。
2、咱们能够在程序最初发动MPLL,在设置MPLL的几个寄存器后,需求等候一段时刻(Lock Time),MPLL的输出才安稳。在这段时刻(Lock Time)内,FCLK停振,CPU停止作业。Lock Time的长短由寄存器LOCKTIME设定。
3、Lock Time之后,MPLL输出正常,CPU作业在新的FCLK下。
设置S3c2410的时钟频率便是设置MPLL的几个寄存器:
1、LOCKTIME:设为0x00ffffff
前面说过,MPLL发动后需求等候一段时刻(Lock Time),使得其输出安稳。位[23:12]用于UPLL,位[11:0]用于MPLL。运用确省值0x00ffffff即可。
2、CLKDIVN:用来设置FCLK:HCLK:PCLK的比例关系,默许为1:1:1
这儿值设为0x03,即FCLK:HCLK:PCLK=1:2:4
CLKDIVN不同的设置及对应的时钟比例关系如下图:
3、MPLLCON:设为(0x5c << 12)|(0x04 << 4)|(0x00),即0x5c0040
关于MPLLCON寄存器,[19:12]为MDIV,[9:4]为PDIV,[1:0]为SDIV。有如下核算公式:
MPLL(FCLK) = (m * Fin)/(p * 2^s)
其间: m = MDIV + 8, p = PDIV + 2
Fin 即默许输入的时钟频率12MHz。MPLLCON设为0x5c0040,能够核算出FCLK=200MHz,再由CLKDIVN的设置可知:HCLK=100MHz,PCLK=50MHz。
一般咱们将如上时钟初始化的进程写成clock_init函数供其他函数调用,代码如下:
void clock_init(void)
{
/*init clock*/
rLOCKTIME = 0xFFFFFF;
/*设置FCLK:HCLK:PCLK=1:2:4,这样假定处理器主频为200M,则HCLK为50M,PCLK为25M。ARM920T内核运用FCLK, 内存控制器,LCD控制器等运用HCLK,看门狗、串口等运用PCLK*/
rCLKDIVN = 0x3;
/* 设置时钟频率为202.7M*/
rMPLLCON = 0x5c0040;
}