几天前看初始化SDRAM代码时觉得比较困难,首要是由于之前没有触摸过这方面,毫无经历,现在看来不难,费事在需求依据datasheet进行设置,好在是移植,许多强者的文章可参阅。自己很简单忘事,就记录下来吧。
我的板子是sbc2410,运用两片容量为32MB、位宽16bit的HY57V561620CT-H芯片拼成容量为64M、32bit的SDRAM存储器。依据2410datasheet,要运用SDRAM需装备13个寄存器,以下逐一来看:
BWSCON:Bus width & wait status control register总线位宽和等候状况操控寄存器。
此寄存器用于装备BANK0 – BANK7的位宽和状况操控,每个BANK用4位来装备,别离是:
● ST(发动/制止SDRAM的数据掩码引脚。关于SDRAM,此方位0;关于SRAM,此方位1)
● DWSDRAM是32位,故将DW6设为10)
特别的是bit[2:1],即DW0,设置BANK0的位宽,又板上的跳线决议,只读的。我这板子BWSCON可设置为0x22111110。其实只需将BANK6对应的4位设为0010即可。
用来别离装备8个BANK的时序等参数。SDRAM是映射到BANK6和BANK7上的(内存只能映射到这两个BANK,详细映射多大的空间,可用BANKSIZE寄存器设置),所以只需参照SDRAM芯片的datasheet装备好BANK6和BANK7,BANKCON0 – BANKCON5运用默认值0x00000700即可。
(1)MT(bit[16:15]):设置本BANK映射的物理内存是SRAM仍是SDRAM,后边的低位就依据此MT的挑选而分隔设置。本板子应置0b11,所以只需求再设置下面两个参数
(2)Trcd(bit[3:2]):RAS to CAS delay(00=2 clocks,01=3 clocks,10=4 clocks),推2410手册上的荐值是0b01。咱们PC的BIOS里也能够调理的,应该玩过吧。
(3)SCAN(bit[1:0]):Column address number(00 = 8-bit,01 = 9-bit,10= 10-bit),SDRAM列地址位数。查阅HY57V561620CT-H芯片手册得知此值是9,所以。
此寄存器的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。
BANKSIZE:设置SDRAM的一些参数。其间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
能够修正的只要CL[6:4](CAS latency,000 = 1 clock, 010 = 2 clocks, 011=3 clocks),其他的悉数是固定的(fixed),故值为0x00000030。这个CAS在BIOS中应该也设置过吧,对PC的速度提高很明显哦J
至此,13个寄存器悉数装备好了,下面就能够把代码复制到SDRAM中执行了,相同的程序速度要比片内SRAM运转的慢不少。