【嵌入式Linux+ARM】存储控制器(操作SDRAM)

1.存储控制器介绍

s3c2440中的“存储管理器”提供了访问外部设备所需要的信号,有如下特性:

1.支持小字节序、大字节序(通过软件选择)

2.每个BANK为128M,一共有8个BANK,共1G

3.BANK0~BANK5可以支持外接ROM、SRAM等,BANK6~BANK7除可以支持ROM、SRAM外 还支持SDRAM

4.BANK0~BANK7的起始地址是固定的

5.外接SDRAM时,支持自刷新和省电模式

s3c2440上有ADDR0~ADDR26访问范围只有128M,如何达到上面的1G,通过对外引出的8跟片选信号nGCS0-nGCS7,对应于BANK0~BANK7。片选信号输出低电平可以选中相应的外接设备。

2.实验代码

本实验流程:

禁止看门狗—>nand flash中前4k字节复制到芯片内部SRAM中执行—>通过存储控制器初始化外接的SDRAM—>复制代码到SDRAM中—>跳转到SDRAM中执行。

下面是需要配置存储控制器的相关寄存器,需要看手册:

0x22011110,     //BWSCON
0x00000700,     //BANKCON0
0x00000700,     //BANKCON1
0x00000700,     //BANKCON2
0x00000700,     //BANKCON3
0x00000700,     //BANKCON4
0x00000700,     //BANKCON5
0x00018005,     //BANKCON6
0x00018005,     //BANKCON7
0x008C07A3,     //REFRESH
0x000000B1,     //BANKSIZE
0x00000030,     //MRSRB6
0x00000030,     //MRSRB7

head.S

.equ MEM_CTL_BASE, 0x48000000           //.euq A  B  就是A=B 等价于c语言的宏定义
.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_loop

disable_watch_dog:
	mov r1, #0x53000000
	mov r2, #0x0
	str r2, [r1]                   //关闭看门狗
	mov pc, lr                     //返回

copy_steppingstone_to_sdram:
	mov r1, #0x0
	ldr r2, =SDRAM_BASE
	mov r3, #4*1024
1:
	ldr r4, [r1], #4
	str r4, [r2], #4
	cmp r1, r3
	bne 1b                        //bne b跳转 ne是not equal  表示如果不相等,跳到1出继续执行 注意1不是l。。。
	mov pc, lr

memsetup:
	mov r1, #MEM_CTL_BASE
	adrl r2, mem_cfg_val
	add r3, r1, #52
1:
	ldr r4, [r2], #4
	str r4, [r1], #4
	cmp r1, r3
	bne 1b
	mov pc, lr

.align 4
mem_cfg_val:                         //存储控制器中13个寄存器的值
	.long 0x22011110
	.long 0x00000700
	.long 0x00000700
	.long 0x00000700
	.long 0x00000700
	.long 0x00000700
	.long 0x00000700
	.long 0x00018005
	.long 0x00018005
	.long 0x008C07A3
	.long 0x000000B1
	.long 0x00000030
	.long 0x00000030

Makefile

sdram.bin:head.S led.c
	arm-linux-gcc -c head.S -o head.o
	arm-linux-gcc -c led.c -o led.o
	arm-linux-ld -Ttext 0x30000000 head.o led.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 -rf *.o *.bin *.dis *elf

测试时用的led.c,随意选择前面文章中的led点灯程序即可。

注:原创文章,转载请著名出处:http://blog.csdn.net/scottly1/article/details/38960751

时间: 2024-10-31 15:06:48

【嵌入式Linux+ARM】存储控制器(操作SDRAM)的相关文章

【嵌入式Linux+ARM】GPIO操作

1.GPIO介绍 GPIO(general purpose i/o ports)意思为通用输入/输出端口,通俗的说就是一些引脚. 我们可以通过它们输出高低电平 或 读入引脚的状态. s3c2440中有130个I/O端口,分为A~J共9组,GPA.GPB...... GPJ 2.GPIO寄存器 既然要操作GPIO,必须对相应的寄存器进行操作,2440中gpio寄存器有: GPxCON--选择引脚功能(输入.输出.保留等) GPxDAT--用来读写引脚 GPcUP --某一位是1时,相应的引脚无内部

嵌入式Linux ARM汇编(六)——GNU ARM汇编编程

嵌入式Linux ARM汇编(六)--GNU ARM汇编编程 不同的汇编器对汇编语言的语法要求不一样.目前常用的ARM汇编环境有以下两种: A.ARM ASM:ARM公司的汇编器,适合在Windows平台下使用 B.GNU ARM ASM:GNU交叉编译工具链中的汇编器,适合于Linux开发平台. GNU汇编器是GNU工具集的一部分,用于将汇编语言文件转化为二进制obj文件.GNU汇编器针对的是多种处理器架构,这意味着GNU汇编器的语法不同于ARM工具链的汇编器. 一.GUN ARM汇编指令格式

嵌入式Linux ARM汇编(七)——C语言与ARM汇编混合编程

嵌入式Linux ARM汇编(七)--C语言与ARM汇编混合编程 在嵌入式系统开发中,目前使用的主要编程语言是C和汇编.在大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较好,便于人的理解,而且有大量的支持库.但是很多地方还是要用到汇编语言,例如开机时硬件系统的初始化,包括CPU状态的设定,中断的使能,主频的设定,以及RAM的控制参数及初始化,一些中断处理方面也可能涉及汇编.另外一个使用汇编的地方就是一些对性能非常敏感的代码块,这是不能依靠C编译器的生成代

存储控制器和SDRAM 实验

S3C2440 存储控制器(memory controller)提供了訪问外部设备所需的信号,这是一种通过总线形式来訪问扩展的外设. S3C2440  的存储器控制器有下面的特性: 支持小字节序.大字节序(通过软件选择) 每一个BANK的地址空间为128MB.总共1GB(8 BANKs) 可编程控制的总线位宽(8/16/32 -bit).只是 BANK0 仅仅能选择两种位宽(16/32 -bit) 总共8个BANK. BANK0 ~ BANK5 能够支持外接 ROM,SRAM等,BANK6 ~

【嵌入式Linux+ARM】ARM体系结构与编程(ARM汇编指令)

自己的一些简单的总结,也是最常用的ARM汇编指令,之后也会不断的补充完善. 1. 汇编系统预定义的段名 .text    @代码段 .data   @初始化数据段 .bss    @未初始化数据段 需要注意的是,源程序中.bss段应该在.text之前. 2.定义入口点 汇编程序的缺省入口是 start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点. .text .global _start _start: 3 .word用法 word expression就是在当前位置放一个wo

【嵌入式Linux+ARM】硬件相关基础知识(门电路_UART_I2C_SPI)

比较基本的一些知识,就算再怎么水,一些基本的电路常识还是需要懂的,需要自己慢慢的积累,实际工作中需要好好积累硬件相关的知识: 正文开始: 1.门电路 与门.或门.非门的几个标志需要记住,特别是后面两个不要混淆,自己画了一遍: 实际电路中可以组合使用:如与非门.或非门等复杂电路. 这些是比较简单的,做个简单的复习: 与门:1 1-->1      1 0-->0      0 1-->0     0 0-->0 或门:1 1-->1      1 0-->1      0

【嵌入式Linux+ARM】ARM体系结构与编程(ARM概述)

ARM体系结构与编程 本文章记录一些看<ARM体系结构与编程>这一本书的记录: 个人觉得,学习ARM体系时,不需要死记硬背,只要把某些关键的大致记住,比如ARM寄存器(通用寄存器.PC.LR.SP.CPSR.SPSR).ARM中断处理体系.常用的ARM汇编指令等. 本文基本都是从书上截图,都是一些关键的知识,需要我们时常去复习的. 一.ARM概述 ARM处理器的7种工作模式: ARM处理器寄存器: ARM中PC(R15)寄存器: ARM中CPSR寄存器: ARM异常处理模式--响应过程和返回过

【嵌入式Linux+ARM】阶段性总结(Makefile &amp; 链接文件)

1.arm-linux-ld arm-linux-ld 的 -T 选项用来指定链接地址: -Ttext--指定代码段 -Tdata--指定数据段 -Tbss--指定bss段 arm-linux-ld -Ttext 0x30000000 -g led_on.o -o led_on 也可以用来指定一个链接文本,如*.lds ,举例如下: SECTIONS{ . = 0x30000000 //设置当前运行地址 .text : {*(.text)}                            

u-boot移植(七)---代码修改---存储控制器

一.CPU访问芯片的条件 CPU通过访问存储控制器,来读取外部设备的数据. CPU想访问一个芯片,需要如下条件(配置信息): 地址线 数据线:8位/16位/32位数据宽度 时钟/频率 其他芯片相关的特性:比如SDRAM,有行地址.列地址和bank SDRAM的访问和表格检索的原理一样,先指定一个行(Row),再指定一个列(Columu),就可以准确找到所需要的单元格.这个单元格称为存储单元,这个表格(存储阵列)就是逻辑Bank(Logical Bank,即L-Bank),SDRAM一般含有4个L