标签:ext nor flash dram art usb 目标 指令 长度 文件的
其实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 }
标签:ext nor flash dram art usb 目标 指令 长度 文件的
原文地址:https://www.cnblogs.com/lzd626/p/11517751.html