新闻中心

EEPW首页>嵌入式系统>设计应用> 2440初始化存储器原理(接上一篇)

2440初始化存储器原理(接上一篇)

作者: 时间:2016-11-09 来源:网络 收藏

JLInk 调试加载的执行初始化存储器脚本(2440

本文引用地址://m.amcfsurvey.com/article/201611/317613.htm

Setmem 0x53000000 0x00000000 32
Setmem 0x4A000008 0xFFFFFFFF 32
Setmem 0x4A00001C 0x000007FF 32
Setmem 0x53000000 0x00000000 32
Setmem 0x56000050 0x000055AA 32
Setmem 0x4C000014 0x00000007 32
Setmem 0x4C000000 0x00FFFFFF 32
Setmem 0x4C000004 0x00061012 32
Setmem 0x4C000008 0x00040042 32
Setmem 0x48000000 0x22111120 32
Setmem 0x48000004 0x00002F50 32
Setmem 0x48000008 0x00000700 32
Setmem 0x4800000C 0x00000700 32
Setmem 0x48000010 0x00000700 32
Setmem 0x48000014 0x00000700 32
Setmem 0x48000018 0x0007FFFC 32
Setmem 0x4800001C 0x00018005 32
Setmem 0x48000020 0x00018005 32
Setmem 0x48000024 0x008E0459 32
Setmem 0x48000028 0x00000032 32
Setmem 0x4800002C 0x00000030 32
Setmem 0x48000030 0x00000030 32

原理:

1、什么是存储控制器

存储控制器是创建和控制其他存储设备的一种设备。S3C2440中存储控制器的起始地址为0x48000000结束地址为0x48000030。通过配置存储控制器提供的13个寄存器的具体数值来达到访问外围设备的目的。

2、如何得到外围设备的访问地址

在说明得到外围设备地址之前,先说明一下什么是片选信号。读过微机原理的同志应该很清楚了。

在S3C2440中分为nGCS0~nGCS7,共8个片选信号。分别对应了BANK0~BANK7,当需要访问外围设备的空间时(即访问BANKx 时),nGCSx 引脚输出低电平信号,这样选择相对应的BANKx外围设备来访问。(注:nGCS0~nGCS7在S3C2440手册中可以查找到相应的地址分配表)

BANK访问地址=BANK起始地址+地址线地址。

3、存储控制器中寄存器的使用

3.1、存储控制器提供的13个寄存器

BWSCON,BANKCONx(x=0~7),REFRESH,BANKSIZE,MRSRBx(x=6~7),共13个寄存器。在这些寄存器的配置中,当配置BANK0~BANK5的时候,只需要配置BWSCON和BANKCONx(x=0~5)即可。由于BANK6和BANK7嘤糜谕饨覵DRAM,所以配置的时候除配置BWSCON和BANKCONx(x=6~7)外,还需要配置REFRESH,BANKSIZE,MRSRB6和MRSRB7等4个寄存器。

BWSCON(R/WBusWidth & WaitStatusControl,位宽和等待寄存器)

BWSCON共32位,BWSCON的高4位对应了外设的BANK7,然而BWSCON是每4位对应一个BANK,所以依次类推可以得到其余BANK6~BANK0的对应位数。

STx(x= 0~7):启动/禁止SDRAM数据掩码引脚。对于SDRAM此位为0,对于SRAM此位为1。一般为0。

WSx(x= 0~7):是否使用存储器的WAIT信号。通常设为0。 /*0 = WAIT disable*/

DWx(x= 0~7):用2位来设置对应BANK位宽(数据总线宽度),00=8-bit;01=16-bit;10=32-bit;11=reserved

其中,比较特殊的BANK0,它没有ST0和WS0,且DW0[2:1]为只读,由硬件电路跳线决定01=16-bit;10=32-bit。

BANKCONx(x= 0~5):用来控制外接设备的访问时序,默认设置0X0700可以满足使用需求。

BANKCONx(x= 6~7):只有BANK6和BANK7可以用来外接SRAM或SDRAM,所以在配置BANK6~BANK7会有所不同。

MT[16:15]位:用来标识外接的设备是ROM/SRAM,还是SDRAM。 /*00 = ROM or SRAM;01 = Reserved;10 = Reserved;11 = Sync.DRAM */

当MT=0b00时(即外接ROM):此时设置与BANKCONx(x= 0~5)并无多大差异。

当MT=0b11时(即外接SDRAM):

Trcd[3:2]:Time ofRAS toCASdelay(内存行地址传输到列地址的延迟时间) /*00 = 2 clocks;01 = 3 clocks;10 = 4 clocks*/

SCAN[1:0]:表示SDRAM列的地址,可根据具体芯片情况设置 /*00 = 8-bit;01 = 9-bit;10= 10-bit*/

REFRESH:刷新控制寄存器。

REFEN[23]:使能控制SDRAM刷新功能。/*0 = Disable;1 = Enable (self or CBR/auto refresh)*/

TREFMD[22]:SDRAM刷新模式。/*0 = CBR/Auto Refresh;1 = Self Refresh (休眠模式)*/

Trp[21:20]:Time of SDRAMRASpre-charge(RAS预充电时间)。/*00 = 2 clocks;01 = 3 clocks;10 = 4 clocks;11 = Not support*/

Tsrc[19:18]:Time of SDRAMSemiRowcycle(半行周期时间)。/*00 = 4 clocks;01 = 5 clocks;10 = 6 clocks;11 = 7 clocks*/ 注:Reserved[17:11]:Not used.

Refresh Counter[10:0]:SDRAM refresh count value(刷新计数值)。

BANKSIZE寄存器:

BURST_EN[7]:ARM coreburstoperation enable(ARM内核心突发操作使能)。/*0 = Disable burst operation;1 = Enable burst operation*/ 注:Reserved[6]:Not used.

SCKE_EN[5]:SDRAM power down mode enable control bySCKE。(SCKE power down模式使能)/*0 = SDRAM power down mode disable;1 = SDRAM power down mode enable*/

SCLK_EN[4]:SCLK is enabledonly during SDRAM access cycle for reducing power consumption. When SDRAM is not accessed SCLK becomes L level(低电平). /*0 = SCLK is always active. 1 = SCLK is active only during the access (recommended).*/注:Reserved[3]:Not used.

BK76MAP[2:0]:设置BANK6~BANK7的大小。/* 010 = 128MB/128MB;001 = 64MB/64MB;000 = 32M/32M;111 = 16M/16M;110 = 8M/8M;101 = 4M/4M;100 = 2M/2M */

MRSRBx(x= 6~7):SDRAM模式设置寄存器。

能做修改的只有CL[6:4]:代表SDRAM时序的一些参数。 /*000 = 1 clock;010 = 2 clocks;011=3 clocks;Others: reserved*/

2410内存控制器介绍(BWSCON)

http://blogold.chinaunix.net/u1/59572/showart_1914422.html

下面先转载手册对于内存控制器基本特点的概述:

— Little/Big endian (selectable by a software)

— Address space: 128Mbytes per bank (total 1GB/8 banks)

— Programmable access size (8/16/32-bit) for all banks except bank0 (16/32-bit)

— Total 8 memory banks

Six memory banks for ROM, SRAM, etc.

Remaining two memory banks for ROM, SRAM, SDRAM, etc .

— Seven fixed memory bank start address

— One flexible memory bank start address and programmable bank size

— Programmable access cycles for all memory banks

— External wait to extend the bus cycles

Supporting self-refresh and power down mode in SDRAM

bank6和bank7的大小必须一样,并且bank7的起始地址根据bank6的大小不同而不同

复位后S3C2410A的存储器映射图如下:

bank0(nGCS0)数据总线宽度由OM[1:0]决定:

OM[1:0]= 00 Nand Flash 模式

01 16位

10 32位

11 测试模式

2)以图2(带nWAIT信号)为例,描述一下处理器的总线的读操作过程,来说明Flash整体读、写的流程。第一个时钟周期开始,系统地址总线给出需要访问的存储空间地址,经过Tacs时间后,片选信号也相应给出(锁存当前地址线上地址信息),再经过Tcso时间后,处理器给出当前操作是读(nOE为低)还是写(new为低),并在Tacc时间内将数据数据准备好放之总线上,Tacc时间后(并查看nWAIT信号,为低则延长本次总线作y一个时钟周期),nOE 拉高,锁存数据线数据。这样一个总线操作就基本完成

图2 带nWAIT 信号的总线读操作


相关的寄存器

数据宽度和等待控制寄存器:

BWSCON地址0x48000000

BWSCON每四位为一组,控制着bank0到bank7,以bank7为例这四位分别为:ST7[31],WS7[30],DW7[29,28]

ST7:启动/禁止SDRAM的数据掩码引脚,对于SDRAM,此位为0;对于SRAM,此位为1。

Determine SRAM for using UB/LB for bank 7.

0 = Not using UB/LB (The pins are dedicated nWBE[3:0])

1 = Using UB/LB (The pins are dedicated nBE[3:0])

nBE[3:0] is the AND signal nWBE[3:0] and nOE.

WS7:是否使用存储器的WAIT信号,通常设为0

DW7:使用两位来设置存储器的位宽:00-8位,01-16位,10-32位,11-保留。

其他个bank与此一样,比较特殊的是bank0对应的4位,它们由硬件跳线决定,只读。

bank控制寄存器(BANKCONN:nGCS0-nGCS5): reset value: 0x0700

BANKCON0地址0x48000004

BANKCON1地址0x48000008

BANKCON2地址0x4800000C

BANKCON3地址0x48000010

BANKCON4地址0x48000014

BANKCON5地址0x48000018

BANK控制寄存器(BANKCONN:nGCS6-nGCS7):reset value: 0x0700

