其实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)来使用这个变量
$@ 表示目标文件
$^ 表示所有依赖文件
$< 表示第一个依赖文件

posted on 2019-09-13 21:49  lzd626  阅读(238)  评论(0编辑  收藏  举报