【ARM学习笔记】实验三:S3C2440A与内存SDRAM连接实验

发布者:徽宗古泉最新更新时间:2017-10-09 来源: eefocus关键字:ARM  S3C2440A  内存  SDRAM 手机看文章 扫描二维码
随时随地手机看文章
前文讲到了存储控制器对外引出了8根片选信号线,分别对应8个BANK,每个BANK的地址空间大小为128MB,共计1GB的物理寻址空间


在8个BANK中,BANK0占用总线地址0x00000000~0x07FFFFFF,而CPU在上电后会从总线地址0x00000000读取指令执行,只能通过硬件引脚OM1和OM0配置成16bit或32bit的位宽,一般情况下,BANK0都是用来连接Nor Flash作为启动设备用的


BANK1~BANK5可以随意连接具备类内存接口的ROM和SRAM,支持8bit,16bit和32bit这3种位宽


BANK6和BANK7则除了连接具备类内存接口的ROM和SRAM,还可以用来连接SDRAM,因为BANK6和BANK7多出了几个特殊接口用来支持SDRAM,同时BANK6和BANK7还支持2块SDRAM并联


实际上,由于Nor Flash和SRAM价格较贵,而且容量较小,所以大多数开发板都采用Nand Flash启动,使用2块SDRAM并联作为内存




以百问网的JZ2440v2开发板为例:


JZ2440v2采用2颗三星K4S561632N SDRAM芯片作为内存,单片容量32MB,位宽16bit,两片组成32bit,不要需要注意的是,并联以后存储管理器会把2片内存当成独立的64MB、32bit的一片内存对待。


JZ2440v2同时拥有Nor Flash和Nand Flash


以下为JZ2440的SDRAM接线图:


ARM学习笔记实验三:S3C2440A与内存SDRAM连接实验


如上图,LDATA[31:0]是32根数据线,LADDR[26:0]是27根地址线


由于这种型号的SDRAM的行地址的宽度是13,列地址的宽度是9,所以只用到13根地址线,另外LADDR0、LADDR1按照32bit芯片接法是不用接的


另外,除了“高/低字节数据掩码信号”LnWBE0、LnWBE1、LnWBE2、LnWBE3以及输入时钟LSCLK0、LSCLK1不相同外


其他引脚,如:片选引脚LnGCS6,行地址列地址使能LnSRAS、LnSCAS,读写控制LnWE,输入时钟有效信号LSCKE,都是共用的


另外LADDR[25:24]用于SDRAM内部的BANK选择





使用SDRAM涉及到的寄存器


1.总线宽度和等待控制寄存器(BWSCON)


其寄存器总线地址为0x48000000,用来设置设备位宽、WAIT状态和UB/LB状态,每4位对应一个BANK

由于JZ2440使用2块SDRAM占用BANK6和BANK7,BANK7对应的bit[31:28]=0b0010,BANK6对应的bit[27:24]=0b0010

第一个0(即bit[31]和bit[27])表示不使用UB/LB状态,第二个0(即bit[30]和bit[26])表示不使用WAIT状态,之后的10(即bit[29:28]和bit[26:2])表示位宽32bit,其它位不用设置

故此寄存器的32位的十六进制值为0x22000000



2.BANK控制寄存器(BANKCON6和BANKCON7 )


BANKCON6的总线地址为0x4800001C,BANKCON7的总线地址为0x48000020,2个BANK只要设置相同的数值即可

本例使用三星K4S561632N只需设置bit[16:15]=0x11和bit[3:0]=0b0101

其中bit[16:15]用来设置存储器类型为SDRAM,bit[3:0]用来设置RAS到CAS的延迟为3个时钟周期(bit[3:2])以及列地址数为9位(bit[1:0])

所以BANKCON6和BANKCON7两个寄存器的32位的十六进制值都设置为0x00018005



3.刷新控制寄存器(REFRESH)


REFRESH的总线地址为0x48000024

本例使用三星K4S561632N只需设置bit[23]=0x1和bit[19:18]=0b11

另外bit[10:0]用来设置刷新计数器Refresh Counter,这个需要根据Datasheet中的刷新周期来计算

Refresh Counter的计算公式为:2^11 + 1 - SDRAM时钟频率(MHz)* SDRAM刷新周期

本例使用三星K4S561632N的关键特性中注明了“64ms refresh period (8K Cycle)”,意思是64毫秒刷新8K次(8192次),算得刷新周期=64ms/8192=7.8125μm