BANKCON6地址0x4800001C

BANKCON7地址0x48000020

各bank控制寄存器只使用[14:0]位,主要是控制读写时序各个参数的大小,如:Tacs,Tcos等。对于bank6和bank7,还要使用到[16:15]两位,用来控制bank6和bank7的存储模式,00表示使用rom或sram存储,11表示使用sdram存储。

对于本开发板,使用两片容量为32Mbyte、位宽为16的SDRAM组成容量为64Mbyte、位宽为32的存储器,所以其BWSCON相应位 为:0010。对于本开发板,BWSCON可设为0x22111110:其实我们只需要将BANK6对应的4位设为0010即可,其它的是什么值没什么影 响,这个值是参考手册上给出的。

2.BANKCON0-BANKCON5:我们没用到,使用默认值0x00000700即可

3.BANKCON6-BANKCON7:设为0x00018005

在8个BANK中,只有BANK6和BANK7可以使用SRAM或SDRAM,所以BANKCON6-7与BANKCON0-5有点不同:

a.MT([16:15]):用于设置本BANK外接的是SRAM还是SDRAM:SRAM-0b00,SDRAM-0b11

b.当MT=0b11时,还需要设置两个参数:

Trcd([3:2]):RAS to CAS delay,设为推荐值0b01

SCAN([1:0]):SDRAM的列地址位数,对于本开发板使用的SDRAM HY57V561620CT-H,列地址位数为9,所以SCAN=0b01。如果使用其他型号的SDRAM,您需要查看它的数据手册来决定SCAN的取值:00-8位,01-9位,10-10位

REFRESH控制寄存器:

REFRESH地址:x48000024

REFRESH(SDRAM refresh control register):设为0x008e0000+ R_CNT

地址0其中R_CNT用于控制SDRAM的刷新周期,占用REFRESH寄存器的[10:0]位,它的取值可如下计算(SDRAM时钟频率就是HCLK):

R_CNT = 2^11 + 1 – SDRAM时钟频率(MHz) * SDRAM刷新周期(uS)

在未使用PLL时,SDRAM时钟频率等于晶振频率12MHz;SDRAM的刷新周期在SDRAM的数据手册上有标明,在本开发板使用的SDRAM HY57V561620CT-H的数据手册上,可看见这么一行“8192 refresh cycles / 64ms”:所以,刷新周期=64ms/8192 = 7.8125 uS。

对于本实验,R_CNT = 2^11 + 1 – 12 * 7.8125 = 1955,

REFRESH=0x008e0000 + 1955 = 0x008e07a3

BANKSIZE寄存器:

BANKSIZE 地址0x48000028

BURST_EN [7] ARM核突发操作允许

0--禁止突发操作

1--允许突发操作

Reserved[6] 不使用

SCKE_EN [5] SCKE允许控制

0=SDRAM SCKE 禁止

1=SDRAM SCKE 允许

SCLK_EN [4] SCLK仅在减少功耗期间SDRAM存取周期内允许,当SDRAM不进行

存取时,SCLK变L电平

0=SCLK总是激活

1=SDRAM仅在存取期间激活(推荐)

Reserved[3] 不使用

BK76MAP[2:0] BANK6/7存储映射

010=128MB/128MB 001=64MB/64MB

000=32MB/32MB 111=16MB/16MB

110=8MB/8MB 101=4MB/4MB

100=2MB/2MB

位[7]=1:Enable burst operation

位[5]=1:SDRAM power down mode enable

位[4]=1:SCLK is active only during the access (recommended)

位[2:1]=010:BANK6、BANK7对应的地址空间与BANK0-5不同。BANK0-5的地址空间都是固定的128M,地址范围是 (x*128M)到(x+1)*128M-1,x表示0到5。但是BANK7的起始地址是可变的,您可以从S3C2410数据手册第5章“Table 5-1. Bank 6/7 Addresses”中了解到BANK6、7的地址范围与地址空间的关系。本开发板仅使用BANK6的64M空间,我们可以令位 [2:1]=010(128M/128M)或001(64M/64M):这没关系,多出来的空间程序会检测出来,不会发生使用不存在的内存的情况——后面 介绍到的bootloader和linux内核都会作内存检测。

位[6]、位[3]没有使用

SDRAM模式寄存器设置寄存器(MRSR):

MRSRB6地址0x4800002C

MRSRB7 地址0x48000030

能让我们修改的只有位[6:4](CL),SDRAM HY57V561620CT-H不支持CL=1的情况,所以位[6:4]取值为010(CL=2)或011(CL=3)。




关键词:2440初始化存储

评论


技术专区

关闭