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

2019-07-12 16:04发布

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