而此时SDRAM的时钟频率等于晶振的12MHz(CPU还未设置时钟频率,此时使用晶振)

所以Refresh Counter的值=2^11 + 1 - 12 * 7.8125 = 1955.25 = 0x7A3 

加上之前的bit[23]和bit[19:18],所以刷新控制寄存器的32位的十六进制值为0x008C07A3



4.BANK大小寄存器(BANKSIZE )


BANKSIZE的总线地址为0x48000028

本例使用三星K4S561632N只需设置bit[7]=0x1、bit[5]=0b1、bit[4]=0b1、bit[2:0]=0b001

其中bit[7]用来设置允许ARM突发操作,bit[5]用来设置SDRAM在掉电模式能使能SCKE 控制,bit[4]用来设置只在SDRAM 访问周期期间SCLK 使能,以降低功耗。bit[2:0]用来设置Bank 6/7 存储器映射64MB/64MB

所以BANKSIZE寄存器的32位的十六进制值都设置为0x000000B1



5.SDRAM模式寄存器组寄存器(MRSRB6 和MRSRB7)


MRSRB6的总线地址为0x4800002C,MRSRB7的总线地址为0x48000030,2个BANK只要设置相同的数值即可

本例使用三星K4S561632N只需设置bit[6:4]=0x011

查询Datasheet可知,此值可设为0b010(十进制2)或0b011(十进制3)和

本开发板建议使用0b011

所以MRSRB6 和MRSRB7两个寄存器的32位的十六进制值都设置为0x00000030



#################################################################################################################

【代码实现】

仅用C语言实现,比较简单方便

#################################################################################################################

     

    

sdram.bin : head.S sdram.c led4.c

arm-linux-gcc -c -o head.o head.S

arm-linux-gcc -c -o sdram.o sdram.c

arm-linux-gcc -c -o led4.o led4.c

arm-linux-ld -Tsdram.lds head.o sdram.o led4.o -o sdram_elf 

arm-linux-objcopy -O binary -S sdram_elf sdram.bin

arm-linux-objdump -D -m arm sdram_elf > sdram.dis

clean:

rm -f *.bin *elf *.o *bak *.dis *~


SECTIONS {

first 0x00000000 : { head.o sdram.o }

second 0x30000000 : AT(0x00000800) { led4.o }

}


.text

.global _start

_start:

ldr sp, =0x00001000

bl disable_watch_dog

bl memsetup

bl copy_2th_to_sdram

ldr sp, =0x34000000

ldr pc, =0x30000000

halt_loop:

b halt_loop


void disable_watch_dog(void)

{

* (unsigned long *)0x53000000 = 0x00000000;

}


void memsetup(void)

{

* (unsigned long *)0x48000000 = 0x22000000;

* (unsigned long *)0x4800001C = 0x00018005;

* (unsigned long *)0x48000020 = 0x00018005;

* (unsigned long *)0x48000024 = 0x008C07A3;

* (unsigned long *)0x48000028 = 0x000000B1;

* (unsigned long *)0x4800002C = 0x00000030;

* (unsigned long *)0x48000030 = 0x00000030;

}


void copy_2th_to_sdram(void)

{

unsigned long * pdwSrc  = (unsigned long *)0x00000800;

unsigned long * pdwDest = (unsigned long *)0x30000000;


while (pdwSrc < (unsigned long *)0x00001000)

{

* pdwDest = * pdwSrc;

pdwSrc++;

pdwDest++;

}

}


int main(void)

{

* (unsigned long *)0x56000050 = 0x00000100;

unsigned long i = 0x00000000;

unsigned long x = 0x00000000;

while(1)

{

* (unsigned long *)0x56000054 = i;

for(x=0x0007530; x>0; x--);

i = ~i;

}

return 0;

}


sdram_elf:     file format elf32-littlearm


Disassembly of section first:


00000000 <_start>:

   0: e3a0da01 mov sp, #4096 ; 0x1000

   4: eb000004 bl 1c

   8: eb00000a bl 38

   c: eb00002c bl c4

  10: e3a0d30d mov sp, #872415232 ; 0x34000000

  14: e3a0f203 mov pc, #805306368 ; 0x30000000


00000018 :

  18: eafffffe b 18


0000001c :

  1c: e1a0c00d mov ip, sp

  20: e92dd800 stmdb sp!, {fp, ip, lr, pc}

  24: e24cb004 sub fp, ip, #4 ; 0x4

  28: e3a02453 mov r2, #1392508928 ; 0x53000000

  2c: e3a03000 mov r3, #0 ; 0x0

  30: e5823000 str r3, [r2]

  34: e89da800 ldmia sp, {fp, sp, pc}


