陈奇网络工作室

07-存储管理器实验

系统运输

? 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

相关推荐

后台-系统设置-扩展变量-手机广告位-内容页底部广告位3