初入领悟:

1、 bank、L-bank的概念

2、 s3c2440内部管理SDRAM寄存器配置

Frist part:原理分析

S3c2440为32位微处理器,其可访问空间为4G;但其中提供1G外设访问空间,这1G空间有8个bank组成;及平均每个bank有128M的访问空间;其中8bank的特性为:

1、 bank0~bank5支持外接SRAM、ROM等,bank6、bank7支持外接SRAM、ROM与SDRAM等;

2、 bank0~bank6的起始地址是固定

3、 bank7的起始地址可编程设定

4、 bank6、bank7大小可编程确定

5、 每个bank访问周期均可编程设定

6、 外接SDRAM是支持自刷新与省电模式

S3c2440向外引出27根地址线,可实现128M的寻找空间;那他怎么实现1G的空间范围访问呢?这就涉及到了nGCSx片选信号,由控制这几根信号线实现bank的切换,如下图所示:

左边为nor flash下;右边为nand flash;

说到此又想起一概念,就是有关于nor flash与nand flash启动方式;

一、norflash启动

简而言之,既是nor flash启动模式下cpu启动会执行地址0x00000000的指令此指令在使能了nor flash下是就是nor flash的首地址;其中原因为nor flash支持一种名为XIP的执行机制;

二、nandflash启动

nand flash下不支持XIP因此在执行nandflash的程序是,系统将会把nandflash的头4K(最大)启动代码拷贝至系统SRAM中既s3c2440中的steppingstone;

我使用的是GT2440开发板从原理图中可知:

Bank6外接2片H57V2562GTR芯片;

在使用SDRAM时要设置到如下13个寄存器的操作:

各个寄存器值的设置参考开发板每一个bank所接的外设进行设置;

此设置参考示例程序:

    .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

(.long 汇编中词法,既long数据型)

Second part:程序编写

现在开始编写代码,如我上诉一样启动时CPU将会报前4K程序拷贝至steppingstone中运行;现在编写的代码任务为将steppingstone中的代码拷贝回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即可

movr1,     #0x53000000

movr2,     #0x0

strr2,     [r1]

movpc,     lr                      @返回

copy_steppingstone_to_sdram:

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

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

mov r1, #0

ldr r2,=SDRAM_BASE

mov r3,#4*1024

1:

ldr r4,[r1],#4     @ 从Steppingstone读取4字节的数据,并让源地址加4

str r4,[r2],#4     @ 将此4字节的数据复制到SDRAM中,并让目地地址加4

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

bne1b              @ 若没有复制完,继续

movpc,     lr      @ 返回

memsetup:

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

movr1,     #MEM_CTL_BASE       @ 存储控制器的13个寄存器的开始地址

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

addr3,     r1, #52             @ 13*4 = 54

1:

ldrr4,     [r2], #4            @ 读取设置值,并让r2加4

strr4,     [r1], #4            @ 将此值写入寄存器,并让r1加4

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

bne1b                          @ 若没有写成,继续

movpc,     lr                  @ 返回

.align 4                            @ARM地址指针对齐伪指令

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

C函数部分:

  1. #define GPFCON      (*(volatile unsigned long *)0x56000050)
  2. #define GPFDAT      (*(volatile unsigned long *)0x56000054)
  3. #define GPF4_out    (1<<(4*2))
  4. #define GPF5_out    (1<<(5*2))
  5. #define GPF6_out    (1<<(6*2))
  6. void  wait(volatile unsigned long dly)
  7. {
  8. for(; dly > 0; dly--);
  9. }
  10. int main(void)
  11. {
  12. unsigned long i = 0;
  13. GPFCON = GPF4_out|GPF5_out|GPF6_out;    // 将LED1,2,4对应的GPF4/5/
  14. //6三个引脚设为输出
  15. while(1) {
  16. wait(30000);
  17. GPFDAT = (~(i<<4));       // 根据i的值,点亮LED1,2,4
  18. if(++i == 8)
  19. i = 0;
  20. }
  21. return 0;
  22. }
#define	GPFCON		(*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054) #define GPF4_out (1<<(4*2))
#define GPF5_out (1<<(5*2))
#define GPF6_out (1<<(6*2)) void wait(volatile unsigned long dly)
{
for(; dly > 0; dly--);
} int main(void)
{
unsigned long i = 0; GPFCON = GPF4_out|GPF5_out|GPF6_out; // 将LED1,2,4对应的GPF4/5/
//6三个引脚设为输出
while(1) {
wait(30000);
GPFDAT = (~(i<<4)); // 根据i的值,点亮LED1,2,4
if(++i == 8)
i = 0;
}
return 0;
}

最后一步:Makefile

sdram.bin : head.S leds.c

arm-linux-gcc  -c -o head.o head.S

arm-linux-gcc -c -oleds.o leds.c

arm-linux-ld -Ttext0x30000000 head.o leds.o -o sdram_elf

arm-linux-objcopy -Obinary -S sdram_elf sdram.bin

arm-linux-objdump -D-m arm  sdram_elf > sdram.dis

clean:

rm-f   sdram.dis sdram.bin sdram_elf *.o

原理概念纯属个人见解,可能存在一定的不严谨性。

