JZ2440存储管理器代码实现(使用SDRAM)

发布者:美梦小狮子最新更新时间:2021-09-24 来源: eefocus关键字:JZ2440  存储管理器  SDRAM 手机看文章 扫描二维码
随时随地手机看文章

这里写图片描述

启动文件初始化代码:

@*************************************************************************

@ File:head.S

@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行

@ 代码流程:

@1> 关看门狗

@2> 设置存储控制寄存器(配置)

@3> 复制代码到SDRAM中

@4> 设置堆栈

@5> 跳转到main执行

@*************************************************************************       


.equ        MEM_CTL_BASE,       0x48000000          @.equ 命令用于把常量值设置为可以在文本段中使用的符号

.equ        SDRAM_BASE,         0x30000000          @类似于C语言中#define

                                                    @0x48000000-BWSCON,0x30000000-BANK6


.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, #0

    ldr r2, =SDRAM_BASE

    mov r3, #4*1024

1:  

    ldr r4, [r1],#4     @ 从Steppingstone读取4字节的数据,并让源地址加4

    str r4, [r2],#4     @ 将此4字节的数据复制到SDRAM中,并让目地地址加4

    cmp r1, r3          @ 判断是否完成:源地址等于Steppingstone的末地址?

    bne 1b              @ 若没有复制完,继续

    @b:backward 向后跳转  f:forward 向前跳转  

    mov pc,     lr      @ 返回


memsetup:

    @ 设置存储控制器以便使用SDRAM等外设


    mov r1,     #MEM_CTL_BASE   @存储控制器的13个寄存器的开始地址,0x48000000

    adrl    r2, mem_cfg_val         @ 这13个值的起始存储地址

    add r3,     r1, #52             @ 13*4 = 54

1:  

    ldr r4,     [r2], #4            @ 读取设置值,并让r2加4

    str r4,     [r1], #4            @ 将此值写入寄存器,并让r1加4

    cmp r1,     r3                  @ 判断是否设置完所有13个寄存器

    bne 1b                          @ 若没有写成,继续

    @b:backward 向后跳转  f:forward 向前跳转  

    mov pc,     lr                  @ 返回


.align 4                                @以4字节对齐

mem_cfg_val:        

    @ 存储控制器13个寄存器的设置值

    .long   0x22011110      @ BWSCON   0x48000000

    .long   0x00000700      @ BANKCON0 0x48000004

    .long   0x00000700      @ BANKCON1 0x48000008

    .long   0x00000700      @ BANKCON2 0x4800000C

    .long   0x00000700      @ BANKCON3 0x48000010

    .long   0x00000700      @ BANKCON4 0x48000014

    .long   0x00000700      @ BANKCON5 0x48000018

    .long   0x00018005      @ BANKCON6 0x4800001C

    .long   0x00018005      @ BANKCON7 0x48000020

    .long   0x008C07A3      @ REFRESH  0x48000024

    .long   0x000000B1      @ BANKSIZE 0x48000028

    .long   0x00000030      @ MRSRB6   0x4800002C

    .long   0x00000030      @ MRSRB7   0x48000030


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

    #-g:加入调试信息 -c只编译不连接

    arm-linux-ld -Ttext 0x30000000 head.o leds.o -o sdram_elf

    #-Ttext 0x0000000:指定代码段起始地址为0x30000000

    arm-linux-objcopy -O binary -S sdram_elf sdram.bin

    # binary:二进制的 -S:不从源文件复制重定位信息和符号信息到目标文件中去

    arm-linux-objdump -D -m arm  sdram_elf > sdram.dis

    # -D:反汇编所有段 -m arm:指定反汇编文件使用arm架构

clean:

    rm -f   sdram.dis sdram.bin sdram_elf *.o


查看反汇编文件:

这里写图片描述
这里写图片描述
这里写图片描述

bl disable_watch_dog @连接地址0x30000000

bl memsetup @连接地址0x30000004

bl copy_steppingstone_to_sdram @连接地址0x30000008

ldr pc, =on_sdram @连接地址0x3000000c

ldr sp, =0x34000000 @连接地址0x30000010


我们在Makefile中指定了连接地址为0x30000000(0x30000000是sdram中的初始地址),而当我们在跳转到sdram之前,还有几行代码是在steppingstone运行的?为什么可以运行而不出错了?


解释:虽然19~21行连接地址都在SDRAM中,但是由于它们都是位置无关的相对跳转指令,所以可以在Steppingstone里执行。详解点我!


led.s


#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,4

        if(++i == 8)

            i = 0;

    }


    return 0;

}

关键字:JZ2440  存储管理器  SDRAM 引用地址:JZ2440存储管理器代码实现(使用SDRAM)

上一篇:零死角玩转2440下NandFlash拷贝并跳转到SDRAM的(启动过程)
下一篇:S3C2410-2440启动代码内数据复制过程的分析

推荐阅读最新更新时间:2024-10-31 16:45

多路读写的SDRAM接口设计
摘要:介绍SDRAM的主要控制信号和基本命令时序,提出一种应用于解复用的支持多路读写的SDRAM接口设计,为需要大容量存储器的电路设计提供了新思路。 关键词:SDRAM 解复用 接口 存储器是容量数据处理电路的重要组成部分。随着数据处理技术的进一步发展,对于存储器的容量和性能提出了越来越高的要求。同步动态随机存储器SDRAM(Synchronous Dynamic Random Access Memory)因其容量大、读写速度快、支持突发式读写及相对低廉的价格而得到了广泛的应用。SDRAM的控制比较复杂,其接口电路设计是关键。 本文首先介绍SDRAM的主要控制信号和基本命令;然后介绍接口电路对SDRAM的主要操作路径及操作
[应用]
OpenCV2.0.0移植到ARM9(一)(JZ2440----S3c2440)
Linux系统:Ubuntu9.10 交叉编译器:arm-linux-gcc-4.3.2(已安装) OpenCV:OpenCV-2.0.0.tar.bz2(OpenCV for Linux/Mac) CMake:cmake-2.8.12-Linux-i386.tar.gz 1、OpenCV解压 将OpenCV-2.0.0.tar.bz2放到/work/systems/下。 解压命令: tar -jxvf OpenCV-2.0.0.tar.bz2 2、CMake解压: 将cmake-2.8.12-Linux-i386.tar.gz放到/work/tools/目录下 解压命令 :tar -zxv
[单片机]
OpenCV2.0.0移植到ARM9(一)(JZ2440----S3c2440)
具无痕迹存储器和篡改检测功能的低功耗安全管理器
      Maxim推出安全管理器MAX36051。器件具有128字节无痕迹存储器,可安全存储敏感数据,待机模式下消耗极低的电池电流(1.5µA)。内部篡改监视电路和篡改检测输入连接至外部传感器,为终端用户提供极高的系统安全等级。该器件具有超低功耗,可理想用于小容量电池供电系统。MAX36051非常适合需要篡改检测、安全存储数据并且要求超低功耗的应用,例如安全USB、电表和销售终端(POS)。       MAX36051能够以超低功耗提供篡改检测功能,与电源无关。片内电池备份控制器持续监测主电源(VCC),当主电源电压过低或未连接主电源时,自动切换至电池(VBAT)供电。为进一步降低电池损耗,该款安全管理器还具有多种
[电源管理]
具无痕迹<font color='red'>存储</font>器和篡改检测功能的低功耗安全<font color='red'>管理器</font>
06-S3C2440学习之移植2012u-boot到S3C2440(移植过程一)新建单板+修改时钟+SDRAM+UART
移植u-boot-2012.04之建新单板_时钟_SDRAM_UART (1)新建单板目录,以及配置头文件 tar xjf u-boot-2012.04.01.tar.bz2 cd u-boot-2012.04.01 cd board/samsung/ cp smdk2410 smdk2440 –rf cd ../.. cd /include/configs/ cp smdk2410.h smdk2440.h (2) 修改 boards.cfg: 仿照 smdk2410 arm arm920t - samsung s3c24x0 添加: smdk244
[单片机]
06-S3C2440学习之移植2012u-boot到S3C2440(移植过程一)新建单板+修改时钟+<font color='red'>SDRAM</font>+UART
Blob在S3C44B0上的移植
引 言   Bootloader对于嵌入式设备来说至关重要,它涉及到许多硬件相关的知识。对于自制的嵌入式开发板,它又是不可跳过的步骤,所以很多人对于它感到很头痛。本文将以一款优秀的Bootloader Blob为例,详细讲解它的运行原理以及在S3C44B0通用处理器上的移植过程,为在嵌入式设备上的后续软件开发打下基础 。 1 Blob简介   Blob是Boot Loader Object的缩写,是一款功能强大的Bootloader。它遵循GPL,源代码完全开放。Blob既可以用来简单的调试,也可以启动Linux kernel。Blob最初是Jan-Derk Bakker和Erik Mouw为一块名为LART(Linux A
[单片机]
Blob在S3C44B0上的移植
DDR4 SDRAM为航天领域开创新时代
为了发掘宇航市场的潜力,卫星运营商正通过提供增值服务,如超高分辨率成像、流媒体视频直播和星上人工智能,提升星上处理的能力以减少下行链路的需求。从2019年到2024年,高吞吐量载荷的市场需求预计增长12倍,带宽增加至26500 Gbps。 上述的所有应用都和存储器的容量和速度密切相关。实时存储前向高吞吐量载荷基于支持GHz I/O速率的FPGA、存储器、宽带ADC和DAC。例如,一个12位1.5Gsps采样率的ADC每秒产生18Gb的原始数据。一分钟的压缩SAR信息需要大约70Gb的存储容量。这对现有的宇航级存储器解决方案的I/O带宽、访问时间、功耗、物理尺寸和存储容量提出了很大的挑战。 一个数字高吞吐量载荷的典型架构如下
[嵌入式]
DDR4 <font color='red'>SDRAM</font>为航天领域开创新时代
mini2440的SDRAM分析
首先是2440的存储控制器: 暂时不管是从nand启动还是nor启动,因为我现在只关注内存,从上图可以看到由2440的Memory Controller可以寻址的范围是0x0000,0000---0x4000,0000,总共是1G,这1G又分为8个bank,bank0-bank7,每个bank为128M, 8*128M=1G。其中bank0-bank5这6个bank是只能接SROM,那么什么是SROM,2440数据手册的221页说明了,SROM是ROM或者SRAM。    通用存储设备: 内存存储设备的存储方式:ROM,RAM ROM(Read-Only Memory):只读存储器,是一种只能读出事先所存数据的固态半导体存储器
[单片机]
mini2440的<font color='red'>SDRAM</font>分析
存储器的操作
@************************************************************************* @ File:head.S @ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行 @************************************************************************* .equ MEM_CTL_BASE, 0x48000000 .equ SDRAM_BASE, 0x30000000 .text .global _start _
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved