S3C2440学习笔记存储控制器文档格式.docx

上传人:b****5 文档编号:20470788 上传时间:2023-01-23 格式:DOCX 页数:12 大小:367.44KB
下载 相关 举报
S3C2440学习笔记存储控制器文档格式.docx_第1页
第1页 / 共12页
S3C2440学习笔记存储控制器文档格式.docx_第2页
第2页 / 共12页
S3C2440学习笔记存储控制器文档格式.docx_第3页
第3页 / 共12页
S3C2440学习笔记存储控制器文档格式.docx_第4页
第4页 / 共12页
S3C2440学习笔记存储控制器文档格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

S3C2440学习笔记存储控制器文档格式.docx

《S3C2440学习笔记存储控制器文档格式.docx》由会员分享,可在线阅读,更多相关《S3C2440学习笔记存储控制器文档格式.docx(12页珍藏版)》请在冰豆网上搜索。

S3C2440学习笔记存储控制器文档格式.docx

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. 

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 

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 

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为二进制,导出汇编代码

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 文学研究

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1