基于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.
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.
相关文章推荐
- ARM底层学习笔记-存储管理器及sdram的使用
- 基于PowerShell的Lync Server管理 使用C#
- 基于PowerShell的Lync Server管理 使用C# 之 Telephony 功能 查看 /修改
- Android使用笔记--存储空间管理
- 基于数据存储管理的带有头尾指针的双向链表创建实例
- 使用python管理百度云存储
- 使用curses管理基于文本的屏幕--(一)
- 使用curses管理基于文本的屏幕--(二)
- 使用curses管理基于文本的屏幕--(三)
- 使用curses管理基于文本的屏幕--(四)
- 使用curses管理基于文本的屏幕--(五)
- 使用curses管理基于文本的屏幕--(六)
- 使用curses管理基于文本的屏幕--(七)
- 使用curses管理基于文本的屏幕--(八)
- Subversion 基于 Apache 使用时用户权限的管理
- IBM FASTT StorageManager的使用(DS4000系列存储管理软件)
- 基于Exchange2007平台--管理存储组和邮箱数据库
- 在 CCR 环境中使用 Exchange 命令行管理程序移动存储组和数据库
- 学生信息管理系统V0.2(使用文件存储数据)【MVC模式、DAO模式、Factory模式】
- 使用ConVirt管理基于KVM的虚拟机 – 安装篇