S3C2410X有两种发动方法:NOR flash发动和NAND flash发动。NOR flash发动:NOR flash能够象SDRAM那样随机读取,且读取速度快,不光能够存储程序,还能够运转程序。上电复位时,NOR flash被映射到地址0x0处,程序就能够从NOR flash中的榜首条句子开端履行。程序即能够在NORflash运转,也能够仿制到SDRAM中运转。NAND flash发动:NAND flash容量大、价格低,广泛应用于嵌入式体系中。S3C2410X集成了NAND flash控制器,可便利编程。可是,NAND flash随机读取速度慢,需专用I/O接口,只能存储程序,无法运转程序。为了能够从NAND flash发动,上电复位时,S3C2410X经过硬件逻辑把NAND flash的前4KB的内容仿制到片内SRAM中,而片内SRAM被映射到地址0x0,这样就能够从地址0x0处取到有用指令。因而,选用NAND flash发动时,有必要使用片内SRAM中的代码把NAND flash中的程序代码仿制到SDRAM中去。
这儿,笔者参阅了引导装入程序(Bootloader)的方法,把代码分红两部分,榜首部分作为引导代码,包含ARM所要求的接连8个字的中止向量表。它首要担任把NAND flash中的程序代码仿制到SDRAM中,其代码远小于4KB。第二部分是应用程序。调试时可别离独自调试,互不影响。调试完成后,别离烧写,引导代码的RO_Base设置为0x0,烧写到NANDflash的第0块。第二部分应用程序的RO_Base设置为0x3000,0000,烧写到NAND flash榜首块开端的地址空间。上电复位时,引导代码由硬件逻辑仿制到片内SRAM中,所以,ARM所要求的接连8个字的中止向量表就坐落0x0地址开端的接连空间内。接着从榜首条指令开端履行,除了一些必要的初始化以及设置中止向量表,它把NAND flash中榜首块开端的程序代码仿制到开端地址为0x3000,0000的SDRAM中。地址0x3000,0000既是RO_Base的地址,也是SDRAM在整个地址空间的开端地址。仿制完成后,引导代码也该完毕退出了,退出之前需调整PC指针,为了简略起见,把PC指针直接调整到地址0x3000,0000,即从应用程序的发动代码开端履行。需求留意的是,引导代码把中止向量表仿制到SDRAM中_ISR_StartAddress处即地址0x30ffffff,而应用程序的发动代码也把中止向量表仿制到SDRAM中同一地址_ISR_StartAddress处。这样,当反常产生时,PC指针首要跳到地址0x0开端8个字的反常向量
表,这是在片内SRAM的引导代码里。接着,跳到SDRAM中的中止向量表,这是在应用程序里,然后转到中止处理程序,PC指针的跳转跨过了两部分程序。引导代码和应用程序在存储空间和NAND flash的散布状况如图所示。完成仿制和PC指针调整的代码如下 :
IMPORT nand_read_ll ;引进外部C函数
ldr r0, =SDRAM_Base_Address ;r0指向SDRAM的基地址,即地址0x3000,0000
mov r1, =APP_Start_ Address ;r1指向NAND_flash中应用程序的开端地址;即第1块的开端地址
mov r2, =APP_End_ Address ;r2指向NAND_flash中应用程序的完毕地址
bl nand_read_ll ;调用仿制函数开端仿制
ldr r12, =SDRAM_Base_Address
mov pc, r12 ;pc指向SDRAM的基地址;引导代码到此完毕,接着从应用程序发动代码的榜首条句子开端履行。
相同道理,NOR flash发动也能够选用这种方法,不同的是,引导代码在NOR flash中,它把NOR flash中的程序代码仿制到SDRAM中,然后,也是跳到SDRAM中开端履行。