00000038 :

  38: e1a0c00d mov ip, sp

  3c: e92dd800 stmdb sp!, {fp, ip, lr, pc}

  40: e24cb004 sub fp, ip, #4 ; 0x4

  44: e3a02312 mov r2, #1207959552 ; 0x48000000

  48: e3a03422 mov r3, #570425344 ; 0x22000000

  4c: e5823000 str r3, [r2]

  50: e3a02312 mov r2, #1207959552 ; 0x48000000

  54: e282201c add r2, r2, #28 ; 0x1c

  58: e3a03906 mov r3, #98304 ; 0x18000

  5c: e2833005 add r3, r3, #5 ; 0x5

  60: e5823000 str r3, [r2]

  64: e3a02312 mov r2, #1207959552 ; 0x48000000

  68: e2822020 add r2, r2, #32 ; 0x20

  6c: e3a03906 mov r3, #98304 ; 0x18000

  70: e2833005 add r3, r3, #5 ; 0x5

  74: e5823000 str r3, [r2]

  78: e3a02312 mov r2, #1207959552 ; 0x48000000

  7c: e2822024 add r2, r2, #36 ; 0x24

  80: e3a03723 mov r3, #9175040 ; 0x8c0000

  84: e2833e7a add r3, r3, #1952 ; 0x7a0

  88: e2833003 add r3, r3, #3 ; 0x3

  8c: e5823000 str r3, [r2]

  90: e3a03312 mov r3, #1207959552 ; 0x48000000

  94: e2833028 add r3, r3, #40 ; 0x28

  98: e3a020b1 mov r2, #177 ; 0xb1

  9c: e5832000 str r2, [r3]

  a0: e3a03312 mov r3, #1207959552 ; 0x48000000

  a4: e283302c add r3, r3, #44 ; 0x2c

  a8: e3a02030 mov r2, #48 ; 0x30

  ac: e5832000 str r2, [r3]

  b0: e3a03312 mov r3, #1207959552 ; 0x48000000

  b4: e2833030 add r3, r3, #48 ; 0x30

  b8: e3a02030 mov r2, #48 ; 0x30

  bc: e5832000 str r2, [r3]

  c0: e89da800 ldmia sp, {fp, sp, pc}


000000c4 :

  c4: e1a0c00d mov ip, sp

  c8: e92dd800 stmdb sp!, {fp, ip, lr, pc}

  cc: e24cb004 sub fp, ip, #4 ; 0x4

  d0: e24dd008 sub sp, sp, #8 ; 0x8

  d4: e3a03b02 mov r3, #2048 ; 0x800

  d8: e50b3010 str r3, [fp, #-16]

  dc: e3a03203 mov r3, #805306368 ; 0x30000000

  e0: e50b3014 str r3, [fp, #-20]

  e4: e51b2010 ldr r2, [fp, #-16]

  e8: e3a03eff mov r3, #4080 ; 0xff0

  ec: e283300f add r3, r3, #15 ; 0xf

  f0: e1520003 cmp r2, r3

  f4: 8a00000a bhi 124

  f8: e51b2014 ldr r2, [fp, #-20]

  fc: e51b3010 ldr r3, [fp, #-16]

 100: e5933000 ldr r3, [r3]

 104: e5823000 str r3, [r2]

 108: e51b3010 ldr r3, [fp, #-16]

 10c: e2833004 add r3, r3, #4 ; 0x4

 110: e50b3010 str r3, [fp, #-16]

 114: e51b3014 ldr r3, [fp, #-20]

 118: e2833004 add r3, r3, #4 ; 0x4

 11c: e50b3014 str r3, [fp, #-20]

 120: eaffffef b e4

 124: e24bd00c sub sp, fp, #12 ; 0xc

 128: e89da800 ldmia sp, {fp, sp, pc}

 12c: 43434700 cmpmi r3, #0 ; 0x0

 130: 4728203a undefined

 134: 2029554e eorcs r5, r9, lr, asr #10

 138: 2e342e33 mrccs 14, 1, r2, cr4, cr3, {1}

 13c: 00000035 andeq r0, r0, r5, lsr r0

Disassembly of section second:


30000000

:

30000000: e1a0c00d mov ip, sp

30000004: e92dd800 stmdb sp!, {fp, ip, lr, pc}

30000008: e24cb004 sub fp, ip, #4 ; 0x4

3000000c: e24dd008 sub sp, sp, #8 ; 0x8

30000010: e3a03456 mov r3, #1442840576 ; 0x56000000

30000014: e2833050 add r3, r3, #80 ; 0x50

30000018: e3a02c01 mov r2, #256 ; 0x100

3000001c: e5832000 str r2, [r3]

30000020: e3a03000 mov r3, #0 ; 0x0

30000024: e50b3010 str r3, [fp, #-16]

30000028: e3a03000 mov r3, #0 ; 0x0

3000002c: e50b3014 str r3, [fp, #-20]

30000030: e3a03456 mov r3, #1442840576 ; 0x56000000

30000034: e2833054 add r3, r3, #84 ; 0x54

30000038: e51b2010 ldr r2, [fp, #-16]

3000003c: e5832000 str r2, [r3]

30000040: e3a03c75 mov r3, #29952 ; 0x7500

30000044: e2833030 add r3, r3, #48 ; 0x30

30000048: e50b3014 str r3, [fp, #-20]

3000004c: e51b3014 ldr r3, [fp, #-20]

30000050: e3530000 cmp r3, #0 ; 0x0

30000054: 0a000003 beq 30000068

30000058: e51b3014 ldr r3, [fp, #-20]

3000005c: e2433001 sub r3, r3, #1 ; 0x1

30000060: e50b3014 str r3, [fp, #-20]

30000064: eafffff8 b 3000004c

30000068: e51b3010 ldr r3, [fp, #-16]

3000006c: e1e03003 mvn r3, r3

30000070: e50b3010 str r3, [fp, #-16]

30000074: eaffffed b 30000030

30000078: 43434700 cmpmi r3, #0 ; 0x0

3000007c: 4728203a undefined

30000080: 2029554e eorcs r5, r9, lr, asr #10

30000084: 2e342e33 mrccs 14, 1, r2, cr4, cr3, {1}

30000088: 00000035 andeq r0, r0, r5, lsr r0



<完结>   

关键字:ARM  S3C2440A  内存  SDRAM 引用地址:【ARM学习笔记】实验三:S3C2440A与内存SDRAM连接实验

上一篇:【ARM学习笔记】三、S3C2440A的存储控制器及启动过程
下一篇:【ARM学习笔记】四、微控制单元器MCU、ARM及SDRAM简介

推荐阅读最新更新时间:2024-03-16 15:39

适用于车载、工业设备的高可靠性DRAM系列
ROHM集团旗下的LAPIS Semiconductor,作为高可靠性 DRAM系列产品,新开发出搭载输出驱动能力调节功能的128M bit SDRAM“MD56V72160C”/256M bit SDRAM“MD56V82160A”。本LSI搭载了4级输出驱动能力调节功能,可根据用户系统调节电流驱动能力,降低辐射噪声,从而可减少噪声对策零部件与阻尼电阻元件的数量。另外,引线框架采用焊接连接可靠性更高的铜(Cu)框架,因此,还非常适用于车载设备等要求高可靠性的用途。本产品的样品已经在售,计划从2014年3月份开始以月产100万个的规模开始量产销售。 <背景>   在中小容量SDRAM的用途之一车载设备系统中,工作时发生的
[汽车电子]
适用于车载、工业设备的高可靠性DRAM系列
Cortex-M3 and Cortex-M4 Memory Organization
The Cortex-M3 and Cortex-M4 have a predefined memory map. This allows the built-in peripherals, such as the interrupt controller and the debug components, to be accessed by simple memory access instructions. Thus, most system features are accessible in program code. The predefined memory map also allows the Cortex-M3
[单片机]
Cortex-M3 and Cortex-M4 <font color='red'>Memory</font> Organization
嵌入式调试ARM程序跑飞现象的跟踪
最近在调试2410的过程中,经常出现程序跑飞的现象,跟踪进行后发现。。。所以决定把它记录下来。 现象: 调试用的是技创ARM仿真器(兼容multi-ICE)和ADS1.2,板子外扩NandFLASH(装有Bootload)和SDRAM。当将程序烧到FLASH运行时会出现无规律的死机。用仿真器仿真时情况是这样:当CPU复位后,第一次装载程序执行时,情况与烧到FLASH运行时一样。但如果将运行的程序停下来(无论有无跑飞情况下),再重新装载(CPU复位后第二次及以后装载)时,运行到下述程序中的“msr cpsr_cxsf,r1”就跑飞。 bic r0,r0,#MODEMASK | NOINT ;IRQ、FIQ位清0
[单片机]
基于FPGA+DSP的视频处理系统设计
  0 引言   本系统采用基于 FPGA 与 DSP 协同工作进行视频处理的方案,实现视频采集、处理到传输的整个过程。   实时视频图像处理中,低层的预处理算法处理的数据量大,对处理速度要求高,但算法相对比较简单,适合于用FPGA进行硬件实现,这样能兼顾速度及灵活性。高层的处理算法结构复杂,适用于运算速度高、寻址方式灵活、通信机制强的DSP芯片宋实现。   DSP+FPGA架构的最大特点是结构灵活、有较强的通用性、适合于模块化设计,从而能够提高算法效率,同时其开发周期短、系统易于维护和升级,适合于实时视频图像处理。   系统采用模块化的设计方法,将整个系统划分为三部分:视频采集单元、视频处理单元和视频传输单元。   整个系统以F
[嵌入式]
基于FPGA+DSP的视频处理系统设计
(ARM)程序启动过程
作为一般的嵌入式程序设计工作者,平时大部分工作应该主要涉及应用层部分的事务,只要编译工程生成可执行文件,然后把执行文件download到ROM中,就OK了。很少关注烧写到ROM中的程序是怎么运行起来的这一过程。因为这部分工作大都被集成开发环境给做了。本篇文章,我欲将这不不太被关注的过程给简单介绍下(很少关注不代表不重要,相反,个人感觉对这一部分的理解,对于一个嵌入式程序开发者来说是一个小小的分水岭,当然,另外一个重要的分水岭肯定是操作系统啦)。 1 加载文件(sct ld等) 2 bin/image文件 一个简单的image文件主要包括以下三项: RO区域:程序中的指令和常量,read only RW区域:程序中已经初始化的
[单片机]
未来二年DDR3将成为计算机的主流储存技术
本周一全球最大的储存芯片制造商三星电子公司官员表示,DDR3(第三代双倍数据速度)储存芯片将逐步蚕食DDR2(第二代双倍数据速度)芯片的优势,预期到2009年早些时候DDR3 将成为计算机中的主流储存技术。 三星电子储存业务资深副总裁Tae-Sung Jung在新加坡举行的一次会议上向媒体表示,与目前使用的DDR2芯片相比,DDR3芯片能够提供更快的性能和更低的能量消耗。全球首部采用DDR3芯片的计算机将在明年下半年投放市场。 在不到二年的时间里,DDR3芯片将成为计算机中最普通类型的储存产品,副总裁说:“随着时间的推移降低了成本,根据行业普及的比例,2008年晚些时候或2009年,DDR3 芯片将成为主流产品。” 由于日本索
[焦点新闻]
Arm推出平台安全架构PSA
Arm今日宣布推出首个行业通用框架——平台安全架构(PSA,Platform Security Architecture),用以打造安全的互联设备。该举措将为万物互联奠定可信基础,从而加速实现“2035年全球一万亿设备互联”的宏伟愿景。 实现该项愿景,不仅需要人们具备更多保护设备安全方面的知识,还需要人们信任科技行业正在竭尽所能地保护数据。这并非易事,因为这需要与黑客不断较量,而他们正无休止地寻找漏洞,并将其作为切入点侵入我们的生活。 Arm副总裁暨物联网设备IP事业群总经理Paul Williamson表示:“对于从端到云的整个产业价值链,安全都不应该是事后弥补措施。到2021年Arm生态系统基于Arm芯片的累计出货将达
[嵌入式]
三星:未来每一部手机将都采用DRAM内存
北京时间9月4日硅谷动力从境外媒体处获悉:日前,三星电子的移动内存和图形存储部门的负责人Mueez Deen宣称,快速发展的智能手机保证了DRAM内存在手机应用的光明前景,未来每一部手机都将使用DRAM内存芯片。 尽管还不能象个人电脑使用的内存一样确定手机内存的版本,但是内存工作的原理是一样的,只是手机内存在尺寸、散热、能量消耗等手机必须考虑的关键因素上存在差别。 近年来,三星和海力士等DRAM内存厂商都希望适应手机存储市场的巨大需求,发展手机内存芯片以赢得订单。但是用于计算机的标准内存对手机而言耗电太多,因而厂商们纷纷研发手机DRAM内存芯片满足当今智能手机不断提升的计算能力。 Deen还说“一旦你拥有了一个功能丰富的操作
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved