arm9_NANDFlash
其实nand flash和nor flash的区别已经没什么好说的了,这里单说在arm9里的启动方式:由于nor有自己独立的地址线和数据线,可以直接运行程序;但nand地址数据公用,启动时cpu只会拿前4KB数据去sram运行,所以对于大于4KB的程序,就要考虑如何完整的实现程序了?即将4KB之后的程序通过在前4KB中复制到sdram中继续运行;项目中用过一款芯片cypres usb3014,虽是arm9的核,他的sram有512kb,而且用的是封装过的thread x实时操作系统,一般512kb足够,外接一个spi_flash就可以了;话题转回来!看下面代码:
.s
.text
.global _start
_start:
ldr sp, =4096 @设置堆栈
bl disable_watch_dog @关WATCH DOG
bl memsetup @初始化SDRAM
bl nand_init @初始化NAND Flash
@将NAND Flash中地址4096开始的1024字节代码(main.c编译得到)复制到SDRAM中
@nand_read_ll函数需要3个参数:
ldr r0, =0x30000000 @1. 目标地址=0x30000000,这是SDRAM的起始地址
mov r1, #4096 @2. 源地址 = 4096,连接的时候,main.c中的代码都存在NAND Flash地址4096开始处
mov r2, #2048 @3. 复制长度= 2048(bytes),对于本实验的main.c,这是足够了
bl nand_read @调用C函数nand_read,不同型号大同小异
ldr sp, =0x34000000 @设置栈
ldr lr, =halt_loop @设置返回地址;一是用来保存子程序返回地址;二是当异常发生时,LR中保存的值等于异常发生时PC的值减4(或者减2),因此在各种异常模式下可以根据LR的值返回到异常发生前的相应位置继续执行。
ldr pc, =main @b指令和bl指令只能前后跳转32M的范围,所以这里使用向pc赋值的方法进行跳转
halt_loop:
b halt_loop
.lds(链接脚本)
SECTIONS {
firtst 0x00000000 : { head.o init.o nand.o} //这三个文件的运行地址为0,生成的映像文件的偏移地址也为0
second 0x30000000 : AT(4096) { main.o } //这个文件的运行地址为0x30000000,生成的映像文件的偏移地址也为4096
}
Makefile
objs := head.o init.o nand.o main.o
nand.bin : $(objs)
arm-linux-ld -Tnand.lds -o nand_elf $^
arm-linux-objcopy -O binary -S nand_elf $@
arm-linux-objdump -D -m arm nand_elf > nand.dis
%.o:%.c
arm-linux-gcc -Wall -c -O2 -o $@ $<
%.o:%.S
arm-linux-gcc -Wall -c -O2 -o $@ $<
clean:
rm -f nand.dis nand.bin nand_elf *.o
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值
其中 objs 是代表的一个变量,后面就可以使用$(objs)来使用这个变量
$@ 表示目标文件
$^ 表示所有依赖文件
$< 表示第一个依赖文件
转载于//www.cnblogs.com/lzd626/p/11517751.html
还没有评论,来说两句吧...