arm9_NANDFlash

匿名 (未验证) 提交于 2019-12-03 00:04:02

其实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 } 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!