S3C2440 存储控制器(memory controller)提供了訪问外部设备所需的信号,这是一种通过总线形式来訪问扩展的外设。


S3C2440  的存储器控制器有下面的特性:

  • 支持小字节序、大字节序(通过软件选择)
  • 每一个BANK的地址空间为128MB。总共1GB(8 BANKs)
  • 可编程控制的总线位宽(8/16/32 -bit)。只是 BANK0 仅仅能选择两种位宽(16/32 -bit)
  • 总共8个BANK。 BANK0 ~ BANK5 能够支持外接 ROM,SRAM等,BANK6 ~ BANK7 除能够支持 ROM,SRAM外,还支持SDRAM等;
  • BANK0 ~ BANK6 共7个BANK的起始地址是固定的。
  • BANK7 的起始地址是可编程选择;
  • BANK6、BANK7的地址空间大小是可编程控制的。
  • 每一个BANK的訪问周期均可编程控制。
  • 能够通过外部的”wait“ 信号延长总线的訪问周期。
  • 在外接SDRAM时。支持自刷新(self-refresh)和省电模式(power down mode)。

S3C2440 对外引出的27根地址线 ADDR0 ~ ADDR26 的訪问范围仅仅有 128MB。那么假设达到上面所说的1GB的訪问空间呢?CPU对外还引出了8根片选信号 nGCS0 ~ nGCS7。相应与 BANK0 ~ BANK7,当訪问 BANKx 的地址空间时,nGCSx 引脚输出低电平用来选中外接的设备。

这样。每一个 nGCSx 相应 128MB 地址空间,8个 nGCSx 信号总共就相应了 1GB 的地址空间。这8个 BANK的地址空间如图:


如图所看到的,左边相应不使用 NAND Flash 作为启动设备(单板上不接 NAND_BOOT 跳线)时的地址空间布局。右边相应使用 NAND Flash启动设备(单板上接 NAND_BOOT 跳线)时的地址空间布局。
S3C2440 作为32位的CPU,能够使用的地址范围理论上达到 4GB。

除去上述用于连接外设的 1GB 地址空间外。另一部分是 CPU 内部寄存器的地址,剩下的地址空间没有使用。
注意:这里说的是物理地址。


S3C2440 的寄存器地址范围都处于 0x48000000 ~ 0x5FFFFFFF,各功能部件的寄存器大体同样。

如图:




源代码:
@*************************************************************************
@ File:head.S
@ 功能:设置SDRAM,将程序拷贝到SDRAM,然后跳到SDRAM继续运行
@*************************************************************************  .equ               MEM_CTL_BASE,               0x48000000
.equ                SDRAM_BASE,                 0x30000000.text
.global _start
_start:bl   disable_watch_dog                                   @ 关闭看门狗bl  memsetup                                                    @ 设置存储控制器bl    copy_steppingstone_to_sdram             @ 复制代码到SDRAM中ldr pc, =on_sdram                                            @ 跳到SDRAM中继续运行
on_sdram:ldr sp,=0x34000000                                            @ 设置堆栈bl   main
halt_loop:b     halt_loopdisable_watch_dog:@ 往 WATCHDOG 寄存器写0 就可以mov r1,           #0x53000000mov r2,          #0x0str r2,         [r1]mov pc,         lr         @返回copy_steppingstone_to_sdram:@ 将Steppingstone的4K数据所有拷贝到SDRAM中@ Steppingstone起始地址为 0x00000000。SDRAM中起始地址为 0x30000000mov r1, #0ldr r2, =SDRAM_BASEmov r3, #4*1024
1:ldr r4, [r1],#4               @ 从Steppingstone读取4字节的数据,并让源地址加4str r4, [r2],#4             @ 将此4字节的数据拷贝到SDRAM中,并让目地地址加4cmp r1, r3                      @ 推断是否完毕:源地址等于 Steppingstone 的末地址bne 1b                             @ 若没有复制完,继续mov pc,  lr                      @ 返回memsetup:@ 设置存储控制器以便使用 SDRAM 等外设mov r1,       #MEM_CTL_BASE               @ 存储控制器的13个寄存器的開始地址adrl            r2, mem_cfg_val         @ 这13个值的起始存储地址add r3,      r1, #52                         @ 13*4 = 52
1:ldr r4,   [r2], #4                        @ 读取设置值。并让 r2 加 4str r4,   [r1], #4                        @ 将此值写入寄存器,并让 r1 加 4cmp r1,   r3                                    @ 推断是否设置完所有13个寄存器bne 1b                                                @ 若没有写成,继续mov pc,   lr                                  @ 返回.align 4
mem_cfg_val:@  存储控制器 13 个寄存器的设置值@ 存储控制器共同拥有 13 个寄存器。 @ BANK0 ~ BANK5 仅仅须要设置 BWSCON 和 BANKCONx(x为0~5)两个寄存器: @ BANK6、BANK7 外接SDRAM时,除 BWSCON 和 BANKCONx(x为6~7)外,还要设置 @ REFRESH、BANKSIZE、MRSRB6、MRSRB7 等4个寄存器。

@ 位宽和等待控制寄存器 BWSCON (BUS WIDTH & WAIT CONTROL REGISTER) @ BWSCON 中每4位控制一个 BANK。最高4位相应 BANK7、接下来4位相应 BANK6,依此类推 @ STx:启动/禁止 SDRAM 的数据掩码引脚,对于 SDRAM,此位为0。对于 SRAM。此位为 1 @ WSx:是否使用存储器的 WAIT 信号,通常设为 0 @ DWx:使用两位来设置相应 BANK 的位宽, 0b00 相应8位。 0b01 相应16位。0b10 相应32位,0b11表示保留 @ 比較特殊的是 BANK0。它没有 ST0 和 WS0。DW0([2:1])仅仅读---由硬件跳线决定: @ 0b01 相应16位,0b10 相应32位。BANK0 仅仅支持16、32两种宽度 @ 对于本开发板(JZ2440)。能够确定 BWSCON 寄存器的值为: 0x22011110 .long 0x22011110 @ BWSCON @ BANK 控制寄存器 BANKCONx(BANK CONTROL REGISTER, x 为 0~5) @ 这几个寄存器用来控制 BANK0 ~ BANK5 外接设备的訪问时序,使用默认的 0x0700 就可以 .long 0x00000700 @ BANKCON0 .long 0x00000700 @ BANKCON1 .long 0x00000700 @ BANKCON2 .long 0x00000700 @ BANKCON3 .long 0x00000700 @ BANKCON4 .long 0x00000700 @ BANKCON5 @ BANK 控制寄存器 BANKCONx(BANK CONTROL REGISTER, x 为 6~7) @ 在8个BANK中,仅仅有BANK6和BANK7能够外接SRAM或SDRAM, @ 所以BANKCON6 ~ BANKCON7 与 BANKCON0 ~ BANKCON5 有点不同 @ MT([16:15]) 用于设置本 BANK 外接的是 ROM/SRAM 还是 SDRAM。 @ MT=0b00 时,此寄存器与 BANKCON0 ~ BANKCON5 相似。

(外接SRAM) @ MT=0b11 时,此寄存器其他值例如以下设置。(外接SDRAM) @ Trcd([3:2]) RAS to CAS delay,设置推荐值为 0b01 @ SCAN([1:0]) SDRAM 的列地址位数。对于本开发板使用的 SDRAM K4S561632, @ 列地址位数为 9。 所以 SCAN = 0b01。假设使用其他型号的 SDRAM, 须要查看其数据手冊来决定 SCAN 的取值。

@ 0b00 表示8位, 0b01 表示9位, 0b10 表示10位 @ 综上所述,本开发板中 BANKCON6/7 均设为 0x00018005 .long 0x00018005 @ BANKCON6 .long 0x00018005 @ BANKCON7 @ 刷新控制寄存器 REFRESH(REFRESH CONTROL REGISTER): 设为 0x008C0000 + R_CNT @ REFEN([23]) 0 = 禁止 SDRAM 的刷新功能。 1 = 开启 SDRAM 的刷新功能 @ TREFMD([22]) SDRAM 的刷新模式。

0 = CBR/Auto Refresh, 1 = Self Refresh(一般在系统休眠时使用) @ Trp([21:20]) 设为 0 就可以。 @ Tsrc([19:18]) 设为默认值 0b11 就可以。

