S3C2440学习笔记存储控制器文档格式.docx
《S3C2440学习笔记存储控制器文档格式.docx》由会员分享,可在线阅读,更多相关《S3C2440学习笔记存储控制器文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
MT[16:
15]:
设置BANK外接ROM/SRAM还是SDRAM,00=ROM/SRAM,01=保留,10=保留,11=SDRAM
MT=0b00时,与BANKCON0-BANKCON5类似
MT=0b11时,
Trcd[3:
2]:
RAStoCASdelay,设为推荐值0b01
SCAN[1:
0]:
SDRAM的列地址数,本开发板使用的SDRAM列地址数为9,0b00=8位,0b01=9位,0b10=10位
所以本开发板,BANKCON6/7均设为0x00018005
4)刷新控制寄存器REFRESH
REFEN[23]:
0=禁止SDRAM的刷新功能,1=开启SDRAM的刷新功能
TREFMD[22]:
SDRAM的刷新模式,0=CBR/AutoRefresh,1=SelfRefresh
Trp[21:
20]:
SDRAMRAS预充电时间00=2clocks,01=3clocks,10=4clocks,11=不支持
Tsrc[19:
18]:
SDRAM半行周期时间00=4clocks,01=5clocks,10=6clocks,11=7clocks,SDRAM行周期时间Trc=Tsrc+Trp
RefreshCounter[10:
SDRAM刷新计数,刷新时间=(2^11+1-refresh_count)/HCLK,在未使用PLL时,HCLK=晶振频率12MHz,刷新周期为7.8125us
refresh_count=2^11+1-12*7.8125=1955
REFRESH=0x008C0000+1955=0x008C07A3
5)BANKSIZE寄存器
BURST_EN[7]:
0=ARM核禁止突发传输,1=ARM核支持突发传输
SCKE_EN[5]:
0=不使用SCKE信号令SDRAM进入省电模式,1=使用SCKE信号令SDRAM进入省电模式
SCLK_EN[4]:
0=时刻发出SCLK信号,1=仅在方位SDRAM期间发出SCLK信号
BK76MAP[2:
设置BANK6/7的大小,0b010=128MB/128MB,0b001=64MB/64MB,0b000=32M/32M,0b111=16M/16M,0b110=8M/8M,0b101=4M/4M,0b100=2M/2M
本开发板外接64MB的SDRAM
则本开发板BANKSIZE设为0xB1
6)SDRAM模式设置寄存器MRSRBx(x为6-7)
CL[6:
4]:
0b000=1clocks,0b010=2clocks,0b011=3clocks
本开发板取0b011,所以MRSRB6/7取值为0x30
二、存储控制器操作实例:
使用SDRAM
从NANDFlash启动CPU时,CPU会通过内部的硬件将NANDFlash开始的4KB数据复制到成为"
Steppingstone"
的4KB的内部RAM(起始地址为0)中,然后跳到地址0开始执行。
本程序先设置好存储控制器,使外接的SDRAM可用,然后把程序本身从steppingstone复制到SDRAM中,最后跳到SDRAM中执行
head.S:
1.@*************************************************************************
2.
3.@
File:
head.S
4.
5.@
功能:
设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
6.
7.@*************************************************************************
8.
9.
10..equ
MEM_CTL_BASE,
0x48000000
@存储控制器寄存器基址
11..equ
SDRAM_BASE,
0x30000000
@SDRAM起始地址
12.
13..text
14..global
_start
15.
16._start:
17.
18.
bl
disable_watch_dog
@
关闭WATCHDOG,否则CPU会不断重启
19.
20.
memsetup
设置存储控制器
21.
22.
copy_steppingstone_to_sdram
复制代码到SDRAM中
23.
24.
ldr
pc,
=on_sdram
跳到SDRAM中继续执行
25.
26.on_sdram:
27.
28.
sp,
=0x34000000
设置堆栈
29.
30.
main
31.
32.halt_loop:
33.
34.
b
halt_loop
35.
36.disable_watch_dog:
37.
38.
往WATCHDOG寄存器写0即可
39.
40.
mov
r1,
#0x53000000
41.
42.
r2,
#0x0
43.
44.
str
[r1]
45.
46.
lr
返回
47.
48.
49.copy_steppingstone_to_sdram:
50.
51.
将Steppingstone的4K数据全部复制到SDRAM中去
52.
53.
Steppingstone起始地址为0x00000000,SDRAM中起始地址为0x30000000
54.
55.
56.
#0
57.
58.
=SDRAM_BASE
59.
60.
r3,
#4*1024
61.
62.1:
63.
64.
r4,
[r1],#4
从Steppingstone读取4字节的数据,并让源地址加4
65.
66.
[r2],#4
将此4字节的数据复制到SDRAM中,并让目地地址加4
67.
68.
cmp
r3
判断是否完成:
源地址等于Steppingstone的未地址?
69.
70.
bne
1b
若没有复制完,继续
71.
72.
73.
74.
75.memsetup:
76.
77.
设置存储控制器以便使用SDRAM等外设
78.
79.
80.
#MEM_CTL_BASE
存储控制器的13个寄存器的开始地址
81.
82.
adrl
mem_cfg_val
这13个值的起始存储地址
83.
84.
add
#52
13*4
=
54
85.
86.1:
87.
88.
[r2],
#4
读取设置值,并让r2加4
89.
90.
[r1],
将此值写入存储控制寄存器,并让r1加4
91.
92.
判断是否设置完所有13个寄存器
93.
94.
若没有写成,继续
95.
96.
97.
98.
99.
100..align
4
101.
102.mem_cfg_val:
103.
104.
存储控制器13个寄存器的设置值
105.
106.
.long
0x22011110
BWSCON
107.
108.
0x00000700
BANKCON0
109.
110.
BANKCON1
111.
112.
BANKCON2
113.
114.
BANKCON3
115.
116.
BANKCON4
117.
118.
BANKCON5
119.
120.
0x00018005
BANKCON6
121.
122.
BANKCON7
123.
124.
0x008C07A3
REFRESH
125.
126.
0x000000B1
BANKSIZE
127.
128.
0x00000030
MRSRB6
129.
130.
MRSRB7
leds.c
1.#define
GPBCON
(*(volatile
unsigned
long
*)0x56000010)
2.#define
GPBDAT
*)0x56000014)
3.
5.#define
GPB5_out
(1<
<
(5*2))
6.#define
GPB6_out
(6*2))
7.#define
GPB7_out
(7*2))
8.#define
GPB8_out
(8*2))
10.void
wait(unsigned
dly)
11.{
13.for(;
dly
>
0;
dly--);
14.
15.}
16.
17.int
main(void)
18.{
20.unsigned
i
22.GPBCON
GPB5_out|GPB6_out|GPB7_out|GPB8_out;
//
将LED1-4对应的GPB5/6/7/8四个引脚设为输出
24.while
(1){
26.wait(30000);
28.GPBDAT
(~(i<
5));
根据i的值,点亮LED1-4,实现流水灯
30.if(++i
==
16)
32.i
34.}
35.return
36.
37.}
最后是Makefile
sdram.bin:
head.S
leds.c
arm-linux-gcc
-c-ohead.ohead.S
arm-linux-gcc-c-oleds.oleds.c
arm-linux-ld-Ttext0x30000000head.oleds.o-osdram_elf
arm-linux-objcopy-Obinary-Ssdram_elfsdram.bin
arm-linux-objdump-D-marm
sdram_elf>
sdram.dis
clean:
rm-f
sdram.dissdram.binsdram_elf*.o
分别汇编head.S和leds.c
连接leds.o和head.o,指定代码段起始地址0x30000000(SDRAM首地址)
最后转换ELF为二进制,导出汇编代码