基于SDRAM的存储管理器使用
来源:互联网 发布:获取php源码 编辑:程序博客网 时间:2024/06/16 19:12
存储管理器:管理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.
- 基于SDRAM的存储管理器使用
- ARM底层学习笔记-存储管理器及sdram的使用
- JZ2440存储管理器代码实现(使用SDRAM)
- 基于STM32F429的SDRAM使用
- ARM裸机程序之存储管理器控制SDRAM
- ARM裸机程序之存储管理器控制SDRAM
- 基于FPGA的SDRAM设计——SDRAM的初始化
- 存储-SDRAM
- Unity3D基于帧管理器的移动管理器
- 基于XULRunner的Sqlite管理器
- 基于XULRunner的Sqlite管理器
- 存储控制器SDRAM实验
- 存储控制器--SDRAM
- 基于S3C2440A+SDRAM(K4M51163)
- 基于S3C2440A+SDRAM(K4M51163)
- 3.使用基于内存的用户存储
- 基于Verilog的SDRAM控制器----修改后的版本
- [攻克存储] 掌握SDRAM/DDR的结构与寻址
- android-三星手机地图不能显示问题
- MySQL 查询结果为乱码
- 深入理解java的异常处理机制
- P122 第三章 17题 求十个数的数组的平均值
- linux命令之ldd
- 基于SDRAM的存储管理器使用
- 深入Protobuf源码-编码实现
- 微信sdk注册失败
- 深入Protobuf源码-Descriptor、Message、RPC框架
- 应用框架优化方案
- hdu 1087 最大上升子序列
- linux内存操作--ioremap和mmap学习笔记
- HDU ACM 1203 I NEED A OFFER!->背包问题
- 开发中最常用的GitHub上 优秀的 Android 开源项目整理(精品)