博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jz2440存储管理实验【学习笔记】
阅读量:7049 次
发布时间:2019-06-28

本文共 5753 字,大约阅读时间需要 19 分钟。

平台: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

1 @************************************************************************* 2 @ File:head.S 3 @ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行 4 @*************************************************************************        5  6 .equ        MEM_CTL_BASE,       0x48000000 7 .equ        SDRAM_BASE,         0x30000000 8  9 .text10 .global _start11 _start:12     bl  disable_watch_dog               @ 关闭WATCHDOG,否则CPU会不断重启13     bl  memsetup                        @ 设置存储控制器14     bl  copy_steppingstone_to_sdram     @ 复制代码到SDRAM中15     ldr pc, =on_sdram                   @ 跳到SDRAM中继续执行16 on_sdram:17     ldr sp, =0x34000000                 @ 设置堆栈18     bl  main19 halt_loop:20     b   halt_loop21 22 disable_watch_dog:23     @ 往WATCHDOG寄存器写0即可24     mov r1,     #0x5300000025     mov r2,     #0x026     str r2,     [r1]27     mov pc,     lr      @ 返回28 29 copy_steppingstone_to_sdram:30     @ 将Steppingstone的4K数据全部复制到SDRAM中去31     @ Steppingstone起始地址为0x00000000,SDRAM中起始地址为0x3000000032     33     mov r1, #034     ldr r2, =SDRAM_BASE35     mov r3, #4*102436 1:  37     ldr r4, [r1],#4     @ 从Steppingstone读取4字节的数据,并让源地址加438     str r4, [r2],#4     @ 将此4字节的数据复制到SDRAM中,并让目地地址加439     cmp r1, r3          @ 判断是否完成:源地址等于Steppingstone的未地址?40     bne 1b              @ 若没有复制完,继续41     mov pc,     lr      @ 返回42 43 memsetup:44     @ 设置存储控制器以便使用SDRAM等外设45 46     mov r1,     #MEM_CTL_BASE       @ 存储控制器的13个寄存器的开始地址47     adrl    r2, mem_cfg_val         @ 这13个值的起始存储地址48     add r3,     r1, #52             @ 13*4 = 5449 1:  50     ldr r4,     [r2], #4            @ 读取设置值,并让r2加451     str r4,     [r1], #4            @ 将此值写入寄存器,并让r1加452     cmp r1,     r3                  @ 判断是否设置完所有13个寄存器53     bne 1b                          @ 若没有写成,继续54     mov pc,     lr                  @ 返回55 56 57 .align 458 mem_cfg_val:59     @ 存储控制器13个寄存器的设置值60     .long   0x22011110      @ BWSCON61     .long   0x00000700      @ BANKCON062     .long   0x00000700      @ BANKCON163     .long   0x00000700      @ BANKCON264     .long   0x00000700      @ BANKCON3  65     .long   0x00000700      @ BANKCON466     .long   0x00000700      @ BANKCON567     .long   0x00018005      @ BANKCON668     .long   0x00018005      @ BANKCON769     .long   0x008C07A3      @ REFRESH70     .long   0x000000B1      @ BANKSIZE71     .long   0x00000030      @ MRSRB672     .long   0x00000030      @ MRSRB7

leds.c

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

Makefile

1 sdram.bin : head.S  leds.c2     arm-linux-gcc  -c -o head.o head.S3     arm-linux-gcc -c -o leds.o leds.c4     arm-linux-ld -Ttext 0x30000000 head.o leds.o -o sdram_elf5     arm-linux-objcopy -O binary -S sdram_elf sdram.bin6     arm-linux-objdump -D -m arm  sdram_elf > sdram.dis7 clean:8     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中执行。

  

 

 

 

  

 

你可能感兴趣的文章
第3课 - 初识程序的灵魂
查看>>
WordPress插件扫描工具plecost
查看>>
【PDF】Java操作PDF之iText超入门
查看>>
PHP:第五章——字符串过滤函数
查看>>
Spring中ApplicationContextAware的用法
查看>>
flask的session解读及flask_login登录过程研究
查看>>
ElasticSearch单机多实例环境部署
查看>>
python 练习
查看>>
Centos 安装 nload
查看>>
python3简单使用requests
查看>>
由一次java作业 引起的思考
查看>>
HDU 3389 Game(博弈)
查看>>
仅IE支持clearAttributes/mergeAttributes方法
查看>>
Linux中U盘和SD卡加载卸载命令
查看>>
github push403错误的处理
查看>>
Hibernate与 MyBatis的比较
查看>>
关于百度地图API的地图坐标转换问题
查看>>
【操作系统】设备管理(五)
查看>>
ArcObject开发时,axtoolbarcontrol中一些添加的按钮是灰色的问题
查看>>
[LeetCode] Guess Number Higher or Lower 猜数字大小
查看>>