ARM笔记: 裸机实验之存储控制器
扫描二维码
随时随地手机看文章
S3C2440中共有8个bank每个bank的地址空间为128MB,总共1GB。bank0数据位宽是由硬件选择,其他可由设置相应寄存器来改变。bank0-bank5支持外接ROM和SRAM,bank6和bank7还支持SDRAM(即开发板上的内存),且bank6和bank7的地址空间大小是可变的。
S3C2440对外引出27根地址线ADDR0-ADDR26,访问空间128MB。同时还引出nGCS0-nGCS7,对应bank0-bank7,当访问相应bank时。相应的nGCSx输出低电平选中外设。地址分布图如下。
Steppingstone是cpu内部的RAM有4KB。当cpu上电时硬件选择了从Nand flash启动则,硬件上则会将Nand flash中前4KB的数据复制到Steppingstone中,起始地址为0。
使用SDRAM:
SDRAM需要连接到bank6或者bank7。开发板上使用的SDRAM是HY57V561620,此SDRAM由4个逻辑Bank(L-bank)组成,每个bank有4M,数据宽度是16位。所以其容量为4*4MB*2B=32MB。开发板有两块SDRAM。数据宽度32位,则容量为64MB。连接如图:
因为板上SDRAM总容量为64MB,所以地址线用到26根。最末尾两位LADDR24和LADDR25连接SDRAM的BA0和BA1,用来选择SDRAM的逻辑bank。因为是32位数据宽度低两位LADDR0和LADDR1没有使用。SDRAM的片选信号nSCS连接到cpu的nGCS6:nSCS0上所以使用的是Bank6。
SDRAM的访问步骤大致如下:
1.cpu发出片选信号nSCS有效,SDRAM被选中。
2.LADDR24和LADDR25,选中SDRAM中的L-bank。
3.对被选中的芯片进行行列寻址。
4.找到的存储单元的数据传输到数据总线上。
这些操作都是在设置好相应的寄存器,在访问内存时,cpu自动操作的。cpu可以根据设置在寄存器中的列地址位数和内存大小等信息,自动分出L-bank,行,列地址,并按相应的时序发送到SDRAM。
寄存器介绍:
存储控制器共有13个寄存器,bank0-bank5只需设置BWSCON和BANKCONx。bank6和bank7外接SDRAM时还需设置其他寄存器,下面是各个寄存器的介绍。
BWSCON(Bus width & Wait CONtrol register)位宽和等待寄存器。此寄存器设置每个bank的位宽,其中每4位控制一个bank。根据数据手册其中每4位中
DWx:占两位设置bankx的位宽,00对应8位01对应16位10对应32位
WSx:占一位是否使用WAIT信号,一般为0不使用
STx:占一位是否启用SDRAM数据掩码引脚SDRAM此位为0
其中比较特殊的是bank0,它的位宽是由硬件引脚OM0,OM1决定的。
BANKCONx(BANK CONtrol register)。在8个bank中bank6和bank7可以接SDRAM所以BANKCON6和BANKCON7与0-5不同。0-5中主要控制外接设备的访问时序。而6和7多出了,
MT:用于设置此BANK是外接存储器类型。SRAM/ROM为00,SDRAM为11
Trcd:RAS到CAS的延时
SCAN:SDRAM的列地址数,00为8位01为9位10为10位,
REFRESH (refresh control register)刷新控制寄存器,其中REFEN 0为禁止刷新功能,1为开启刷新功能。TREFMD刷新模式,Trp预充电时间,Tsrc半行周期。剩下0-10位是刷新计数器,计算公式为2^11+1-SDRAM时钟频率(MHz)*SDRAM刷新周期(us).2440开发板在未使用PLL时,时钟频率等于晶振频率12MHz,计算得出等于1955.整个寄存器则在本开发板中为0x008C07A3
BANKSIZE bank大小寄存器,其中BURST_EN 0为禁止突发传送1为支持突发传输。SCKE_EN使能掉电模式与否,SCLK_EN仅在访问SDRAM期间发出SCLK信号。BK76MAP设置BANK6/7大小。010为128MB 001为64MB。本例为0xb1。
MRSRBx(SDRAM mode register set rgister)x为6和7。能设置的只有CL[6:4]CAS等待时间。整个寄存器设置为0x30
实验代码简介:
@****************************************
@ 设置SDRAM 将下载到nandflash中转存到内部
@ SRAM中的程序复制到SDRAM 然后跳到SDRAM处
@ 执行
@****************************************
.equMEM_CTL_BASE,0x48000000
.equSDRAM_BASE,0x30000000
.equWTCON,0x53000000
.text
.global _start
_start:
bl disable_watchdog
bl init_sdram
bl move_to_sdram
ldr pc,=jump_to_main
disable_watchdog:
ldr r1,=WTCON
mov r2,#0x0
str r2,[r1]
mov pc,lr
init_sdram:
ldr r1,=MEM_CTL_BASE
adrl r2,mem_cfg_val
add r3,r1,#52@4*13=52
0:@数字标号是局部标号,这种标号可以在不同区域多次出现。
ldr r4,[r2],#4
str r4,[r1],#4
cmp r1,r3
bne 0b
mov pc,lr
move_to_sdram:
mov r1,#0;
ldr r2,=SDRAM_BASE
add r3,r1,#4*1024
0:
ldr r4,[r1],#4
str r4,[r2],#4
cmp r2,r3
bne 0b
mov pc,lr
jump_to_main:
ldr sp,=0x34000000
bl main
.align 4
mem_cfg_val:
.word0x22011110@BWSCON
.word0x00000700@BANKCON0
.word0x00000700@BANKCON1
.word0x00000700@BANKCON2
.word0x00000700@BANKCON3
.word0x00000700@BANKCON4
.word0x00000700@BANKCON5
.word0x00018005@BANKCON6
.word0x00018005@BANKCON7
.word0x008C07A3@REFRESH
.word0x000000b1@BANKSIZE
.word0x00000030@MRSRB6
.word0x00000030@MRSRB7
Makefile文件如下:
sdram.bin : head.Sleds.c
arm-linux-gcc-c -o head.o head.S
arm-linux-gcc -c -o leds.o leds.c
arm-linux-ld -Ttext 0x30000000 head.o leds.o -o sdram_elf
arm-linux-objcopy -O binary -S sdram_elf sdram.bin
arm-linux-objdump -D -m armsdram_elf > sdram.dis
clean:
rm -fsdram.dis sdram.bin sdram_elf *.o