ARM--存储管理器的更多相关文章

  1. 二、存储管理器--SDRAM

    2.1 硬件结构 2.1.1 硬件框图 CPU 通过存储管理器来读取 SDRAM 网卡 等外部设备,CPU不管外部设备是怎么样的,只是读存储管理器中的地址 CPU从0x30000000地址读取数据. ...

  2. JZ2440存储管理器--SDRAM

     为了cpu访问外部设备,ARM提供一个存储管理器部件,提供访问外部设备的所需的信号(对SDRAM.网卡.nor等设备进行初始化,以便存储器管理器配合CPU进行与外设数据通讯).   CPU通常读写一 ...

  3. 微软Azure 存储管理器的简单介绍

    Windows Azure存储用户经常希望能够在“管理器”中查看他们的数据,管理器指的是一款可用于显示存储帐户数据的工具.我们之前提供了我们所知的存储管理器列表.在本文中,我们将对此列表进行更新,使其 ...

  4. Windows Azure 存储管理器 (2014)

     Windows Azure存储用户经常希望能够在"管理器"中查看他们的数据,管理器指的是一款可用于显示存储帐户数据的工具.我们之前提供了我们所知的存储管理器列表.在本文中,我 ...

  5. 1-16-2 LVM管理和ssm存储管理器使用&磁盘配额

    ssm存储管理器使用&磁盘配额 ssm存储管理器使用 系统存储管理器的使用 系统存储管理器(又称ssm,即system-storage-manager),是RHEL7/CentOS7新增的功能 ...

  6. 第十五章 LVM管理和ssm存储管理器使用 随堂笔记

    第十五章 LVM管理和ssm存储管理器使用 本节所讲内容: 15.1 LVM的工作原理 15.2 创建LVM的基本步骤 15.3 实战-使用SSM工具为公司的邮件服务器创建可动态扩容的存储池 LVM的 ...

  7. 存储管理器 S3C2440A

    CPU通过存储管理器来控制外部设备 SDRAM存储结构 S3C2440A内存控制器 原理图 HY57V561620(L)T 4Banks x 4M x 16Bit Synchronous DRAM S ...

  8. 1-18-2 LVM管理和ssm存储管理器使用&磁盘配额 (二)

    LVM管理和ssm存储管理器使用&磁盘配额  (二) 内容如下: ü  LVM快照 ü  ssm存储管理器的使用 ü  磁盘配额 第1章 LVM快照 lvm快照:为了保持系统的一致性,我们先做 ...

  9. 1-18-1 LVM管理和ssm存储管理器使用&磁盘配额(一)

    LVM管理和ssm存储管理器使用&磁盘配额(一) LVM逻辑卷的管理 问题:对于生产环境下的服务器来说,如果存储数据的分区磁盘空间不够了怎么办? 因为如果要把一个分区的内容都拷贝到另一个分区上 ...

  10. 学习笔记:CentOS7学习之十六:LVM管理和ssm存储管理器使用

    目录 学习笔记:CentOS7学习之十六:LVM管理和ssm存储管理器使用 16.1 LVM的工作原理 16.1.1 LVM常用术语 16.1.2 LVM优点 16.2 创建LVM的基本步骤 16.2 ...

随机推荐

  1. php学习日志(1)-php介绍

    在学习Php之前,我们要搞懂php是什么.英文全称php: php hypertext preprocessor,即php超文本预处理器.php脚本在服务器上执行,故它是一种服务器编程语言. php文 ...

  2. mysql索引使用笔记

    1.使用explain语句查看性能mysql> explain select product_id from orders where order_id in (123, 312, 223, 1 ...

  3. OpenSessionInViewFilter与org.springframework.dao.InvalidDataAccessApiUsageException

    报错:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in r ...

  4. WINIO64位模拟键鼠操作

    最近玩游戏有点入迷,心急升级经验,于是某天开始"挂尸体",一系列手动操作之后决定写一个外挂,模拟一系列键盘和鼠标操作,没做过游戏winform也用得少,开始以为只要简单调用winA ...

  5. 【BZOJ】1044: [HAOI2008]木棍分割 二分+区间DP

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1044 Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, ...

  6. 2014年度辛星css教程夏季版第五节

    本小节我们讲解css中的”盒模型“,即”box model“,它通常用于在布局的时候使用,这个”盒模型“也有人成为”框模型“,其实原理都一样,它的大致原理是这样的,它把一个HTML元素分为了这么几个部 ...

  7. 这个帖子要收藏,以后用得着--python 实时获取子进程输出

    在论坛上找到方法了,http://bbs.csdn.net/topics/340234292 http://blog.csdn.net/junshao90/article/details/821575 ...

  8. HDU 5044 TREE

    题意:一棵树上两种操作,操作1,改变u到v的每一点的值增加k,操作2,改变u到v每一条边值增加k.最后结束时问,每一点和每一条边的值. 初始时,点和边的值都为0. 分析: 很显然要用树链剖分,将点和边 ...

  9. UVA 125 Numbering Paths

    题目大意:给定n条单向边,求图中任意两点的连通路径的数目.其中点是从0-输入中出现的最大的点. 可以用floyd-warshall算法或者dfs. for(int k = 0; k < n; k ...

  10. [unity菜鸟] controller.SimpleMove(transform .forward); 无法移动

    今天做demo时遇到一个问题:当使用角色控制器操作物体,用 controller.SimpleMove(transform .forward); 语句时物体不能移动,搜索请教了很久,最后终于googl ...