【嵌入式Linux+ARM】存储控制器(操作SDRAM)

1.存储控制器介绍

    s3c2440中的“存储管理器”提供了访问外部设备所需要的信号,有如下特性:

    1.支持小字节序、大字节序(通过软件选择)

    2.每个BANK为128M,一共有8个BANK,共1G

    3.BANK0~BANK5可以支持外接ROM、SRAM等,BANK6~BANK7除可以支持ROM、SRAM外 还支持SDRAM

    4.BANK0~BANK7的起始地址是固定的

    5.外接SDRAM时,支持自刷新和省电模式


    s3c2440上有ADDR0~ADDR26访问范围只有128M,如何达到上面的1G,通过对外引出的8跟片选信号nGCS0-nGCS7,对应于BANK0~BANK7。片选信号输出低电平可以选中相应的外接设备。

技术分享



2.实验代码

本实验流程:

禁止看门狗—>nand flash中前4k字节复制到芯片内部SRAM中执行—>通过存储控制器初始化外接的SDRAM—>复制代码到SDRAM中—>跳转到SDRAM中执行。

下面是需要配置存储控制器的相关寄存器,需要看手册:

0x22011110,     //BWSCON
0x00000700,     //BANKCON0
0x00000700,     //BANKCON1
0x00000700,     //BANKCON2
0x00000700,     //BANKCON3  
0x00000700,     //BANKCON4
0x00000700,     //BANKCON5
0x00018005,     //BANKCON6
0x00018005,     //BANKCON7
0x008C07A3,     //REFRESH
0x000000B1,     //BANKSIZE
0x00000030,     //MRSRB6
0x00000030,     //MRSRB7

head.S

.equ MEM_CTL_BASE, 0x48000000           //.euq A  B  就是A=B 等价于c语言的宏定义
.equ SDRAM_BASE,    0x30000000

.text
.global _start
_start:
	bl disable_watch_dog
	bl memsetup                     //设置存储控制器
	bl copy_steppingstone_to_sdram  //复制代码到SDRAM中
	ldr pc, =on_sdram               //跳到SDRAM中执行
on_sdram:
	ldr sp, =0x34000000             //设置栈
	bl main
halt_loop:
	b halt_loop

disable_watch_dog:
	mov r1, #0x53000000
	mov r2, #0x0
	str r2, [r1]                   //关闭看门狗
	mov pc, lr                     //返回

copy_steppingstone_to_sdram:
	mov r1, #0x0
	ldr r2, =SDRAM_BASE
	mov r3, #4*1024
1:
	ldr r4, [r1], #4
	str r4, [r2], #4
	cmp r1, r3
	bne 1b                        //bne b跳转 ne是not equal  表示如果不相等,跳到1出继续执行 注意1不是l。。。
	mov pc, lr

memsetup:
	mov r1, #MEM_CTL_BASE
	adrl r2, mem_cfg_val
	add r3, r1, #52
1:
	ldr r4, [r2], #4
	str r4, [r1], #4
	cmp r1, r3
	bne 1b
	mov pc, lr

.align 4
mem_cfg_val:                         //存储控制器中13个寄存器的值
	.long 0x22011110
	.long 0x00000700
	.long 0x00000700 
	.long 0x00000700
	.long 0x00000700
	.long 0x00000700
	.long 0x00000700
	.long 0x00018005
	.long 0x00018005
	.long 0x008C07A3
	.long 0x000000B1
	.long 0x00000030
	.long 0x00000030
	
Makefile
sdram.bin:head.S led.c
	arm-linux-gcc -c head.S -o head.o
	arm-linux-gcc -c led.c -o led.o
	arm-linux-ld -Ttext 0x30000000 head.o led.o -o sdram_elf
	arm-linux-objcopy -O binary -S sdram_elf sdram.bin
	arm-linux-objdump -D -m arm sdram_elf > sdram.dis

clean:
	rm -rf *.o *.bin *.dis *elf

测试时用的led.c,随意选择前面文章中的led点灯程序即可。


注:原创文章,转载请著名出处:http://blog.csdn.net/scottly1/article/details/38960751


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。