历史上的今天

今天是:2024年09月24日(星期二)

正在发生

2021年09月24日 | JZ2440存储管理器代码实现(使用SDRAM)

发布者:美梦小狮子 来源: 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启动代码内数据复制过程的分析

推荐阅读

工业机器人何时才能实现“国产化”?我想这个问题换成“国产核心零部件何时才能崛起”可能更贴切些。长久以来,核心零部件的缺失始终是横在工业机器人国产化道路上的一块大石,国产零部件厂家也一直是在夹缝中求生存,尽管发展缓慢,但近年来随着政府政策支持,资本的进入,国产核心零部件也取得了一些突破。国产主要减速机企业一览表可以看出,目前国内主...
一 在STM32F1x系列串口通信实验中,常用的寄存器有:(1)USART_SR 状态寄存器 (2)USART_DR 数据寄存器 (3)USART_BRR 波特率寄存器 (4) USART_CR 使能位 二 串口操作相关的库函数(省略入口参数):(1)void USART_Init() ; //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能(2)void USART_Cmd ; //使...
全球半导体解决方案供应商瑞萨电子集团宣布加入被誉为全球半导体行业之声的全球半导体联盟(GSA)。 瑞萨电子CEO柴田英利表示:“对瑞萨此次加入全球半导体联盟我感到十分荣幸。作为GSA成员,瑞萨将积极与合作伙伴、业界同仁进行更深入的合作,以加速技术进步并促进半导体行业发展。” GSA联合创始人兼CEOJodi Shelton表示:“瑞萨能够成为GSA的一员,我...
据外媒Techspot报道,从原材料到芯片和其他基本部件的短缺正在对电子和汽车行业产生连锁反应,但这仅仅是开始。北美、亚洲和欧洲的供应商现在正面临着一个更大的问题--在需求比多年前更高的时候,寻找技术工人来维持工业机器运转的难度和成本不断增加。  持续的芯片短缺已经给许多科技公司的供应链带来了很大的压力。不过,还有一个更大的问题笼罩着电子...

史海拾趣

问答坊 | AI 解惑

高密度组装X波段有源相控阵T/R模块

摘 要:介绍了应用一种新的高密度组装技术来降低X波段有源阵列雷达的成本!重量及体积\"文中介绍的组件使用了多层AlN基板!倒装单片微波集成电路芯片(MMIC)!共面波导传输线及无需焊接的用于互连的毛钮扣\"论述了设计优化!组件结构与组装技术以及测试结 ...…

查看全部问答∨

高可靠容错MIL-STD-1553A/B总线控制器IP核

FBIP1553FT ——高可靠容错MIL-STD-1553A/B总线控制器IP核 1.遵循MIL-STD-1553A/B标准,支持MIL-STD-1553A/B规定的全部协议 2.可由软件配置为BC、BM或者RT 3.寄存器操作同BU6158X完全兼容 4.采用容错设计,大大提高总线控制器可靠性 可纠正存 ...…

查看全部问答∨

LED产品不容忽视的几个问题

replyreload += \',\' + 370452;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答∨

如何在win ce下设置图片的3D凸起效果?(C#) 谢谢了!

如何在win ce下设置图片的3D凸起效果?(C#) 谢谢了!…

查看全部问答∨

ActiveSync安装出错

我在安装ActiveSync的时候出了个错,错误提示为“写入文件时出错:C:\\Program Files\\Microsoft ActiveSync\\wcesmgr.exe,请验证您有权访问该目录” 请问这是怎么回事,我重启过机器,还是不行,并且我用的就是administrator账户,在其他的机子上 ...…

查看全部问答∨

开发CASIO IT500 (WinCE4.1)和电脑通讯的程序,需要哪些东西

我是个新手 我要在CASIO it500上开发一个软件, 请问 1:用VS2005,可以么? 2:开发语言用c#,it500支持吧? 3:开发这个软件,好像不能用虚拟机吧,因为it500有扫描功能,vs2005自带的虚拟软件,没有扫描功能。 4:和PC通讯,需要学习那些 ...…

查看全部问答∨

最近忙了!

最近忙了,最近一直很少逛论坛! 申请的开发套件被闲置一周了!眼看就只有一周就要交板子了!我真的不好意思!对不起板子! 更对不起我们论坛这次活动啊!我特此申请:soso姐能不能让我缓一下再交呢?最多缓期是几天呢?最近一两天我会把前几天做的 ...…

查看全部问答∨

TSP分布式控制提高了测试速度并且降低了测试成本

TSP技术通过允许用户使用标准的PC控制或者创建在仪器内的微处理器上执行的嵌入式测试脚本,增强了仪器控制。通过使用TSP测试脚本而非PC用于仪器控制,能够避免PC控制器和仪器之间的通信延迟,这提高了测试产能。测试脚本可以包含数学和判决规则, ...…

查看全部问答∨

Orcad Capture CIS删除一个元件后自动编号,导入网表到allegro出现DRC

例如我画了10个电阻,编号为R1~R10,allegro里面已经画好连线了。然后在原理图把R5给删除了,重新自动编号,然后导入网表,原先的R7变成了R6,占用了原先R6的位置,然后就提示DRC错误了。请问这种情况怎么处理。谢谢。…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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