从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 nand sdram启动时代码的运行转移过程
推荐阅读最新更新时间:2024-03-16 16:09