@ Refresh Counter([10:0]) 即上述的 R_CNT @ R_CNT 可例如以下计算 (SDRAM 时钟频率就是 HCLK) @ R_CNT = 2 ^ 11 + 1 - SDRAM 时钟频率(MHz) * SDRAM 刷新周期 (uS) @ SDRAM 的刷新周期在 SDRAM 的数据手冊上有标明,在本开发板使用的 SDRAM K4S561632 的数据手冊上, @ 可看见这么一行 "64 ms refresh period (8K Cycle)" @ 所以。刷新周期 = 64ms/8192 = 7.8125 us @ 在未使用 PLL 时, SDRAM 时钟频率等于晶振频率 12 MHz @ 如今能够计算: R_CNT = 2 ^ 11 + 1 - 12 * 7.8125 = 1955 @ 所以,在末使用 PLL 时, REFRESH = 0x008C0000 + 1955 = 0x008C07A3 .long 0x008C07A3 @ REFRESH @ BANKSIZE 寄存器 REFRESH (BANKSIZE REGISTER) @ BURST_EN([7]) 0 = ARM 核禁止突发传输。 1 = ARM 核支持突发传输 @ SCKE_EN([5]) 0 = 不使用 SCKE 信号令 SDRAM 进入省电模式。 1 = 使用 SCKE 信号令 SDRAM 进入省电模式 @ SCLK_EN([4]) 0 = 时刻发出 SCLK 信号, 1 = 仅在訪问 SDRAM 期间发出 SCLK 信号 @ BK76MAP([2:0]) 设置 BANK6/7 的大小 @ BANK6/7 相应的地址空间与 BANK0~5 不同。 BANK0~5 的地址空间大小都是固定的 128MB, @ 地址返回是 (x*128M) 到 (x+1)*128M-1。 x表示 0 到 5。BANK6/7 的大小是可变的, @ 以保持这两个空间的地址连续,即 BANK7 的事实上地址会随它们的大小变化。BK76MAP 的取值意义例如以下: @ 0b010 = 128M/128M @ 0b001 = 64MB/64MB @ 0b000 = 32MB/32MB @ 0b111 = 16MB/16MB @ 0b110 = 8MB/8MB @ 0b101 = 4M/4M @ 0b100 = 2M/2M @ 本开发板 BANK6 外接64MB的 SDRAM。 令[2:0]=0b001 (64MB/64MB) @ 表示 BANK6/7 的容量都是64MB。尽管 BANK7 没有使用 @ 综上所述。本开发板 BANKSIZE 寄存器的值可算得 0xB1 .long 0x000000B1 @ BANKSIZE @ SDRAM 模式设置寄存器 MRSRBx (SDRAM MODE REGISTER SET REGISTER, x为6~7) @ 能改动的仅仅有位 CL([6:4]),这是 SDRAM 时序的一个时间參数: @ 0b000 = 1 clocks, 0b010 = 2 clocks。 0b011 = 3 clocks @ SDRAM K4S561632 不支持 CL = 1的情况,所以位[6:4]取值为 0b010 或 0b011 。

@ 本开发板取最保守的值 0b011, 所以 MRSRB6/7 的值为 0x30 .long 0x00000030 @ MRSRB6 .long 0x00000030 @ MRSRB7

// leds.c
#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,4if(++i == 8)i = 0;}return 0;
}

#Makefile
sdram.bin : head.S leds.carm-linux-gcc -g -c -o head.o head.Sarm-linux-gcc -g -c -o leds.o leds.carm-linux-ld -Ttext 0x30000000 -g head.o leds.o -o sdram_elfarm-linux-objcopy -O binary -S sdram_elf sdram.binarm-linux-objdump -D -m arm sdram_elf > sdram.dis
clean:rm -f sdram.dis sdram.bin sdram.dis *.o

转载于:https://www.cnblogs.com/brucemengbm/p/7000778.html

