2.1 硬件结构

2.1.1 硬件框图

  CPU 通过存储管理器来读取 SDRAM 网卡 等外部设备,CPU不管外部设备是怎么样的,只是读存储管理器中的地址

  

  CPU从0x30000000地址读取数据。

 mov R1, #0x30000000
ldr R0, [R1]

  存储管理器会根据配置信息来访问外部的设备。

  配置信息包括:

    • 外部设备的地址
    • 外部设备的数据,数据宽度是多少位(8位/16位/32位)
    • 时钟信号频率
    • 外部设备相关的特性,SDRAM包括行地址,列地址和bank

  SDRAM的存储结构逻辑如下:

  

  SDRAM内部为一个存储阵列。读写原理为,先指定一个行(ROW),再指定一个列(COLUMN),就可以找到所需要的内容。

  一个存储阵列称为一个BANK。

2.SDRAM

2.1 硬件结构

  两个16位的芯片组成32位位宽。

  

  

  

            

  具体参数可以查看SDRAM的芯片手册。

  SDRAM 需要知道的信息:

  • 列地址和行地址的数目:由芯片手册可以知道,行地址为13位,列地址为9位
  • 刷新周期:刷新周期为  64/8192
  • bank 地址
  • 位宽:由原理图可以知道,位宽为32  

  

  由芯片手册可以知道,行地址为13位,列地址为9位

  

  刷新周期为  64/8192

  2440 芯片手册上面写了位宽与PIN脚之间的关系,如下图:

  

  若是8位位宽,只接A0 A1.......,若是16位位宽,则为A1 A2........,若是32位位宽,则为A2 A3........;这些引脚接到SDRAM上都是从 SDRAM的A0开始,32位,即LADDR2接到A0上开始

2.2 编程

  要想使用SDRAM,需要进行以下几步:

  1)配置存储管理器

  2)将SDRAM 的信息写入到寄存器中

  对于存储管理器,涉及到13个寄存器,具体看芯片手册

  • 程序设计思路:

    • 程序烧写进NAND Flash 中后,NAND Flash 中的前4K会拷贝到CPU的SRAM中去,SRAM的起始地址为0x00000000,程序从这里开始执行,SDRAM中的4K内容称为steppingstone
    • 然后在SRAM中执行的时候,会将SRAM中的程序拷贝进SDRAM中去,然后继续在SDRAM中执行
    • 若是程序较大,则前4K执行完后,会将NAND Flash 的中的所有代码一次性拷贝进SDRAM中执行,此章不涉及

  链接地址:运行时,程序应该位于哪里  

  代码 head.S

 @******************************************************************************
@ File:head.S
@ 功能:SDRAM 进行初始化
@****************************************************************************** @ .equ 命令用于把常量值设置为可以在文本段中使用的符号
@ 经过设置之后,数据符号值是不能在 程序中改动的。
@ .equ 命令可以出现在数据段中任何位置,但是出于好的代码习惯,最好是在定义其他数据之前或之后集中定义所有数据符号
.equ MEM_CTL_BASE, 0x48000000 @ 设置内存控制器的基地址,寄存器的起始地址
.equ SDRAM_BASE, 0x30000000 @ 设置SDRAM的基地址,按接在2440的哪个片选上看 .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 @ 设置堆栈,SDRAM 总共64M,栈指针指向SDRAM的最上端
bl main halt_loop:
b halt_loop @ 关闭看门狗
disable_watch_dog:
ldr r0, =0x53000000 @ WATCHDOG寄存器地址
mov r1, #0x0
str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启
mov pc, lr @ 返回 @ 设置存储控制器,以便使用SDRAM等外设
memsetup:
mov r1, #MEM_CTL_BASE @ 存储控制器的13个寄存器的开始地址
adrl r2, mem_cfg_val @ 这13个值的起始存储地址
add r3, r1, # @ * =
:
ldr r4, [r2], # @ 读取设置值,并让r2加4
str r4, [r1], # @ 将此值写入寄存器,并让r1加4
cmp r1, r3 @ 判断是否设置完所有13个寄存器
bne 1b @ 若没有写成,继续
mov pc, lr @ 返回 copy_steppingstone_to_sdram:
@ 将Steppingstone的4K数据全部复制到SDRAM中去
@ Steppingstone起始地址为0x00000000,SDRAM中起始地址为0x30000000 mov r1, # @ 片内内存的起始地址为
ldr r2, =SDRAM_BASE @ SDRAM 中的基地址
mov r3, #* @ 拷贝的大小为 4K
:
ldr r4, [r1],# @ 从Steppingstone读取4字节的数据,并让源地址加4
str r4, [r2],# @ 将此4字节的数据复制到SDRAM中,并让目地地址加4
cmp r1, r3 @ 判断是否完成:源地址等于Steppingstone的末地址?
bne 1b @ 若没有复制完,继续
mov pc, lr @ 返回 .align
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

  sdram.c

 /* GPF */
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
/* GPG */
#define GPGCON (*(volatile unsigned long *)0x56000060)
#define GPGDAT (*(volatile unsigned long *)0x56000064) /* GPF */
#define GPF4_out (1<<(4*2))
#define GPF5_out (1<<(5*2))
#define GPF6_out (1<<(6*2)) #define GPF4_msk (3<<(4*2))
#define GPF5_msk (3<<(5*2))
#define GPF6_msk (3<<(6*2)) /*
* S2,S3,S4对应GPF0、GPF2、GPG3
*/
#define GPF0_in (0<<(0*2))
#define GPF2_in (0<<(2*2))
#define GPG3_in (0<<(3*2)) #define GPF0_msk (3<<(0*2))
#define GPF2_msk (3<<(2*2))
#define GPG3_msk (3<<(3*2)) int main()
{
unsigned long dwDat; // LED1,LED2,LED4对应的3根引脚设为输出
GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk);
GPFCON |= GPF4_out | GPF5_out | GPF6_out; // S2,S3对应的2根引脚设为输入
GPFCON &= ~(GPF0_msk | GPF2_msk);
GPFCON |= GPF0_in | GPF2_in; // S4对应的引脚设为输入
GPGCON &= ~GPG3_msk;
GPGCON |= GPG3_in; while()
{
//若Kn为0(表示按下),则令LEDn为0(表示点亮)
dwDat = GPFDAT; // 读取GPF管脚电平状态 if (dwDat & (<<)) // S2没有按下
GPFDAT |= (<<); // LED1熄灭
else
GPFDAT &= ~(<<); // LED1点亮 if (dwDat & (<<)) // S3没有按下
GPFDAT |= (<<); // LED2熄灭
else
GPFDAT &= ~(<<); // LED2点亮 dwDat = GPGDAT; // 读取GPG管脚电平状态 if (dwDat & (<<)) // S4没有按下
GPFDAT |= (<<); // LED3熄灭
else
GPFDAT &= ~(<<); // LED3点亮
}
return ;
}

  Makefile

 led_on.bin : head.S  sdram.c
arm-linux-gcc -g -c -o head.o head.S
arm-linux-gcc -g -c -o sdram.o sdram.c
arm-linux-ld -Ttext 0x30000000 -g head.o sdram.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 -f sdram.dis sdram.bin sdram_elf *.o

  

二、存储管理器--SDRAM的更多相关文章

  1. JZ2440存储管理器--SDRAM

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

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

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

  3. 存储管理器 S3C2440A

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

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

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

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

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

  6. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十:SDRAM模块③ — 页读写 α

    实验二十:SDRAM模块③ — 页读写 α 完成单字读写与多字读写以后,接下来我们要实验页读写.丑话当前,实验二十的页读写只是实验性质的东西,其中不存在任何实用价值,笔者希望读者可以把它当成页读写的热 ...

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

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

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

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

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

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

随机推荐

  1. poj 3694 Network(割边+lca)

    题目链接:http://poj.org/problem?id=3694 题意:一个无向图中本来有若干条桥,有Q个操作,每次加一条边(u,v),每次操作后输出桥的数目. 分析:通常的做法是:先求出该无向 ...

  2. 关于utf8mb4的学习了解笔记

    占位下班写 据说可以存储emoji ..妈蛋今天大神又秀我一脸 大概意思是,我们整个后端数据库,最近都升级了编码格式.从以前久的utf-8整个升级到了utf8mb4的格式 该格式支持emoji表情. ...

  3. multi_index_container 多索引容器

    multi_index_container是c++ boost库中的一个多索引的容器.因工作中用到了,特来测试试用. #include "stdafx.h" #include &q ...

  4. BZOJ3786星系探索——非旋转treap(平衡树动态维护dfs序)

    题目描述 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球没有依赖星球. ...

  5. BZOJ1212[HNOI2004]L语言——trie树+DP

    题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...

  6. BZOJ5306 HAOI2018染色(容斥原理+NTT)

    容易想到枚举恰好出现S次的颜色有几种.如果固定至少有i种恰好出现S次,那么方案数是C(M,i)·C(N,i*S)·(M-i)N-i*S·(i*S)!/(S!)i,设为f(i). 于是考虑容斥,可得恰好 ...

  7. windows service 安装/卸载

    第一种方法: 前提: Service1 中的serviceProcessInstaller1设置 Account为localSystem 1. 开始 ->运行 ->cmd(管理员身份运行) ...

  8. MT【58】反演圆和极线极点和谐统一

    解答:如图 评:1.反演圆及其性质介绍: 评2:此题的源头是1995年全国卷压轴题,这里用极线极点的相关性质也可以处理: 注:用相关点法很容易得到轨迹.

  9. 删除linux下的指定文件

    要求:删除linux下2天前的指定文件 find 文件问题:在 tmp 目录下有大量包含 picture_* 的临时文件,每天晚上 2:00 对一天前的文件进行清理.之前在 crontab 下跑如下脚 ...

  10. 【总结】 Lucas定理

    \(Lucas\)定理: \(C^x_y≡C^{x/p}_{y/p}*C^{x\%p}_{y\%p} ~~(mod~p)\) 证明不会2333 void pre(){ A[0]=A[1]=B[0]=B ...