您的位置:首页 > 其它

基于SDRAM的存储管理器使用

2015-04-24 17:11 169 查看
存储管理器:管理CPU跳到哪个地址

CPU运行程序会从0地址开始,通过存储管理器可以让让CPU跳到外设

RAM 内存

因为存储管理器内部有8个Bank,所以最多可以接8个外设,每个Bank最大可以接128M,因为有27跟线(27*1024*1024)

比如读存储管理器的地址0X30000000,CPU通过对0X30000000进行访问

MOV R1 #0X30000000

ldr
R0 [R1]

访问一个芯片需要的事情

1.地址

2.数据线(线宽)

3.时钟频率

4.芯片相关特性(根据芯片手册)

首先配置存储管理器

BWSCON
位宽和等待寄存器 设置位宽和存储器的WAIT信号

BANKCONX
BANK控制寄存器 设置使用的是ROM/SRAM还是SDRAM外设,对于SDRAM外设,还应该设置列地址位数

REFESH
刷新控制寄存器 设置刷新功能的相关配置

BANKSIZE
设置工作模式和BANKSIZE

MRSRBX
SDRAM模式设置寄存器

eg:

使用了SDRAM,所以硬件初始化中不但要管看门狗,初始化时钟也要初始化SDRAM

sp的指向也不是默认的,也需要变更

@*************************************************************************

@ File:head.S

@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行

@*************************************************************************

.equ MEM_CTL_BASE, 0x48000000

.equ SDRAM_BASE, 0x30000000

.text

.global _start

_start:

bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启

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:

@ 往WATCHDOG寄存器写0即可

mov r1, #0x53000000

mov r2, #0x0

str r2, [r1]

mov pc, lr @ 返回

copy_steppingstone_to_sdram:

@ 将Steppingstone的4K数据全部复制到SDRAM中去

@ Steppingstone起始地址为0x00000000,SDRAM中起始地址为0x30000000



mov r1, #0 //将0写入r1中

ldr r2, =SDRAM_BASE //将SDRAM_BASE(SDRAM的起始地址)这个符号放入r2中

mov r3, #4*1024 //将4096写入r3中

1:

ldr r4, [r1],#4 @ 从Steppingstone读取4字节的数据,并让源地址加4
将ri+4地址的内容存到r4

str r4, [r2],#4 @ 将此4字节的数据复制到SDRAM中,并让目地地址加4
将r4的值存放在r2+4所指定的地址

cmp r1, r3 @ 判断是否完成:源地址等于Steppingstone的未地址?
判断是否完成

bne 1b @ 若没有复制完,继续

mov pc, lr @ 返回

memsetup:

@ 设置存储控制器以便使用SDRAM等外设

mov r1, #MEM_CTL_BASE @ 存储控制器的13个寄存器的开始地址
将13个寄存器的地址写入r1中

adrl r2, mem_cfg_val @ 这13个值的起始存储地址

add r3, r1, #52 @ 13*4 = 54

1:

ldr r4, [r2], #4 @ 读取设置值,并让r2加4
将r2+4地址中的内容存到r4中 并让r2=r2+4 就是将寄存器进行配置的值写入中间数r2中(类似数组)

str r4, [r1], #4 @ 将此值写入寄存器,并让r1加4
将r4的值放在r1+4所制定的地址 并让r1=r1+4 就是寄存器移到下一位

cmp r1, r3 @ 判断是否设置完所有13个寄存器

bne 1b @ 若没有写成,继续

mov pc, lr @ 返回

.align 4

mem_cfg_val:

@ 存储控制器13个寄存器的设置值

.long 0x22011110 @ BWSCON

.long 0x00000700 @ BANKCON0

.long 0x00000700 @ BANKCON1

.long 0x00000700 @ BANKCON2

.long 0x00000700 @ BANKCON3

.long 0x00000700 @ BANKCON4

.long 0x00000700 @ BANKCON5

.long 0x00018005 @ BANKCON6

.long 0x00018005 @ BANKCON7

.long 0x008C07A3 @ REFRESH

.long 0x000000B1 @ BANKSIZE

.long 0x00000030 @ MRSRB6

.long 0x00000030 @ MRSRB7

为了保险起见,所有的寄存器都进行了配置

程序运行:

从NAND

在makefile中指定了起始地址

arm-linux-ld -Ttext 0x30000000 head.o leds.o -o sdram_elf

指定了程序的起始地址为0X30000000

把程序从性能更好的内部SRAM移到外部的SDRAM中去,是否多此一举

内部的SRAM只有4KB,如果程序大于4KB,就不能完全利用内部的SRAM来运行了,要将存储在NAND Flash 的代码复制到SDRAM中去,对于NAND Flash中的前4KB,芯片自动把它复制到SRAM中,在复制到SDRAM中,要复制4KB后面的代码就要使用NAND Flash 控制器来读取NAND Flash.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: