📄 start.s
字号:
_STACK_BASEADDRESS EQU 0x21ff8000_MMUTT_STARTADDRESS EQU 0x21ff8000_ISR_STARTADDRESS EQU 0x21ffff00 AREA SelfBoot, CODE, READONLY ENTRY EXPORT __ENTRY__ENTRY ResetEntry b ResetHandler b HandlerUndef ;handler for Undefined mode b HandlerSWI ;handler for SWI interrupt b HandlerPabort ;handler for PAbort b HandlerDabort ;handler for DAbort b . ;reserved; b HandlerIRQ ;handler for IRQ interrupt ldr pc, [pc,#-0xF20] ;IRQ : read the AIC b HandlerFIQ ;handler for FIQ interrupt 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 HandlePabort; * the actual reset codeResetHandler ; set the cpu to SVC32 mode mrs r0, cpsr bic r0, r0, #0x1f orr r0, r0, #0x13 msr cpsr_cf, r0 ; relocate exeception table ldr r0, =ResetEntry ldr r1, =0x0 mov r2, #16copyex subs r2, r2, #1 ldr r3, [r0], #4 str r3, [r1], #4 bne copyex IMPORT AT91F_LowLevelInit bl AT91F_LowLevelInit ;Initialize stacks bl InitStacks ; Setup IRQ handler; ldr r0,=HandleIRQ ;This routine is needed; ldr r1,=IsrIRQ ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c; str r1,[r0] copy_proc_beg adr r0, ResetEntry ldr r2, BaseOfROM cmp r0, r1 ldreq r0, TopOfROM beq InitRam ldr r3, TopOfROM0 ldmia r0!, {r4-r7} stmia r2!, {r4-r7} cmp r2, r3 bcc %B0 sub r2, r2, r3 sub r0, r0, r2 InitRam ldr r2, BaseOfBSS ldr r3, BaseOfZero 0 cmp r2, r3 ldrcc r1, [r0], #4 strcc r1, [r2], #4 bcc %B0 mov r0, #0 ldr r3, EndOfBSS1 cmp r2, r3 strcc r0, [r2], #4 bcc %B1 IMPORT main_main__main EXPORT _main EXPORT __main ldr r0, =main mov lr, pc bx r0;===========================================================;Pre-defined constantsUSERMODE EQU 0x10FIQMODE EQU 0x11IRQMODE EQU 0x12SVCMODE EQU 0x13ABORTMODE EQU 0x17UNDEFMODE EQU 0x1bMODEMASK EQU 0x1fNOINT EQU 0xc0;The location of stacksUserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~ SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~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|TopOfROM DCD |Image$$RO$$Limit|BaseOfBSS DCD |Image$$RW$$Base|BaseOfZero DCD |Image$$ZI$$Base|EndOfBSS DCD |Image$$ZI$$Limit| ALIGN 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -