试验意图:改动“点灯大法”的履行地址,从NandFlash的Steppingstone转到SDRAM中履行,借此把握存储操控器的运用。
实 验环境及阐明:恒颐S3C2410开发板H2410。H2410中心板扩展有64MB的SDRAM,用于设置程序仓库和寄存各种变量。SDRAM选用了两 片三星公司的K4S561632(4M*16bit*4BANK),两片拼成32位数据宽度的SDRAM存储系统,并映射到S3C2410的 SROM/SDRAM的BANK6,地址规模是0x30000000~0x33FFFFFF。
实 验思路:开发板上电发动后,主动将NandFlash开端的4K数据仿制到SRAM中,然后跳转到0地址开端履行,然后初始化存储操控器,把程序自身从 SRAM中仿制到SDRAM中,最终跳转到SDRAM中运转。故问题的关键是SDRAM的初始化,依据S3C2410的Datasheet,要运用 SDRAM,就需装备存储操控器的13个寄存器。
常识把握:SDRAM和13个存储操控器的寄存器。
一、SDRAM:
CPU 供给了一组用于SDRAM的信号:SDRAM时钟有用信号SCKE;SDRAM时钟信号SCLK0/SCLK1;数据掩码信号DQM0/DQM1 /DQM2/DQM3;SDRAM片选信号nGCS0(与nGCS6是同一引脚的两个功用);SDRAM行地址选通脉冲信号nSRAS;SDRAM列地址 选通脉冲信号nSCAS;写答应信号nWE(不是SDRAM专用的);
★SDRAM结构:SDRAM的内部是一个存储阵列,检索时先指定一个行,再指定一个列,就能够精确地找到所需求的单元格,这便是SDRAM寻址的基本原理;单元格被称为存储单元,表格便是逻辑BANK,SDRAM一般含有4个逻辑BANK。
★SDRAM 的拜访:SDRAM片选信号nGCS0有用;逻辑BANK挑选;对选中的芯片进行一致的行/列寻址;CPU会从32位的地址中主动分出 逻辑BANK挑选信号、行地址信号、列地址信号,然后先后宣布行地址信号、列地址信号,逻辑BANK挑选信号在宣布行地址信号的一起宣布,并保持到列地址 信号完毕;找到了存储单元后,被选中的芯片就要进行一致的数据传输了。
二、存储操控器的寄存器:
★BWSCON(Bus width & wait status control register,总线位宽和等候状况操控寄存器):此寄存器用于装备BANK0~BANK7的位宽和状况操控,每个BANK用4位来装备,别离是:
● ST(发动/制止SDRAM的数据掩码引脚。关于SDRAM,此方位0;关于SRAM,此方位1)
● WS(是否运用存储器的WAIT信号,一般置0为不运用)
● DW(两位,设置位宽。此板子的SDRAM是32位,故将DW6设为10)
特 殊的是bit[2:1],即DW0,设置BANK0的位宽,由板上的跳线决议,只读的。其实只需将BANK6对应的4位设为0010即可,在此处 BWSCON先设置为0x02000000。SDRAM接BANK6对应的[27:24]位,一起留意BANK0比较特别,如下图所示:
'700')this.width='700';if(this.offsetHeight>'700')this.height='700';" src="http://www.arm79.com/attachment/Mon_1005/73_67_39515ea9d909f2c.jpg" onclick="if(this.width>=700) window.open('http://www.arm79.com/attachment/Mon_1005/73_67_39515ea9d909f2c.jpg');" border="0" width="700">
'700')this.width='700';if(this.offsetHeight>'700')this.height='700';" src="http://www.arm79.com/attachment/Mon_1005/73_67_03cf877c1a65f25.jpg" onclick="if(this.width>=700) window.open('http://www.arm79.com/attachment/Mon_1005/73_67_03cf877c1a65f25.jpg');" border="0" width="700">
★BANKCON0~BANKCON7: 用来别离装备8个BANK的时序等参数。SDRAM是映射到BANK6和BANK7上的(内存只能映射到这两个BANK,详细映射多大的空间,可用 BANKSIZE寄存器设置),所以只需参照SDRAM芯片的Datasheet装备好BANK6和BANK7,BANKCON0~BANKCON5运用 默认值0x00000700即可。关于BANKCON6和BANKCON7中的各个位的描绘:
●MT(bit[16:15]):设置本BANK映射的物理内存是SRAM仍是SDRAM,后边的低位就依据此MT的挑选而分隔设置。本板子应置0b11,所以只需求再设置下面两个参数
●Trcd(bit[3:2]):RAS to CAS delay(00=2 clocks,01=3 clocks,10=4 clocks),推2410手册上的荐值是0b01。咱们PC的BIOS里也能够调理的,应该玩过吧。
●SCAN(bit[1:0]):Column address number(00 = 8-bit,01 = 9-bit,10= 10-bit),SDRAM列地址位数。查阅K4S561632芯片手册得知此值是9,所以SCAN=0b01。假如运用其他类型的SDRAM,您需求查 看它的数据手册来决议SCAN的取值:00-8位、01-9位、10-10位。归纳以上各值,BANKCON6~BANKCON7设为 0x00018005。
★REFRESH(改写操控寄存器):此寄存器的bit[23:11]可参阅默认值,或自己依据经历修正,这儿用 0x008e0000,关键是最终的Refresh Counter(简称R_CNT,bit[10:0])的设置,2410手册上给出了公式计算方法。SDRAM手册上“8192 refresh cycles/64ms”的描绘,得到改写周期为64ms/8192=7.8125us,结合公式,R_CNT=2^11 + 1 – 12 * 7.8125 = 1955。所以可得REFRESH=0x008e0000+1995=0x008e07a3。
●Trp([21:20]):设置为0即可。
●Tsrc([19:18]):设置默认值即可。
★BANKSIZE: 设置SDRAM的一些参数。位[7]=1:Enable burst operation(0=ARM核制止突发传输,1=ARM核支撑突发传输);位[5]=1:SDRAM power down mode enable(0=不运用SCKE信号令SDRAM进入省电形式,1=运用SCKE信号令SDRAM进入省电形式);位[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。可是BANK6-7的开始地址是可变的,您能够从S3C2410数据手 册第5章"Table 5-1. BANK6-7 Addresses"中了解到BANK6-7的地址规模与地址空间的联系。本开发板仅运用BANK6的64M空间,其间 BK76MAP(bit[2:0])装备BANK6/7映射的巨细,可设置为010 = 128MB/128MB或001 = 64MB/64MB,只要比实践RAM大都行,多出来的空间程序会检测出来,不会产生运用不存在的内存的状况(Bootloader和Linux内核都会 作内存检测)。BANKSIZE=0x000000b2。
★MRSRB6、MRSRB7(Mode register set register BANK6/7,SDRAM形式设置寄存器):能够修正的只要CL[6:4](CAS latency,000 = 1 clock, 010 = 2 clocks, 011=3 clocks),其他的悉数是固定的(fixed),故值为0x00000030。SDRAM 不支撑CL=1的状况,所以位[6:4]取值为010(CL=2)或011(CL=3),开发板保存的值为0b11。
至此,13个存储操控器的寄存器悉数介绍完了,下面就能够装备各寄存器的值,完结SDRAM初始化,完成代码仿制到SDRAM中履行的操作(注:相同的程序速度要比片内SRAM运转的慢)。
存储操控器13个寄存器的设置值:
mem_cfg_val:
.long 0x02000000 @BWSCON;此处只用到BANK6对应的[27:24],其它位没理睬,想理论上应该能够?
.long 0x00000700 @BANKCON0;BANKCON0~BANKCON5没用到,运用默认值0x00000700
.long 0x00000700 @BANKCON1
.long 0x00000700 @BANKCON2
.long 0x00000700 @BANKCON3
.long 0x00000700 @BANKCON4
.long 0x00000700 @BANKCON5
.long 0x00018005 @BANKCON6
.long 0x00018005 @BANKCON7
.long 0x008e07a3 @REFRESH
.long 0x000000b1 @BANKSIZE
.long 0x00000030 @MRSRB6
.long 0x00000030 @MRSRB7
汇编进程首要代码:
.equ MEM_CTL_BASE, 0x48000000 @ 界说存储操控器寄存器基址
.equ SDRAM_BASE, 0x30000000 @ 界说SDRAM开始地址
.text
.global _start
_start:
bl disable_watch_dog @ 去关门喂狗
bl mem_control_setup @ 去设置存储操控器
bl copy_steppingstone_to_sdram @ 仿制代码到SDRAM中
ldr pc, =on_sdram @ 跳到SDRAM中持续履行
on_sdram:
ldr sp, =0x34000000 @ 设置仓库,履行C点灯代码
bl main
halt_loop:
b halt_loop