S3C2440 跳到 SDRAM 中执行程序

发布者:科技独行者最新更新时间:2018-07-22 来源: eefocus关键字:S3C2440  SDRAM  执行程序 手机看文章 扫描二维码
随时随地手机看文章

从Nandflash启动CPU时,CPU会通过内部的硬件将Nandflash开始的4KB数据复制到为Steppingstone的4Kb的内部RAM中(起始地址为0)


然后跳到0地址开始执行.


我们这个例子是先使用汇编语言设置好存储控制器,使我们外接的SDRAM可用,然后把程序本身从Steppingstone复制到SDRAM处,


最后跳到SDRAM中执行.


程序的什么关看门狗,设置存储控制器,复制代码到SDRAM中都比较简单,


程序跳入到C程序之前要设置栈供C程序使用!!!


ldr sp, =0x34000000                 @ 设置堆栈

栈设置在顶部,自上而下.



写这篇记录博客的原因最重要的是:


ldr pc, =on_sdram                   @ 跳到SDRAM中继续执行

这句,这个得弄明白,说实话,我对这个跳转有时候很清楚,有时候又感到模糊.

首先:


Makefile中的文件,

连接地址为0x30000000,是指运行时程序应该位于的地址.即是我们SDRAM的起始地址.


在反汇编中我们可以看到:


ldr pc, =on_sdram                   @ 跳到SDRAM中继续执行

就相当于一个取地址指令,

当前该指令地址的PC=当前该指令地址 + 8;

即是PC = 0x0c +8 ;


就是到0xA4的地址,也就是0x300000A4;




所以:



程序跳到SDRAM的0x30000010; 即是:




对应上了跳到on_sdram,

对应上程序执行的图示:注意PC的所指位置:


1.



2.



3.



4.


程序在SDRAM中执行感觉慢是因为SDRAM的性能比内部SRAM差一些.

这样拷贝小于4KB的程序到SDRAM中运行,感觉多此一举,

但是我们程序要是大于4KB的话,这个就是不可避免要采用的方法,

但是要复制Nandflash4KB后面的代码需要使用Nandflash控制器来读取Nandflash.

汇编代码具体如下,我贴了出来:


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

@ 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, #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              @ 若没有复制完,继续

    mov pc,     lr      @ 返回

 

memsetup:

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

 

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

    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                          @ 若没有写成,继续

    mov pc,     lr                  @ 返回

 

 

.align 4

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


关键字:S3C2440  SDRAM  执行程序 引用地址:S3C2440 跳到 SDRAM 中执行程序

上一篇:存储控制器与外设之间的关系
下一篇:S3C2440 nand sdram启动时代码的运行转移过程

推荐阅读最新更新时间:2024-03-16 16:09

s3c2440 MPLL & UPLL
S3C2440有两个PLL(phase locked loop)一个是MPLL,一个是UPLL。 MPLL用于CPU及其他外围器件,UPLL用于USB。用于产生FCLK, HCLK, PCLK三种频率,这三种频率分别有不同的用途: FCLK是CPU提供的时钟信号。 HCLK是为AHB总线提供的时钟信号, Advanced High-performance Bus,主要用于高速外设,比如内存控制器,中断控制器,LCD控制器, DMA 等。 从S3C2440的DataSheet里可以看到,S3C2440最大支持400MHz的主频,但是这并不意味着一定工作在400MHz下面,可以通过设定MPLL, UPLL寄存器来设定CPU的工作
[单片机]
win7下keil4开发s3c2440裸机的开发环境搭建
ADS在win7下不稳定并且官方早就已经不更新,并且本人常用MDK进行嵌入式软件开发,MDK简单好用,功能强大,所以想用MDK来进行开发S3C2440的裸机开发。从网上找里好多大神的博客,搭建环境时,出现很多奇怪的问题,写此博客一是记录一下,二是想让新搭建环境的同行少走一些弯路。 1、平台 1)、操作系统:win7 64位 2)、KEIL版本:4.74 3)、jlink V9下载器 4)、开发板:FL2440 keil软件以及jlink驱动安装可自行百度安装。 2、新建工程 2.1、选择project下的New uVision Project新建个工程 设置工程路径以及工程名字 ##2.2、选
[单片机]
win7下keil4开发<font color='red'>s3c2440</font>裸机的开发环境搭建
基于嵌入式CPU S3C2440的VGA显示系统设计
   目前很多 SOC 厂商的微处理器芯片都集成了LCD控制器,如三星公司的S3C2410.S3C2440,Intel的Xscale系列等。大多数 嵌入式系统 也采用流行的LCD显示技术。但是在需要大屏幕显示、对分辨率要求不高的场合,如车间、厂房,采用大屏幕LCD则成本过高。另一方面,VGA显示技术因为技术发展成熟,成本低廉,仍在被大量使用,直到今天它仍是所有显示终端最为成熟的标准接口。如果让嵌入式处理器直接支持VGA显示器,则能很大地利用现有资源,节约系统成本。   1 基于S3C2440的VGA显示技术分析   通过分析VGA显示技术的时序逻辑与S3C2440内部集成LCD控制器驱动TFT LCD的时序逻辑,找出它们的共同
