您的位置 首页 国产IC

S3C2410 SDRAM寄存器初始化设置

几天前看初始化SDRAM代码时觉得比较困难,主要是因为之前没有接触过这方面,毫无经验,现在看来不难,麻烦在需要根据datasheet进行设置,好

几天前看初始化SDRAM代码时觉得比较困难,首要是因为之前没有触摸过这方面,毫无经历,现在看来不难,费事在需求依据datasheet进行设置,好在是移植,许多强者的文章可参阅。自己很简单忘事,就记录下来吧。

我的板子是s3c2410,运用两片容量为32MB、位宽16bit的HY57V561620CT-H芯片拼成容量为64M、32bit的SDRAM存储器。依据2410datasheet,要运用SDRAM需装备13个寄存器,以下逐一来看:

1、 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的位宽,又板上的跳线决议,只读的。我这板子BWSCON可设置为0x22111110。其实只需将BANK6对应的4位设为0010即可。

2、 BANKCON0 – BANKCON7

用来别离装备8个BANK的时序等参数。SDRAM是映射到BANK6和BANK7上的(内存只能映射到这两个BANK,详细映射多大的空间,可用BANKSIZE寄存器设置),所以只需参照SDRAM芯片的datasheet装备好BANK6和BANK7,BANKCON0 – BANKCON5运用默认值0x00000700即可。

关于BANKCON6和BANKCON7中的各个位的描绘:

(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,所以SCAN=0b01。

归纳以上各值,BANKCON6 – 7设为0x00018005。

3、 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。

4、 BANKSIZE:设置SDRAM的一些参数。其间BK76MAP(bit[2:0])装备BANK6/7映射的巨细,可设置为010 = 128MB/128MB或001 = 64MB/64MB,只要比实践RAM大都行,因为bootloader和linux内核都能够检测可用空间的。BANKSIZE=0x000000b2。

5、 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运转的慢不少。

————————————————————

1。关于CPU和SDRAM的硬件衔接参阅s3c2410datasheet的“MEMORY (SROM/SDRAM) ADDRESS PIN CONNECTIONS”能够得知,那么仿制4K今后的代码需求运用NANDFLASH操控器来读取NANDFLASH,今后的试验中将罗列,本试验系统发动后将NANDFLASH开端的4K数据仿制到SRAM中,然后跳转到0地址开端履行,然后初始化存储操控器,把程序自身从SRAM中仿制到SDRAM中,最终跳转到SDRAM中运转,程序的标号:on_sdram,这个地址在衔接程序时被确定为30000010,这个是SDRAM的地址,经过ldr pc,on_sdram,程序就能够跳转到SDRAM去了。那么on_sdram的值为什么等于31000010呢?原因在于Makefile中衔接程序的指令为arm-softfloat-linux-gnu-ld -Ttext 30000000 head_yoyo.o leds_yoyo.o -o sdram_elf,意思便是代码段的开始地址为30000000,即程序的第一条指令( bl disable_watchdog)的衔接地址为30000000,其他类推,其程序标号为on_sdram的值为30000010,尽管 bl disable_watchdog,bl memsetup, bl copy_steppingstone_to_sdram,的衔接地址都在SDRAM中,可是因为他们都是方位无关的相对跳转指令,所以能够在SRAM中运转。

@**********************************************************
2 @ File : head_yoyo.S
3 @ 功用 : 设置SDRAM,将程序仿制到SDRAM中,并跳转到SDRAM中运转
4 @**********************************************************
5
6 .equ MEM_CTL_BASE, 0x48000000
7 .equ SDRAM_BASE, 0x30000000
8 .text
9 .global _start
10 _start:
11 bl disable_watchdog @封闭看门狗,不然CPU不断重启
12 bl memsetup @初始化SDRAM操控器
13 bl copy_steppingstone_to_sdram @仿制代码到SDRAM
14 ldr pc,=on_sdram
15
16
17 @*********************************************************
18 @ 子函数阐明:跳转到SDRAM中运转
19 @*********************************************************
20
21 on_sdram:
22 ldr sp,=0x34000000 @设置栈,因为栈是向下增加,实践的运用为0x340 00000-4(栈在运用之前要减4)
bl main @跳转到C言语
24
25
26 halt_loop:
27 b halt_loop @死循环
28
29 @*********************************************************
30 @ 子函数阐明:封闭看门狗
31 @*********************************************************
32
33 disable_watchdog:
34 ldr r0,=0x53000000
35 mov r1,#0x0
36 str r1,[r0]
37 mov pc,lr
38
39 @*********************************************************
40 @子函数阐明:初始化内存操控器
41 @*********************************************************
42
43 memsetup:
mov r1,#MEM_CTL_BASE
45 adrl r2,mem_cfg_val
46 add r3,r1,#52
47 1:
48 ldr r4,[r2],#4 @将地址为R2的内存单元数据读取到R4中,然后r2=r2 +4
49 str r4,[r1],#4 @将r4的数据写入到r1的内存单元,然后r1=r1+4
50 cmp r1,r3 @比较R1,R3是否设置完一切的13个寄存器。
51 bne 1b @假如没有仿制完,就持续
52 mov pc,lr @仿制完后回来,b指令则不可。差异bl。
53
54
55 @*****************************************************************
56 @子函数阐明:仿制代码到SDRAM,将SRAM中的4K数据悉数仿制到SDRAM,
57 @ SRAM开始地址为0x00000000,SDRAM的开始地址为0x30000000
58 @*****************************************************************
59
60 copy_steppingstone_to_sdram:
61 mov r1,#0 @设置R1为SRAM的开始地址为0x00000000
62 ldr r2,=SDRAM_BASE @设置R2为SDRAM的开始地址为0设置R1为0X300 00000
63 mov r3 ,#4*1024 @设置R3为4K
1:
65 ldr r4,[r1],#4 @从SRAM中读取4字节的数据到R4中,然后r1=r 1+4
66 str r4,[r2],#4 @将r4中的4字节数据仿制到SDRAM中,然后r2= r2+4
67 cmp r1,r3 @判别是否完结:SRAM的地址是否等于末地址>
68 bne 1b @若没有完结,持续仿制
69 mov pc,lr @回来
70
71 .align 4
72
73 @******************************************************
74 @存储操控器13个寄存器的设置值
75 @******************************************************
76 mem_cfg_val:
77 .long 0x22011110 @BWSCON :
78 .long 0x00000700 @BANKCON0
79 .long 0x00000700 @BANKCON1
80 .long 0x00000700 @BANKCON2
81 .long 0x00000700 @BANKCON3
82 .long 0x00000700 @BANKCON4
.long 0x00000700 @BANKCON5
84 .long 0x00018005 @BANKCON6
85 .long 0x00018005 @BANKCON7
86 .long 0x008e07a3 @REFRESH
87 .long 0x000000b1 @BANKSIZE
88 .long 0x00000030 @MRSRB6
89 .long 0x00000030 @MRSRB7
阐明:
BWSCON:对应BANK0-BANK7,每BANK运用4位。这4位别离表明:
a.STx:发动/制止SDRAM的数据掩码引脚,关于SDRAM,此位为0;关于SRAM,此位为1。有原理图可知Not using UB/LB (The pins are dedicated nWBE[3:0])。
b.WSx:是否运用存储器的WAIT信号,一般设为0
c.DWx:运用两位来设置存储器的位宽:00-8位,01-16位,10-32位,11-保存。
d.比较特别的是BANK0对应的4位,它们由硬件跳线决议,只读。
关于本开发板,运用两片容量为32Mbyte、位宽为16的SDRAM组成容量为64Mbyte、位宽为32的存储器,所以其BWSCON相应位为: 0010。关于本开发板,BWSCON可设为0x22111110:其实咱们只需求将BANK6对应的4位设为0010即可,其它的是什么值没什么影响,这个值是参阅手册上给出的。

BANKCON0-BANKCON5:咱们没用到,运用默认值0x00000700;

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(00=2 clocks,01=3 clocks,10=4 clocks),因为运用的是HY57V561620(L)T-H,检查其手册详细在“DEVICE OPERATING OPTION TABLE”,在100M的作业频率下的推荐值为3clocks,所以设为推荐值0b01。
SCAN([1:0]):SDRAM的列地址位数,(00 = 8-bit,01 = 9-bit,10= 10-bit)关于本开发板运用的SDRAM HY57V561620(L)T-H(Column Address : CA0 ~ CA8),列地址位数为9,所以SCAN=0b01。
假如运用其他类型的SDRAM,您需求检查它的数据手册来决议SCAN的取值:00-8位,01-9位,10-10位.

REFRESH:设为0x008e0000+ R_CNT 其间R_CNT用于操控SDRAM的改写周期,占用REFRESH寄存器的[10:0]位,它的取值可如下核算(SDRAM时钟频率便是HCLK):
R_CNT = 2^11 + 1 – SDRAM时钟频率(MHz) * SDRAM改写周期(uS)
在未运用PLL时,SDRAM时钟频率等于晶振频率12MHz;
SDRAM 的改写周期在SDRAM的数据手册上有标明,在本开发板运用的SDRAM HY57V561620(L)-H的数据手册上,可看见这么一行“8192 refresh cycles / 64ms”:所以,改写周期=64ms/8192 = 7.8125 uS。
关于本试验,R_CNT = 2^11 + 1 – 12 * 7.8125 = 1955, REFRESH=0x008e0000 + 1955 = 0x008e07a3
Trp([21:20]):设置为0即可
Tsrc([19:18]):设置默认值即可。

BANKSIZE:
位[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。可是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]没有运用。

MRSRBx:
能让咱们修正的只要位[6:4](CL=CAS latency,检查SDRAM的DATASHEET)这是SDRAM时序的一个时间参数,SDRAM 不支撑CL=1的状况,所以位[6:4]取值为010(CL=2)或011(CL=3)。开发板保存的值为0b11。

NOTE:
In Power_OFF mode, SDRAM has to enter SDRAM self-refresh mode.

1
18
19 #define rGPFCON (*(volatile unsigned long *)0x56000050)
20 #define rGPFDAT (*(volatile unsigned long *)0x56000054)

#define GPF4_OUTP (0x01<<8)
23 #define GPF5_OUTP (0x01<<10)
24 #define GPF6_OUTP (0x01<<12)
25 #define GPF7_OUTP (0x01<<14)
26
27 void wait(unsigned long time)
28 {
29 for(;time>0;time–);
30 }
31
32 int main()
33 {
34
35 rGPFCON = GPF4_OUTP|GPF5_OUTP|GPF6_OUTP|GPF7_OUTP;
36
37 while(1)
38 {
39 wait(30000);
40 rGPFDAT = (~1<<4);
41 wait(30000);
42 rGPFDAT = (~1<<5);
43 wait(30000);
44 rGPFDAT = (~1<<6);
45 wait(30000);
46 rGPFDAT = (~1<<7);
47
48 }
49 }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/ic/259686.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部