存储器类型复习
RAM/ROM:RAM掉电丢失,ROM掉电不丢失;
RAM中又分两大类,DRAM/SRAM;
SRAM:Static RAM运行速度飞快,内存小,昂贵;
DRAM:Dynamic RAM 运行速度比ROM快,比SRAM慢,便宜(电脑内存);
FLASH:又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据(NVRAM的优势);
FLASH:又分为NOR Flash和NADN Flash两种
1.NOR Flash的读取和我们常见的SDRAM的读取是一样,用户可以直接运行装载在NOR FLASH里面的代码,这样可以减少SRAM的容量从而节约了成本。
2.NAND Flash没有采取内存的随机读取技术,它的读取是以一次读取一块的形式来进行的,通常是一次读取512个字节,采用这种技术的Flash比较廉价。用户不能直接运行NAND Flash上的代码,因此好多使用NAND Flash的开发板除了使用NAND Flah以外,还作上了一块小的NOR Flash来运行启动代码。
eMMC = NAND闪存+闪存控制芯片+标准接口封装。
Arm时钟体系(2440)
2440Max-----(Fclk:400MHZ\Hclk:136MHZ\Pclk:68MHZ)
由12Mhz晶振(OSC),通过锁相环(PLL)分别得到。
MPLL:Main PLL
UPLL:USB PLL
Fclk = 晶振->MPLL
Hclk(AHB总线) = 晶振->MPLL->HDIVN(分频)
Pclk(APB总线) = 晶振->MPLL->PDIVN(分频)
相关寄存器:MPLLCON,CLKDIVN
2440启动流程:
1.复位引脚等待电源稳定
2.Fclk起振 = 晶振频率
3.电源稳定,复位芯片输出高电平,锁存OM[3:2]引脚信号,同时CPU开始运行
4.设置PLL->CPU停止,PLL工作,Fclk停止(Lock Time)
5.LockTime结束后->Fclk = PLL新设的时钟,CPU运行
如何设置2440时钟频率
目标:FCLK运行于400M,HCLK = FCLK/4(100M),PCLK=FCLK/8(50M)。
查阅2440芯片手册;
CLOCK DIVIDER CONTROL (CLKDIVN) REGISTER:
00 : HCLK = FCLK/1.
01 : HCLK = FCLK/2.
10 : HCLK = FCLK/4 when CAMDIVN[9] = 0.
HCLK= FCLK/8 when CAMDIVN[9] = 1.
11 : HCLK = FCLK/3 when CAMDIVN[8] = 0.
HCLK = FCLK/6 when CAMDIVN[8] = 1
1.设置CLKDIVN 的 1、2位为’1’'0’且第9位为0,可使HCLK为FCLK的1/4;设置0位为’1’可使PCLK = FCLK/2。
CLKDIVN = 0x5;
2.设置PLLCON = 0x5C11,可使FCLK = 400M。
3.查阅2440手册 244page ,当HDVIN不为0时,CPU要设置为异步模式,否则就会以HCLK运行。
//设置为异步模式,MMU_SetAsyncBusMode
mrc p15,0,r0,c1,c0,0
orr r0,r0,#R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0
修改后汇编代码如下:
.text
.global _start
_start:
/*关闭看门狗*/
ldr r0, =0x53000000
ldr r1, =0
str r1, [r0]
/*设置MPLL->FCLK:HCLK:PCLK = 400M:100M:50M*/
/*LockTime(0x4C000000) = 0xFFFFFFFF;*/
ldr r0, =0x4C000000
ldr r1, =0xFFFFFFFF
str r1,[r0]
/*CLKDIVN(0x4C000014) = 0x5*/
ldr r0, =0x4C000014
ldr r1, =0x5
str r1,[r0]
/*设置CPU于异步模式*/
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xC0000000 //R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0
/*设置MPLLCON(0x4C000004)*/
ldr r0, =0x4C000004
ldr r1, =0x5C011
str r1,[r0]
/*一旦设置PLL,就会锁定Locktime直到PLL输出稳定*/
/*设置内存:sp栈,判断是NAND or NOR启动*/
mov r1,#0
ldr r0,[r1] /*先读0地址,留作备份*/
str r1,[r1] /*将#0存入[0]地址*/
ldr r2,[r1] /*r2 = [0]*/
cmp r1,r2 /*比较R1,R2,相等则为NAND启动*/
ldr sp, = 0x40000000+4096 /*先假设NOR启动*/
moveq sp, #4096 /*如果相等*/
streq r0,[r1] /*恢复原先的值*/
bl main
halt:
b halt