版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lvjianxin6015/article/details/54897760
对于内存:
SRAM一般作为cpu的垫脚石(存储较快,不需要刷新)
DRAM:分为SDRAM、DDR 、DDR2(需要刷新,存储相对较慢)
2440的内存是64M,是由两个32M的内存芯片与处理器连接合成的。处理器共有27根地址线,可以访问2的27次方,即128M内存,由于有8个片选端,即总共可以访问128*8=1G的内存。对于2440,cpu的低16位地址线分别连接两块32M的内存芯片,32位的数据线的前16位与后16位分别连接两块内存的数据线,即一个时钟周期最多可以同时传送32bit的数据。
查看datasheet的memory controler可以发现,bank0为cpu的垫脚石,一般bank6与bank7作为内存区域,起始地址为0x30000000。此时需要配置存储控制寄存器,包括配置数据总线宽度、是否等待控制等。
因为比方说,*0x30008000=0x5;
0x30008000属于哪一个bank,行地址、列地址是什么——需要存储控制器做一个分解与解析,再对该内存处(norflash、网卡、内存等)写入相应值。
按照datasheet的存储控制器配置以下7个寄存器:
代码如下:
#define mem_contrl 0x48000000 % BWSCON:Bus width & wait status control register
init_sdram:
ldr r0, =mem_contrl
add r3, r0, #4*13
adrl r1, mem_data %adrl与adr指令类似,为伪指令其加载的地址范围要宽,为32位
0:
ldr r2, [r1], #4
str r2, [r0], #4
cmp r0, r3
bne 0b %不等于0跳转到0处,b表示向前跳转
mov pc, lr
mem_data:
.long 0x22000000
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00018001
.long 0x00018001
.long 0x008c04f5
.long 0x000000b1
.long 0x00000030
.long 0x00000030