存储控制器和SDRAM 实验相关推荐

  1. 存储控制器(SDRAM操作)

    什么是存储控制器 2440是32位单片机,进行数据访问时通过32位地址访问. CPU发出32位地址信号给存储控制器,存储控制器根据地址信号设置片选信号及地址总线,将相应数据通过数据总线传回存储控制器, ...

  2. 存储控制器--SDRAM

    2存储控制器 上一节写的太细,这节写重点 正如在GPIO里面说的 这个ARM统一编址(1G~4G留给寄存器) 0x0000_0000~0x4000_0000这1G 给外设用的,硬件把这些地址分成8块 ...

  3. SDRAM - 一个简单的存储控制器

    我们的SDRAM控制器具有以下特点: 易于使用:使SDRAM看起来像一个静态存储器(或尽可能地接近). 快速:如果您提供连续地址,则在突发模式下使用SDRAM. 简单:没有排程,一次只有一家银行处于活 ...

  4. (嵌入式)关于arm中的存储控制器

    /// 预备知识: 1.存储控制器概述 S3C2440存储控制器提供了访问外部存储设备所需的内存控制信号 .有以下特点: --支持小端/大端字节序(通过软件选择) --地址空间:每个BANK有128M ...

  5. 嵌入式开发笔记-存储控制器

    我是一个刚开始学习,嵌入式的小白,最近对协议接口和存储的控制器,有了小小的理解,首先第一点,程序是在存储控制器里面跑起来的,在驱动程里,对相关的驱动寄存器 进行赋值,调用相关的功能. 存储控制器基本理 ...

  6. s3c2440存储控制器和地址以及启动的理解

    2019独角兽企业重金招聘Python工程师标准>>> 1.首先应该先了解Flash ROM的种类 NOR FLASH地址线和数据线分开,来了地址和控制信号,数据就出来. NAND ...

  7. 存储控制器_SDRAM详解

    2019独角兽企业重金招聘Python工程师标准>>> 什么是 SDRAM Synchronous Dynamic Random Access Memory: 同步动态随机存储器. ...

  8. S3C2440—7.存储控制器访问外设

    文章目录 一.内存接口的概念 二.存储控制器(内存控制器) 2.1 什么是存储控制器? 2.2 S3C2440存储控制器介绍 2.3 存储控制器如何处理不同位宽的外设 2.4 怎么确定芯片的访问地址? ...

  9. S3C2440的存储控制器

    S3C2440存储控制器特性: 1>.  s3c2440的存储器控制器为访问外部存储的需要提供了控制信号 (27位地址信号.32位数据信号.8个片选信号.以及读/写控制信号等) 查 S3C244 ...

  10. LPC1788FBD208笔记(002):SDRAM实验

    LPC1788FBD208笔记(002):SDRAM实验 平台: MCU----- LPC1788FBD208 SDRAM---- IS42S16160D XTAL ---- 12.0000M IS4 ...

最新文章

  1. 物联网无线连接服务发布 阿里云全新产品,物联网设备专用的物联网卡与流量套餐...
  2. 前端学习(2975):路由传参的两种方式
  3. CTF中的EXP编写技巧 zio库的使用
  4. 新疆微软.NET技术俱乐部7月活动图文报道
  5. 电脑模拟器哪个好_学习电脑教程:网线wifi哪个信号好
  6. maven仓库的安装与配置
  7. mysql三高讲解(二):2.3 InnoDB索引即数据
  8. [教程] 中断闪存或备份后如何修复 MTK 或 SPD 变砖
  9. 七种方法完美解救你爆满的C盘(瘦身+扩容)
  10. python处理地震sac数据_自己开发的一个SEED格式地震数据转换为SAC格式数据,并完成世界时整天波形合并的Python脚本...
  11. 美股世界/汇财证券开户说明(viewtrade)
  12. c语言用while循环输出九九乘法表,用C语言的while循环,打印九九乘法表
  13. 【Linux】制作U-Boot烧写镜像到SD卡的过程(下篇:Makefile文件)
  14. 74cms|骑士cms|开源招聘系统,目录结构
  15. 软件工程 3:模块化设计
  16. 如何进行SEO站内优化,让你的网站更易被搜索引擎收录
  17. 学Python编程好找工作吗?岗位方向多吗?
  18. 离散点插值反距离加权法IDW C#实现
  19. 20 个 JS 工具函数助力高效开发
  20. 2、简单的onclick点击事件

热门文章

  1. java路径通配符_java实现路径通配符*,**,?
  2. 字符集_一文搞清楚unicode字符集的三种实现方式
  3. python中argsparse_Python中的argparse模块
  4. Python 网络数据采集
  5. 深度学习图片卷积输出大小计算公式
  6. 10 Java NIO ServerSocketChannel-翻译
  7. 下一代终端保护六大支柱
  8. Dynamic CRM2013安装系列三、SQL及CRM2013安装
  9. 真题很重要,用科学的态度批判性地对待真题同等重要!
  10. 杨澜给80后女孩子的14个忠告