?? head.s
字號(hào):
@******************************************************************************@ File:head.s@ 功能:設(shè)置SDRAM,將程序復(fù)制到SDRAM,然后跳到SDRAM繼續(xù)執(zhí)行@****************************************************************************** .extern main.text .global _start _start:@****************************************************************************** @中斷向量,除Reset和HandleIRQ外,其它異常都沒有使用(如果不幸發(fā)生了,將導(dǎo)致死機(jī))@****************************************************************************** b Reset@ 0x04: Undefined instruction exceptionHandleUndef: b HandleUndef @ 0x08: Software interrupt exception HandleSWI: b HandleSWI@ 0x0c: Prefetch Abort (Instruction Fetch Memory Abort)HandlePrefetchAbort: b HandlePrefetchAbort@ 0x10: Data Access Memory AbortHandleDataAbort: b HandleDataAbort@ 0x14: Not usedHandleNotUsed: b HandleNotUsed@ 0x18: IRQ(Interrupt Request) exception b HandleIRQ@ 0x1c: FIQ(Fast Interrupt Request) exceptionHandleFIQ: b HandleFIQReset: @函數(shù)disable_watch_dog, memsetup, init_nand, nand_read_ll在init.c中定義 ldr sp, =4096 @設(shè)置堆棧 bl disable_watch_dog @關(guān)WATCH DOG bl memsetup @初始化SDRAM bl init_nand @初始化NAND Flash @將NAND Flash中地址4096開始的1024字節(jié)代碼(main.c編譯得到)復(fù)制到SDRAM中 @nand_read_ll函數(shù)需要3個(gè)參數(shù): ldr r0, =0x30000000 @1. 目標(biāo)地址=0x30000000,這是SDRAM的起始地址 mov r1, #4096 @2. 源地址 = 4096,連接的時(shí)候,main.c中的代碼都存在NAND Flash地址4096開始處 mov r2, #1024 @3. 復(fù)制長(zhǎng)度= 1024(bytes),對(duì)于本實(shí)驗(yàn)的main.c,這是足夠了 bl nand_read_ll @調(diào)用C函數(shù)nand_read_ll msr cpsr_c, #0xd2 @進(jìn)入中斷模式 ldr sp, =0x33000000 @設(shè)置中斷模式堆棧 msr cpsr_c, #0xdf @進(jìn)入系統(tǒng)模式 ldr sp, =0x34000000 @設(shè)置系統(tǒng)模式堆棧 bl Timer0_init @調(diào)用Timer0初始化函數(shù),在init.c中 bl init_irq @調(diào)用中斷初始化函數(shù),在init.c中 msr cpsr_c, #0x5f @設(shè)置I-bit=0,開IRQ中斷 ldr lr, =halt_loop @設(shè)置返回地址 ldr pc, =main @b指令和bl指令只能前后跳轉(zhuǎn)32M的范圍,所以這里使用向pc賦值的方法進(jìn)行跳轉(zhuǎn)halt_loop: b halt_loopHandleIRQ: sub lr, lr, #4 @計(jì)算返回地址 stmdb sp!, { r0-r12,lr } @保存使用到的寄存器 ldr lr, =int_return @設(shè)置返回地址 ldr pc, =Timer0_Handle @調(diào)用中斷處理函數(shù),在interrupt.c中int_return: ldmia sp!, { r0-r12,pc }^ @中斷返回, ^表示將spsr的值復(fù)制到cpsr
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -