系统运输
? S3C2440存储控制器可提供访问外围设备所需的信号,其中包括:
大/小字节序支持(在软件中选择);
每个存储体的地址空间为128MB,共计1GB(8个存储体);
可编程总线宽度(8/16/32bit ),存储体0为2种位宽( 16/32bit );
共有8个存储体:存储体0-存储体5可支持外置ROM、SRAM等; 存储体6-存储体7除了支持ROM、SRAM之外,还支持SDRAM等;
存储体0-67个存储体的起始地址固定;
存储体7的起始地址是可编程的;
在存储体的每个存取周期可编程控制;
用外部wait信号延长总线接入周期
对于外部SDRAM,支持自刷新和省电模式。
? S3C2440引出到外部的27条地址线ADDR0-ADDR26的访问范围只有128MB,但8个芯片选择信号nGCS0-nGCS7与BANK0-BANK7对应,当访问BANKx的地址空间时每个nGCSx对应128MB的地址空间,8个nGCSx信号总共对应1GB。
? BANK6将SDRAM连接到TQ2440开发板,CPU为SDRAM提供一系列信号。
SDRAM时钟有效信号LSCKE;
SDRAM时钟信号LSCLK0/LSCLK1;
数据屏蔽信号LnWBE0/LnWBE1/LnWBE2/LnWBE3;
SDRAM行地址选通信号LnSRAS;
SDRAM列地址选通信号LnSCAS;
写使能信号LnWE
1、SDRAM简介
? SDRAM内部是一个类似二维表的存储阵列,用于写入数据。 搜索原理与表相同,首先指定行地址,然后指定列地址,可以准确地找到所需的单元。 该单元称为存储单元,表称为逻辑存储体( LB )。 SDRAM一般有四个LL存储体,其逻辑示意图如上图所示。
? 对SDRAM的访问分为以下四个步骤。
1、来自CPU芯片选择信号LnSCS0是有效的;
2、SDRAM有4个L-BANK,为了选择其中一个需要2条地址线。 从图中可以看出,使用ADDR24、ADDR25作为L-BANK选择信号。
3、对所选芯片进行统一的行/列(存储单元)寻址;
4、找到存储单元后,所选芯片进行相同的数据传输。
? 在TQ2440开发板中,将2片16位的ADRAM芯片并联组合制成32位的位宽,与CPU的32条数据线( DATA0-DATA31 )连接。 bank 6的起始地址为0x30000000,因此SDRAM的访问地址为0x30000000-ox33ffffff,共计64MB。
2、使用内存控制器的寄存器
? 在S3C2440中,内存控制器共有13个寄存器,存储体0-存储体5只需设定BWSCON和存储体CONX(x为0-5 )两个寄存器,向存储体6/存储体7外置SDRAM时
位宽和等待控制寄存器BWSCON
BWSCON
说明
STx
启动/禁止SDRAM的数据掩码管脚。 对于SDRAM,该位为0; 对于SRAM,该位为1
WSx
是否使用存储器的WAIT信号通常设定为0
DWx
使用2位设定对应存储体的位宽。 0b00为8位,0b01为16位,0b10为32位,0b11为保留
? 如果是bank 0,则没有ST0和WS0、dw0,[2:1],bank 0只支持2种位宽16/32。
可以通过存储体控制寄存器bankconx(x为0-5 )控制存储体0-bank5外围设备的访问时间,通过默认的0x0700满足TQ2440开发板。
使用存储体控制寄存器bankconx(x为6-7 ),8个存储体中只有存储体6和存储体7可以外置SRAM或SDRAM,因此设定方法不同。
银行同业公会
说明
MT [16:15]
用于bank外部设定的是SRAM或SDRAM,00=ROM or SRAM,11=Sync. DRAM
Trcd [3:2]
建议设置RAS to CAS delay,0b01
SCAN [1:0]
SDRAM的列地址位数,00=8-bit 01=9-bit 10=10-bit
刷新控制寄存器刷新
刷新
说明
REFEN [23]
0、禁止SDRAM刷新的功能,1、打开SDRAM的刷新功能
TREFMD [22]
SDRAM的刷新模式。 0=CBR/Auto Refresh 1=Self Refresh ( (典型系统休眠时使用) ) ) ) ) ) ) )。
Trp [21:20]
通常设定为0
Tsrc [19:18]
设定为默认值11
Refresh Counter [10:0]
SDRAM刷新值,refreshperiod=(211-SDRAM时钟频率( MHX )1)/sdram刷新周期( us ) ) ) )。
BANKSIZE寄存器
班克斯
说明
BURST_EN [7]
0、禁止ARM核心突发传输; 1、ARM核支持突发传输
SCKE_EN [5]
0、不使用SCKE信号将SDRAM置于省电模式; 1、用SCKE信号将SDRAM置于省电模式
SCLK_EN [4]
0、始终发出SCLK信号; 1、仅在访问SDRAM期间发出SCLE信号
BK76MAP [2:0]
设定储存区大小
SDRAM模式设置寄存器Mrsrbx(6-7) ) )。
MRSRBx
说明
CL [6:4]
SDRAM序列的时间参数设定
3、存储器控制器实验; 打开LED灯
? 从NAND Flash启动CPU时,CPU通过内部硬件将4KB的数据从NAND Flash复制到4KB的内部RAM (起始地址为0 ),跳到地址0并开始执行。
? 在本实验中,首先使用汇编语言设置内存控制器以便可以使用外部的SDRAM,然后将程序本身从Steppingstone复制到SDRAM,最后跳转到SDRAM执行。
首先在head.S文件中,完成的任务是设置SDRAM,将程序复制到SDRAM中,然后跳转到SDRAM继续执行。
. equ MEM_CTL_BASE,0x48000000
. equ SDRAM_BASE,0x30000000
. text
. global _start
_start :
关闭bldisable_watch_dog@watchdog。 否则,处理器将继续重新启动
bl memsetup @存储控制器设置
将bl copy_steppingstone_to_sdram @代码复制到SDRAM
跳到ldr pc,=on_SDRAM@SDRAM继续执行
on_sdram :
ldr sp,=0x34000000 @设置堆栈
bl main
halt_loop :
b halt_loop
disable_watch_dog :
在WATCHDOG寄存器中写0就可以了
mov r1,#0x53000000
mov r2,#0x0
str r2,[r1]
mov pc,lr @返回
copy_steppingstone_to_sdram :
将Steppingstone的4K数据全部复制到SDRAM
@ Steppingstone的起始地址为0x00000000,SDRAM的起始地址为0x 300000000
mov r1,#0
ldr r2,=SDRAM_BASE
mov r3,#4*1024
1 :
ldr r4,[r1],#4 @从Steppingstone读取4字节的数据,在源地址上加4
str r4,[r2],#4 @将这4个字节的数据复制到SDRAM,在地址上加4
cmp r1,r3 @是否完成的判断:发送源地址是否等于Steppingstone的未地址?
bne 1b @如果复制尚未完成,请继续
mov pc,lr @返回
memsetup :
配置存储控制器以使用SDRAM等外围设备
mov r1,#MEM_CTL_BASE @存储控制器的13个寄存器的开始地址
adrl r2,mem_cfg_val @的13个值的起始存储器地址
add r3,r1,#52 @ 13*4=54
1 :
ldr r4、[r2]、#4 @读入设定值,使r2加4
str r4,[r1],#4 @将该值写入寄存器,使r1加4
cmp r1,r3 @判断13个寄存器是否全部设置完毕
如果没有写bne 1b @,请继续
mov pc,lr @返回
. align 4
mem_cfg_val :
13个存储器控制器寄存器的设定值
. long0x22011110 @ BWSCON
. long0x00000700 @ BANKCON0
. long0x00000700 @ BANKCON1
. long0x00000700 @ BANKCON2
. long0x00000700 @ BANKCON3
. long0x00000700 @ BANKCON4
. long0x00000700 @ BANKCON5
. long0x00018005 @ BANKCON6
. long0x00018005 @ BANKCON7
. long0x008C07A3 @ REFRESH
. long0x000000B1 @ BANKSIZE
. long0x00000030 @ MRSRB6
. long0x00000030 @ MRSRB7
在leds.c文件中,完成led循环闪烁实验。
# definegpbcon ( * ( volatile unsigned long * )0x56000010 ) ) ) ) ) ) )。
# definegpbdat ( * ( volatile unsigned long * )0x56000014 ) ) ) ) )。
/*
* LED1、LED2和LED4支持GPB5、GPB6、GPB7和GPB8
*/
#definegpB5_out(1(5*2) )
#definegpb6_out(1(6*2) )
#definegpb7_out(1(7*2) )
#definegpb8_out(1(8*2) )
虚拟等待( volatileunsignedlongdly )。
{
for (; dly 0; dly--;
}
入主( void ) )。
{
unsigned long i=0;
将与//LED1、LED2、LED3、LED4对应4个端子作为输出
gpb con=gp b5 _ out|gpb6_ out|gpb7_ out|gpb8_ out;
wile(1) {
wait(30000;
GPBdat=( ) ( I5 ); 根据//I的值点亮le D1、2、3、4
if(I==16 ) )。
i=0;
}
返回0;
}
makefile写如下。
sdram.bin : head.S leds.c
arm-linux-gcc -c -o head.o head.S
arm-linux-gcc -c -o leds.o leds.c
arm-Linux-LD-t text0x 30000000 head.OLEDs.o-o SDRAM _ elf #链接代码段的起始地址为0x30000000
arm-Linux-objcopy-o binary-ssdram _ elf SDRAM.bin
arm-Linux-objdump-d-marmsdram _ elf SDRAM.dis
clean :
RM-fs dram.di ssdram.bin SDRAM _ elf *.o
代码的具体流程图如下。
?
实验结果:
? 根据直接在内部SRAM上运行的结果,可以看出在外部SDRAM上运行的LED点亮程序的LED闪烁速度更慢。 本程序只能将内部SRAM的4KB程序复制到外部SDRAM,如果程序大于4KB,必须使用NAND Flash控制器复制4KB后的代码。
实验代码
详情请访问云服务器、域名注册、虚拟主机的问题,请访问西部数码代理商官方网站: www.chenqinet.cn