首页 > 其他分享 >jz2440存储管理实验【学习笔记】

jz2440存储管理实验【学习笔记】

时间:2022-12-20 11:32:26浏览次数:42  
标签:存储管理 SDRAM jz2440 sdram long pc 笔记 设置 寄存器

平台:jz2440

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

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

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

jz2440存储管理实验【学习笔记】_寄存器

 

一、原理图:

  

jz2440存储管理实验【学习笔记】_引脚_02

jz2440存储管理实验【学习笔记】_寄存器_03

jz2440存储管理实验【学习笔记】_寄存器_04

 

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不接。

 

jz2440存储管理实验【学习笔记】_引脚_05

 

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

    

jz2440存储管理实验【学习笔记】_引脚_06

二、配置sdram

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

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

           因此BWSCON设置为0x22011110

     

jz2440存储管理实验【学习笔记】_寄存器_07

 

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

 

 

jz2440存储管理实验【学习笔记】_引脚_08

 

jz2440存储管理实验【学习笔记】_引脚_09

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   

jz2440存储管理实验【学习笔记】_寄存器_10

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

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

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

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

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

64ms refresh period (8K Cycle) ,因此刷新周期为64ms/8192=7.8125us,此时我们还没有使用pll,sdram的时钟频率为12M,因此refresh_count=2^11+1-12*7.8125=1955,因此REFRESH设置为0x008c07a3。

 

  

jz2440存储管理实验【学习笔记】_数据_11

 

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

jz2440存储管理实验【学习笔记】_寄存器_12

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

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

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

 

jz2440存储管理实验【学习笔记】_数据_13

 

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 .text
10 .global _start
11 _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 main
19 halt_loop:
20 b halt_loop
21
22 disable_watch_dog:
23 @ 往WATCHDOG寄存器写0即可
24 mov r1, #0x53000000
25 mov r2, #0x0
26 str r2, [r1]
27 mov pc, lr @ 返回
28
29 copy_steppingstone_to_sdram:
30 @ 将Steppingstone的4K数据全部复制到SDRAM中去
31 @ Steppingstone起始地址为0x00000000,SDRAM中起始地址为0x30000000
32
33 mov r1, #0
34 ldr r2, =SDRAM_BASE
35 mov r3, #4*1024
36 1:
37 ldr r4, [r1],#4 @ 从Steppingstone读取4字节的数据,并让源地址加4
38 str r4, [r2],#4 @ 将此4字节的数据复制到SDRAM中,并让目地地址加4
39 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 = 54
49 1:
50 ldr r4, [r2], #4 @ 读取设置值,并让r2加4
51 str r4, [r1], #4 @ 将此值写入寄存器,并让r1加4
52 cmp r1, r3 @ 判断是否设置完所有13个寄存器
53 bne 1b @ 若没有写成,继续
54 mov pc, lr @ 返回
55
56
57 .align 4
58 mem_cfg_val:
59 @ 存储控制器13个寄存器的设置值
60 .long 0x22011110 @ BWSCON
61 .long 0x00000700 @ BANKCON0
62 .long 0x00000700 @ BANKCON1
63 .long 0x00000700 @ BANKCON2
64 .long 0x00000700 @ BANKCON3
65 .long 0x00000700 @ BANKCON4
66 .long 0x00000700 @ BANKCON5
67 .long 0x00018005 @ BANKCON6
68 .long 0x00018005 @ BANKCON7
69 .long 0x008C07A3 @ REFRESH
70 .long 0x000000B1 @ BANKSIZE
71 .long 0x00000030 @ MRSRB6
72 .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,4
22 if(++i == 8)
23 i = 0;
24 }
25
26 return 0;
27 }

Makefile

1 sdram.bin : head.S  leds.c
2 arm-linux-gcc -c -o head.o head.S
3 arm-linux-gcc -c -o leds.o leds.c
4 arm-linux-ld -Ttext 0x30000000 head.o leds.o -o sdram_elf
5 arm-linux-objcopy -O binary -S sdram_elf sdram.bin
6 arm-linux-objdump -D -m arm sdram_elf > sdram.dis
7 clean:
8 rm -f sdram.dis sdram.bin sdram_elf *.o

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

jz2440存储管理实验【学习笔记】_寄存器

 

 

  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存储管理实验【学习笔记】_引脚_15

jz2440存储管理实验【学习笔记】_数据_16

 

 

觉得不错,就给我点小支持吧,蟹蟹

 


 



标签:存储管理,SDRAM,jz2440,sdram,long,pc,笔记,设置,寄存器
From: https://blog.51cto.com/u_8475449/5954677

相关文章

  • sensor【学习笔记】
    高通sensor相关介绍不错的文章高通sensor的校准流程高通sensorlightsensor的背光调节 androidpsensor相关博客Phone通话过程中PSensor工作流程--不全    阈值比较......
  • MNIST机器学习入门【学习笔记】
    平台信息:PC:ubuntu18.04、i5、anaconda2、cuda9.0、cudnn7.0.5、tensorflow1.10、GTX1060作者:庄泽彬(欢迎转载,请注明作者)说明:本文是在tensorflow社区的学习笔记,MNIST手写......
  • ubuntu16.04安装tensorflow官方教程与机器学习资料【学习笔记】
    tensorflow官网有官方的安装教程:​​https://www.tensorflow.org/install/install_linux​​google的机器学习官方快速入门教程:​​https://developers.google.com/machin......
  • 计算机科学导论-第三版-学习笔记-chapter1
    小测验的网站找不到,小程序也找不到,这两个部分的习题就不做了。CengageLearning-FoundationsofComputerScience这上面有部分答案。说是学习笔记,但大部分都是做题记......
  • 【JAVA笔记】JAVA的Scanner类、String类的判断功能、String类的获取功能、String类的
    一、Scanner类1、说明:Scanner类主要用于扫描用户从控制台输入的文本,即当用户需要输入数据时,调用java.util包中的Scanner类,Scanner类能获取用户所输入的数据。如何使用Sc......
  • pytorch 笔记之 model.eval() 和 with torch.no_grad()
    model.eval()负责改变batchnorm、dropout的工作方式,如在eval()模式下,dropout是不工作的。torch.no_grad()负责关掉梯度计算,节省eval的时间。只进行inference时,model.ev......
  • CS22计导复习笔记
    CS22计导复习笔记一家之言,仅供参考,以实际为准。有疑义,是你对。——LeeHero/*题量:8题*/【for循环.python程序设计】>eg.算e/pi>要求精简,不能重复计......
  • Git 笔记 - 程序员都要掌握的 Git
    前言本文是参考廖雪峰老师的Git资料再加上我自己对Git的理解,记录我的Git学习历程,作下此文是为以后学习,工作,开发中如果遇到问题可以回过头来参考参考。因为水平有限,难免会......
  • 数论笔记【2】素数分布初探
    基于欧几里得的证明定义2.1定义函数\(\pi(x)\)为小于等于\(x\)的素数的个数,即\[\pi(x)=\left|\{p|p\lex,p\in\mathbb{P}\}\right|\]这个函数可以反映素数的分......
  • Yellowbrick使用笔记3-特征分析可视化
    特征分析可视化工具设计用于在数据空间中可视化实例,以便检测可能影响下游拟合的特征或目标。因为ML操作高维数据集(通常至少35个),可视化工具将重点放在聚合、优化和其他技术......