[电源管理]
基于嵌入式CPU <font color='red'>S3C2440</font>的VGA显示系统设计
S3C2440 热拔插驱动 修改mdev配置支持U盘自动挂载(三十三)
1、当我们每次插入U盘后,都会自动创建U盘的设备节点/dev/sda%d 这是因为里面调用了device_create()实现的,busybox的mdev机制就会根据主次设备号等信息,在/dev目录下创建设备节点,如下图所示: 而想使用上面的sda1设备节点,读写数据时,还需要使用mount /dev/sda1 /mnt来挂在U盘才行,会显得很麻烦,如下图所示: 2、其实,可以在/etc/mdev.conf文件里加入一行语句就能实现自动装载u盘,也可以在里面干其他与设备节点相关的事 2.1 而/etc/mdev.conf又是什么? 它是属于mdev的一个配置文件,而mdev之前就讲过了,它主要的功能是管理/de
[单片机]
<font color='red'>S3C2440</font> 热拔插驱动  修改mdev配置支持U盘自动挂载(三十三)
ARM与SDRAM芯片的联接
通常ARM芯片内置的内存很少,要运行Linux,需要扩展内存。ARM9扩展内存使用SDRAM内存,ARM11使用 DDR SDRAM。以ARM9核心的S3C2440为例,介绍一下内存的扩展。 S3C2440通常外接32位64MBytes的SDRAM,采用两片16位256Mbits的SDRAM芯片(如HY57V561620),SDRAM芯片通过地址总线、数据总线、若干控制线与S3C2440芯片相连。 S3C2440的地址总线:27根地址线----ADDR 。 S3C2440的数据总线:32根数据线----DATA 。 S3C2440的SDRAM控制线: 1、SDRAM片选----nGCS6(对应ARM的地址0x3000 0
[单片机]
新版U-boot2012.04.01移植(一)(JZ2440-S3C2440)
新版U-boot2012.04.01移植(一)(JZ2440-S3C2440) u-boot下载地址:http://www.denx.de/wiki/U-Boot/ 我们这里要下载的u-boot版本为:u-boot-2012.04.01tar.bz2 下载步骤如下: 下载完成后,在linux下进行试验: 1、初试 进行解压缩:tar xjf u-boot-2012.04.01.tar.bz2 进入目录: cd u-boot-2012.04.01/ cd u-boot-2012.04.01/ 进行配置: make smdk2410_config 编译: make 最后会出现编译错误:“arm
[单片机]
新版U-boot2012.04.01移植(一)(JZ2440-S3C2440)
s3c2440对K9F2G08UOB Nand Flash的简单操作函数
功能:先擦除一块nand flash地址,然后往里面写一字符串,最后再读出来 实现,擦除、写、读功能。 芯片型号:K9F2G08UOB /**************************************************** 擦除nand flash 0x500000 地址 主函数:erase.c ****************************************************/ #define NFCONF *(volatile unsigned long *)0x4E000000 #define NFCONT *(volatile unsigned long *)0x4E000004
[单片机]
mini2440也即S3C2440地址分配问题
写这篇文章完全是回答一个网友的问题,因为我之前也是对这里不理解,现在简单说一下。源引问题“mini2440的地址到底是怎么分配的呢?内部rom ram 外部的ram和rom分别占用的地址是多少啊,我从板子上看到有3个k4561632N芯片还有一个S29AL016J70TF102.但是看了相关的电路图也不知道他的地址是怎么分配的” 你问的是mini2440的地址怎么分配。我只能再细节一下你的问题,mini2440处理器的地址怎么分配。mini2440的处理器是S3C2440,理论上,S3C2440处理器可以使用的物理地址空间可以达到4GB,其中前1GB的地址(也就是0x0000 0000--0x4000 0000)为外设地址空间
[单片机]
mini2440也即<font color='red'>S3C2440</font>地址分配问题
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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