?? start.s
字號:
INCLUDE AT91RM9200.inc_STACK_BASEADDRESS EQU 0x00002F00;/*0x21ff8000//*/0x00002F00//2400_MMUTT_STARTADDRESS EQU 0x00002F00;/*0x21ff8000//*/0x00002F00//2400_ISR_STARTADDRESS EQU 0x00003000;/*0x21ffff00//*/0x00003000;Pre-defined constantsUSERMODE EQU 0x10FIQMODE EQU 0x11IRQMODE EQU 0x12SVCMODE EQU 0x13ABORTMODE EQU 0x17UNDEFMODE EQU 0x1bMODEMASK EQU 0x1fNOINT EQU 0xc0I_BIT EQU 0x80F_BIT EQU 0x40T_BIT EQU 0x20 AREA reset, CODE, READONLY ENTRY EXPORT __ENTRY__ENTRY ResetEntry b ResetHandler ldr pc, =HandlerUndef ;handler for Undefined mode ldr pc, =HandlerSWI ;handler for SWI interrupt ldr pc, =HandlerPabort ;handler for PAbort ldr pc, =HandlerDabort ;handler for DAbort ldr pc, =. ;reserved ldr pc, =HandlerIRQ ;handler for IRQ interrupt; ldr pc, [pc,#-0xF20] ;IRQ : read the AIC ldr pc, =HandlerFIQ ;handler for FIQ interrupt EXPORT this_machine_ipthis_machine_ip DCD (192<<24)|(168<<16)|(2<<8)|(223) MACRO$HandlerLabel HANDLER $HandleLabel$HandlerLabel sub sp, sp, #4 ;decrement sp(to store jump address) stmfd sp!, {r0} ;PUSH the work register to stack(lr does't push because it return to original address) ldr r0, =$HandleLabel ;load the address of HandleXXX to r0 ldr r0, [r0] ;load the contents(service routine start address) of HandleXXX str r0, [sp, #4] ;store the contents(ISR) of HandleXXX to stack ldmfd sp!, {r0, pc} ;POP the work register and pc(jump to ISR) MEND LTORG HandlerFIQ HANDLER HandleFIQHandlerIRQ HANDLER HandleIRQHandlerUndef HANDLER HandleUndefHandlerSWI HANDLER HandleSWIHandlerDabort HANDLER HandleDabortHandlerPabort HANDLER HandlePabortIsrIRQ sub sp, sp, #4 ;reserved for PC stmfd sp!,{r8-r9} ldr r9, =AT91C_BASE_AIC mov r8, r9 ldr r9, [r9, #AIC_ISR] and r9, r9, #0x1f add r8, r8, r9, lsl #2 ldr r8, [r8, #AIC_SVR] str r8, [sp, #8] ldmfd sp!,{r8-r9,pc} ; * the actual reset codeResetHandler ;Set up User Mode, set User Mode Stack and disable interrupts msr CPSR_c, #(SVCMODE|I_BIT|F_BIT) ;------------------------------------------------------------------------------;Step 1.;------------------------------------------------------------------------------;-Enabling the Main Oscillator;-Normally First instruction in PMC initialisation;------------------------------------------------------------------------------;-Main oscillator Enable register APMC_MOR : Enable main oscillator , OSCOUNT = 0xFF ldr r1, = AT91C_BASE_CKGR ; Get the CKGR Base Address ldr r0, = AT91C_CKGR_MOSCEN:OR:AT91C_CKGR_OSCOUNT str r0, [r1, #CKGR_MOR] ; set the cpu to SVC32 mode ; mrs r0, cpsr; bic r0, r0, #0x1f; orr r0, r0, #0x13; msr cpsr_cf, r0 ; relocate exeception table ;/*復(fù)制ResetEntry處的異常向量表到0開始的地方 adr r0, ResetEntry ;r0 <-- ResetEntry處地址 mov r1, #0 ;r1 = 0; mov r2, #16 ;r2 = 16;copyex subs r2, r2, #1 ;r2 -- ldr r3, [r0], #4 ;r3 = *r0, r0 +=4 str r3, [r1], #4 ;*r1 = r3, r1 +=4; bne copyex ;*/ IMPORT LowLevelInit ; ldr r1, =0x204000;=SVCStack; bic r1, r1, #3 ; Insure word alignement; mov sp, r1 ; Init stack SYS mov sp, #0x204000 ;//sp設(shè)為2M+16K的地方 bl LowLevelInit ;//跳到低級初始化去執(zhí)行 ;Initialize stacks bl InitStacks ;//跳到初始化棧去執(zhí)行 copy_proc_beg adr r0, ResetEntry ;//r0 <=ResetEntry處地址 ldr r2, BaseOfROM ;//r2 = BaseOfROM cmp r0, r2 ;//比較r0和r2大小 if(r0==r2){ldreq r0,TopOfROM,b InitRam} ldreq r0, TopOfROM ;//假如r0==r2執(zhí)行r0=TopOfROM beq InitRam ;//假如r0==r2跳到InitRam去執(zhí)行 ldr r3, TopOfROM ;//r3 = TopOfROM0 ;/*拷備ResetEntry地址開始的程序到RO段 ldmia r0!, {r4-r7} ;//*r0-->{r4-r7} stmia r2!, {r4-r7} ;//{r4-r7}-->*r2 cmp r2, r3 bcc %B0 ;*/ sub r2, r2, r3 ;//r2 -=r3 sub r0, r0, r2 ;//r0 -=r2 InitRam ldr r2, BaseOfBSS ;//r2 = BaseOfBSS//RW開始處地址 ldr r3, BaseOfZero ;//r3 = BaseOfZero//0初始基地址0 ;/*拷貝RAM內(nèi)容到RW段 cmp r2, r3 ;//if (r2<r3) {ldr r1,[r0],#4 str r1,[r2],#4 b %B0} ldrcc r1, [r0], #4 ;//執(zhí)行l(wèi)dr r1,[r0],#4 假如Carry Clear strcc r1, [r2], #4 ;//執(zhí)行str r1,[r2],#4 假如Carry Clear bcc %B0 ;//執(zhí)行b %B0 假如Carry Clear*/ mov r0, #0 ;/*清零ZI段 ldr r3, EndOfBSS1 cmp r2, r3 strcc r0, [r2], #4 bcc %B1 ;*/ IMPORT irq_handler ; Setup IRQ handler ldr r0, =HandleIRQ ;This routine is needed ;ldr r1, =IsrIRQ ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c ldr r1, =irq_handler str r1, [r0] IMPORT main_main__main EXPORT _main EXPORT __main; swi 0x1234 ;test swi ldr r0, =main mov lr, pc bx r0 b .;===========================================================;The location of stacksUserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~;/*0x3800*/ SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~;/*0x2800*/UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~;/*0x2400*/AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~;/*0x2000*/IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~/*0x1000*/FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~ ;function initializing stacksInitStacks ;Don't use DRAM,such as stmfd,ldmfd...... ;SVCstack is initialized before ;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1' mrs r0,cpsr bic r0,r0,#MODEMASK orr r1,r0,#UNDEFMODE|NOINT msr cpsr_cxsf,r1 ;UndefMode ldr sp,=UndefStack orr r1,r0,#ABORTMODE|NOINT msr cpsr_cxsf,r1 ;AbortMode ldr sp,=AbortStack orr r1,r0,#IRQMODE|NOINT msr cpsr_cxsf,r1 ;IRQMode ldr sp,=IRQStack orr r1,r0,#FIQMODE|NOINT msr cpsr_cxsf,r1 ;FIQMode ldr sp,=FIQStack bic r0,r0,#MODEMASK|NOINT orr r1,r0,#SVCMODE msr cpsr_cxsf,r1 ;SVCMode ldr sp,=SVCStack ;USER mode has not be initialized. mov pc,lr ;The LR register won't be valid if the current mode is not SVC mode.;=========================================================== IMPORT |Image$$RO$$Base| ; Base of ROM code IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data) IMPORT |Image$$RW$$Base| ; Base of RAM to initialise IMPORT |Image$$ZI$$Base| ; Base and limit of area IMPORT |Image$$ZI$$Limit| ; to zero initialise BaseOfROM DCD |Image$$RO$$Base| ;//Image開始地址,程序只讀(代碼或數(shù)據(jù))存放的起始地址TopOfROM DCD |Image$$RO$$Limit| ;//程序只讀(代碼或數(shù)據(jù))起始地址+代碼長度+1BaseOfBSS DCD |Image$$RW$$Base| ;//Linker中RW基地址指定,讀寫存放起始地址BaseOfZero DCD |Image$$ZI$$Base| ;//零初始基地址EndOfBSS DCD |Image$$ZI$$Limit| ;//Image結(jié)束地址 ALIGN EXPORT DisableIntDisableInt mrs r0, cpsr orr r0, r0, #0xc0 msr cpsr_cf, r0 mov pc, lr AREA RamData, DATA, READWRITE ^ _ISR_STARTADDRESSHandleReset # 4HandleUndef # 4HandleSWI # 4HandlePabort # 4HandleDabort # 4HandleReserved # 4HandleIRQ # 4HandleFIQ # 4;Don`t use the label 'IntVectorTable',;The value of IntVectorTable is different with the address you think it may be.;IntVectorTableHandleEINT0 # 4HandleEINT1 # 4HandleEINT2 # 4HandleEINT3 # 4HandleEINT4_7 # 4HandleEINT8_23 # 4HandleRSV6 # 4HandleBATFLT # 4HandleTICK # 4HandleWDT # 4HandleTIMER0 # 4HandleTIMER1 # 4HandleTIMER2 # 4HandleTIMER3 # 4HandleTIMER4 # 4HandleUART2 # 4HandleLCD # 4HandleDMA0 # 4HandleDMA1 # 4HandleDMA2 # 4HandleDMA3 # 4HandleMMC # 4HandleSPI0 # 4HandleUART1 # 4HandleRSV24 # 4HandleUSBD # 4HandleUSBH # 4HandleIIC # 4HandleUART0 # 4HandleSPI1 # 4HandleRTC # 4HandleADC # 4 END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -