平台:jz2440

作者:庄泽彬(欢迎转载,请注明作者)

说明:韦东山一期视频学习笔记

简介:先来简单的说明一下这次的实验,看看下图,我们的程序通过烧录器下载到nandflash当中去,之后在启动的时候s3c2440会把nandflash的前4k的内容copy到内部的ram当中运行,我们这次实验的主要目的是把在芯片内部运行的程序,拷贝到sdram当中运行。

一、原理图:

  

    jz2440是使用2块32M的sdram,组合成64M的sdram来使用的LADDR2 ~LADDR14 是地址线,LDATA0 ~LDATA31是输出的数据引脚,LnGCS6 是片选引脚,LnSRAS 列脉冲选中引脚、LnGCS6 行脉冲选择引脚、在上图中sdram的寻址方式是先选中处于哪一个bank,之后在发出行地址和列地址来找到存储的内容,BA0、BA1是bank选择引脚,是用来确定具体位于哪个bank使用的。
    仔细看一下sdram的连接方式数据引脚是LADDR2 ~LADDR14连接到A0~A12,为什么不从LADDR0开始呢?下面我们来详细说一下。

 jz2440使用的sdram是使用两片16位的sram组成32位数据宽度,也就是说我们发出一个地址,假设地址为0x00000000,我们读取到的是4个字节的内容,按照下图读取的内容为1,2,3,4,如果地址为0x00000001,读取的内容还是1,2,3,4。至于是哪个数据是在内存控制器处理之后发给CPU的。因此A0,A1地址线完全没有必要,不能用A0,A1取出其中的一个内容,因此A0,A1不接。

 

为什么要使用LADDR24 、LADDR25作为bank的选择引脚,这是根据芯片手册上给的建议连接的,请看下图.

    

二、配置sdram

     我们这次实验的目的是在sdram中运行我们的程序,因此我们要初始化sdram之后才能够使用它,要使用sdram我们一共要配置13个寄存器,即可使用。

    2.1  BWSCON寄存器是用来配置sdram的数据位宽度的,jz2440可以用来接sdram的bank,只有bank6以及bank7,实际使用的是bank6.因此把bank6配置成32位,

           因此BWSCON设置为0x22011110

     

2.2接下来有BANKCON0~BANKCON5这6个寄存器,这是用来控制其他的内存接口的,我们没有用到设置成默认值0x0700.

2.3BANKCON6与BANKCON7的配置,我们BANKCON6与BANKCON7外接的是sdram因此MT[16:15]设置为11,根据datasheet如何配置为sdram的话,要设置的主要有[3:2]以及[1:0]位,Tcrd[3:2]设置为推荐的值10,SCAN[1:0]用来配置列地址的位数,我们的sdram为9位因此设置为0x01,因此这个寄存器设置为0x18005   

2.4 刷新控制寄存器REFRESH 的配置:

      REFEN[23]位设置为1使能这个寄存器

      TREFMD[22]位设置为0,设置为自动刷新模式

      trp[21:20]位设置为0,设置预充电时间为2个时钟周期

      tsrc[19:18]位设置为默认值11

      refreshe counter[10:0]刷新周期,计算公式为:刷新时间=(2^11+1-refresh_count)/HCLK,从sdram的数据手册HY57V561620C(L)T(P)(Rev.0.5)可以查看到刷新周期64ms refresh period (8K Cycle) ,因此刷新周期为64ms/8192=7.8125us,此时我们还没有使用pll,sdram的时钟频率为12M,因此refresh_count=2^11+1-12*7.8125=1955,因此REFRESH设置为0x008c07a3。

  

2.5 BANKSIZE寄存器

    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的大小,0b010=128MB/128MB,0b001=64MB/64MB,0b000=32M/32M,0b111=16M/16M,0b110=8M/8M,0b101=4M/4M,0b100=2M/2M

    本开发板外接64MB的SDRAM

   则本开发板BANKSIZE设为0xB1

2.6 SDRAM模式设置寄存器MRSRBx(x为6-7)

CL[6:4]: 0b000=1clocks,0b010=2clocks,0b011=3clocks

本开发板取0b011,所以MRSRB6/7取值为0x30

3 实验代码:

head.S

 @*************************************************************************
@ 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, #
ldr r2, =SDRAM_BASE
mov r3, #*
:
ldr r4, [r1],# @ 从Steppingstone读取4字节的数据,并让源地址加4
str r4, [r2],# @ 将此4字节的数据复制到SDRAM中,并让目地地址加4
cmp 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, # @ * =
:
ldr r4, [r2], # @ 读取设置值,并让r2加4
str r4, [r1], # @ 将此值写入寄存器,并让r1加4
cmp r1, r3 @ 判断是否设置完所有13个寄存器
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

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 > ; dly--);
} int main(void)
{
unsigned long i = ; GPFCON = GPF4_out|GPF5_out|GPF6_out; // 将LED1,2,4对应的GPF4/5/6三个引脚设为输出 while(){
wait();
GPFDAT = (~(i<<)); // 根据i的值,点亮LED1,2,4
if(++i == )
i = ;
} return ;
}

Makefile

 sdram.bin : head.S  leds.c
arm-linux-gcc -c -o head.o head.S
arm-linux-gcc -c -o leds.o leds.c
arm-linux-ld -Ttext 0x30000000 head.o leds.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

具体的代码就留给大家自己分析了,我大概说一下程序,先关闭看门狗,初始化sram控制器,将内容中4k拷贝到sdram当中,之后跳转到sdram中执行代码点亮LED。下面我们主要分析程序是怎么从内存跳转到sdram中执行代码的。

head.s中执行了 ldr pc, =on_sdram 语句就跳转到sdram中,为什么呢?

  查看head.s的反汇编文件,ldr pc, =on_sdram被反汇编成ldr pc, [pc, #144]  ; 300000a4 <mem_cfg_val+0x34>,那么PC会指向多少呢?

 pc的计算公式pc=pc+8 三级流水线存在的原因。

    pc = 12+8+144=164=0xa4,PC到a4的地址取数据为30000010,因此PC值为30000010,因此执行完之后就跳转到sdram中执行。

  

  

jz2440存储管理实验【学习笔记】的更多相关文章

  1. Rancher Server HA的高可用部署实验-学习笔记

    转载于https://blog.csdn.net/csdn_duomaomao/article/details/78771731 Rancher Server HA的高可用部署实验-学习笔记 一.机器 ...

  2. jz2440使用openjtag+openocd+eclipse调试【学习笔记】

    平台:jz2440 作者:庄泽彬(欢迎转载,请注明作者) 说明:韦东山二期视频学习笔记 交叉编译工具:arm-linux-gcc (GCC) 3.4.5 eclipse版本:eclipse-cpp-l ...

  3. JZ2440裸机点亮LED【学习笔记】

    平台:jz2440 作者:庄泽彬(欢迎转载,请注明作者) 说明:韦东山一期视频学习笔记 一.我们首先来做第一个实验,用汇编语言点亮板子上的LED. 1.1 LED的原理图 从下面的原理图可知LED1是 ...

  4. 实验楼课程管理程序-深入学习《C++ Primer第五版》实验报告&学习笔记1

    本片博客为实验楼的训练营课程深入学习<C++ Primer第五版>的实验报告和学习笔记. 原课程地址为:https://www.shiyanlou.com/courses/405# 原文出 ...

  5. 移植madplay到jz2440【学习笔记】

    平台:jz2440 作者:庄泽彬(欢迎转载,请注明作者) 说明:韦东山一期视频学习笔记 交叉编译工具:arm-linux-gcc (GCC) 3.4.5 PC环境:ubuntu16.04 一.移植ma ...

  6. JZ2440学习笔记之通过J-Link单步裸机程序(Keil+J-Link)

    我们还是使用JZ2440学习笔记之第一个裸机程序(Keil-MDK)里面的程序,但是把延时拿掉,要不然单步的时候一直在delay里面: int main(void) { // Set GPF4/5/6 ...

  7. [原创]java WEB学习笔记12:一个简单的serlet连接数据库实验

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

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

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

  9. Redis学习笔记六:持久化实验(AOF,RDB)

    作者:Grey 原文地址:Redis学习笔记六:持久化实验(AOF,RDB) Redis几种持久化方案介绍和对比 AOF方式:https://blog.csdn.net/ctwctw/article/ ...

随机推荐

  1. python入门(五):面向对象

    面向对象术语 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中且 ...

  2. Oracle体系机构

    Oracle 体系结构1.文件:数据库组成和实例文件;2.系统全局区:SGA内存结构,SGA PGA UGA关,也研究SGA和java池,共享池和大部分的池;3.物理进程和线程 server进程 ba ...

  3. Web的本质以及第一个Django实例.

       Web框架的本质:    所有的Web应用本质上就是一个socket服务器, 而用户的浏览器就是一个socket客户端. import socket sk = socket.socket() s ...

  4. ORA-08002: sequence TESTTABLE1_ID_SEQ.CURRVAL is not yet defined in this session (未完全解决)

    说明: 断开连接后 重新连接执行序列号当前值查找 会报错. 解决方法一:先查询序列号下一个值 SELECT testTable1_ID_SEQ.nextval from dual;

  5. tcp连接是基于socket通信的吗

    https://zhidao.baidu.com/question/1305788160020716299.html ------ 网络七层协议 五层模型 TCP连接 HTTP连接 socket套接字 ...

  6. 我的Android进阶之旅------>Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能

    前言 一LRC歌词文件简介 1什么是LRC歌词文件 2LRC歌词文件的格式 LRC歌词文件的标签类型 1标识标签 2时间标签 二解析LRC歌词 1读取出歌词文件 2解析得到的歌词内容 1表示每行歌词内 ...

  7. HTML(form标签)、CSS

    一.表单标签<form> 功能:表单用于向服务器传输数据,从而实现用户与Web服务器的交互. 表单能够包含input系列标签,比如文本字段.复选框.单选框.提交按钮等等. 表单还可以包含t ...

  8. MySQL数据库(3)- 完整性约束、外键的变种、单表查询

    一.完整性约束 在创建表时候,约束条件和数据类型的宽度都是可选参数. 作用:用于保证数据的完整性和一致性. 1.not null(不可空)与default 示例一:插入一个空值,如下: mysql&g ...

  9. Tomcat WEB站点部署

    上线的代码有两种方式, 第一种方式是直接将程序目录放在webapps目录下面 第二种方式是使用开发工具将程序打包成war包,然后上传到webapps目录下面.下面让我们见识一下这种方式 这个网站里面已 ...

  10. 学点TCPDUMP

    [root@future ~]# yum install tcpdump 官网地址: https://nmap.org/ 还有中文手册,太感动了 https://nmap.org/man/zh/man ...