LPC2000系列ARM啟動代碼(startup部分)
本文引用地址:http://m.butianyuan.cn/article/201611/318926.htm
- ;定義堆棧的大小
- SVC_STACK_LEGTHEQU0
- FIQ_STACK_LEGTHEQU0
- IRQ_STACK_LEGTHEQU256
- ABT_STACK_LEGTHEQU0
- UND_STACK_LEGTHEQU0
- NoIntEQU0x80;禁止IRQ中斷
- NoFIQEQU0x40;禁止FIQ中斷
- USR32ModeEQU0x10;ARM的各種工作模式
- SVC32ModeEQU0x13
- SYS32ModeEQU0x1f
- IRQ32ModeEQU0x12
- FIQ32ModeEQU0x11
- IMPORT__use_no_semihosting_swi
- ;引入的外部標號在這聲明
- IMPORTFIQ_Exception;Fastinterruptexceptionshandler快速中斷異常處理程序
- IMPORT__main;TheentrypointtothemainfunctionC語言主程序入口
- IMPORTTargetResetInit;initializethetargetboard目標板基本初始化
- ;給外部使用的標號在這聲明
- EXPORTbottom_of_heap
- EXPORTStackUsr
- EXPORTReset
- EXPORT__user_initial_stackheap
- CODE32
- AREAvectors,CODE,READONLY
- ENTRY
- ;中斷向量表
- Reset
- LDRPC,ResetAddr;//注意,這里應該賦值給PC不是ResetAr這個地址,而是ResetAr這個地址里的值,是ResetInit
- LDRPC,UndefinedAddr;//另外,LDR尋找空間4K,用DCD實現(xiàn)全范圍尋址
- LDRPC,SWI_Addr
- LDRPC,PrefetchAddr
- LDRPC,DataAbortAddr
- DCD0xb9205f80
- LDRPC,[PC,#-0xff0]
- LDRPC,FIQ_Addr
- ResetAddrDCDResetInit
- UndefinedAddrDCDUndefined
- SWI_AddrDCDSoftwareInterrupt
- PrefetchAddrDCDPrefetchAbort
- DataAbortAddrDCDDataAbort
- NouseDCD0
- IRQ_AddrDCD0
- FIQ_AddrDCDFIQ_Handler
- Undefined
- BUndefined
- ;軟中斷
- SoftwareInterrupt
- ;BSoftwareInterrupt
- ;//增加開/關中斷處理Chenxibing-2004-02-09
- CMPR0,#4
- LDRLOPC,[PC,R0,LSL#2]
- MOVSPC,LR
- SwiFunction
- DCDIRQDisable;0
- DCDIRQEnable;1
- DCDFIQDisable;2
- DCDFIQEnable;3
- IRQDisable
- ;關IRQ中斷
- MRSR0,SPSR
- ORRR0,R0,#NoInt
- MSRSPSR_c,R0
- MOVSPC,LR
- IRQEnable
- ;開IRQ中斷
- MRSR0,SPSR
- BICR0,R0,#NoInt
- MSRSPSR_c,R0
- MOVSPC,LR
- FIQDisable
- ;關FIQ中斷
- MRSR0,SPSR
- ORRR0,R0,#NoFIQ
- MSRSPSR_c,R0
- MOVSPC,LR
- FIQEnable
- ;開FIQ中斷
- MRSR0,SPSR
- BICR0,R0,#NoFIQ
- MSRSPSR_c,R0
- MOVSPC,LR
- ;//Changed2004-12-09
- ;取指令中止
- PrefetchAbort
- BPrefetchAbort
- ;取數(shù)據(jù)中止
- DataAbort
- BDataAbort
- ;快速中斷
- FIQ_Handler
- STMFDSP!,{R0-R3,LR}
- BLFIQ_Exception
- LDMFDSP!,{R0-R3,LR}
- SUBSPC,LR,#4
- ;/*********************************************************************************************************
- ;**unctionname函數(shù)名稱:InitStack
- ;**Descriptions功能描述:Initializethestacks初始化堆棧
- ;**inputparameters輸 入:None無
- ;**Returnedvalue輸 出:None無
- ;******************************************************************************************************/
- InitStack
- MOVR0,LR
- ;BuildtheSVCstack
- ;設置管理模式堆棧
- MSRCPSR_c,#0xd3
- LDRSP,StackSvc
- ;BuildtheIRQstack
- ;設置中斷模式堆棧
- MSRCPSR_c,#0xd2
- LDRSP,StackIrq
- ;BuildtheFIQstack
- ;設置快速中斷模式堆棧
- MSRCPSR_c,#0xd1
- LDRSP,StackFiq
- ;BuildtheDATAABORTstack
- ;設置中止模式堆棧
- MSRCPSR_c,#0xd7
- LDRSP,StackAbt
- ;BuildtheUDFstack
- ;設置未定義模式堆棧
- MSRCPSR_c,#0xdb
- LDRSP,StackUnd
- ;BuildtheSYSstack
- ;設置系統(tǒng)模式堆棧
- MSRCPSR_c,#0xdf
- LDRSP,=StackUsr
- MOVPC,R0
- ;/*********************************************************************************************************
- ;**unctionname函數(shù)名稱:ResetInit
- ;**Descriptions功能描述:RESET復位入口
- ;**inputparameters輸 入:None無
- ;**Returnedvalue輸 出:None無
- ;********************************************************************************************************/
- ResetInit
- BLInitStack;初始化堆棧Initializethestack
- BLTargetResetInit;目標板基本初始化Initializethetargetboard
- ;跳轉到c語言入口JumptotheentrypointofCprogram
- B__main
- ;/*****************************************************************************************************************************************************
- ;**unctionname函數(shù)名稱:__user_initial_stackheap
- ;**Descriptions功能描述:Initialthefunctionlibrarystacksandheaps,cannotdeleted!庫函數(shù)初始化堆和棧,不能刪除
- ;**inputparameters輸 入:referencebyfunctionlibrary參考庫函數(shù)手冊
- ;**Returnedvalue輸 出:referencebyfunctionlibrary參考庫函數(shù)手冊
- ;************************************************************************************************************************************************************/
- __user_initial_stackheap
- LDRr0,=bottom_of_heap
- ;LDRr1,=StackUsr
- MOVpc,lr
- StackSvcDCDSvcStackSpace+(SVC_STACK_LEGTH-1)*4
- StackIrqDCDIrqStackSpace+(IRQ_STACK_LEGTH-1)*4
- StackFiqDCDFiqStackSpace+(FIQ_STACK_LEGTH-1)*4
- StackAbtDCDAbtStackSpace+(ABT_STACK_LEGTH-1)*4
- StackUndDCDUndtStackSpace+(UND_STACK_LEGTH-1)*4
- ;/*********************************************************************************************************
- ;**unctionname函數(shù)名稱:CrpData
- ;**Descriptions功能描述:encryptthechip
- ;**inputparameters輸 入:None無
- ;**Returnedvalue輸 出:None無
- ;********************************************************************************************************/
- IF:DEF:EN_CRP
- IF.>=0x1fc
- INFO1,"/nThedataat0x000001fcmustbe0x87654321./nPleasedeletesomesourcebeforethisline."
- ENDIF
- CrpData
- WHILE.<0x1fc
- NOP
- WEND
- CrpData1
- DCD0x87654321;/*WhentheDatais為0x87654321,usercodebeprotected.當此數(shù)為0x87654321時,用戶程序被保護*/
- ENDIF
- ;/*分配堆??臻g*/
- AREAMyStacks,DATA,NOINIT,ALIGN=2
- SvcStackSpaceSPACESVC_STACK_LEGTH*4;StackspacesforAdministrationMode管理模式堆??臻g
- IrqStackSpaceSPACEIRQ_STACK_LEGTH*4;StackspacesforInterruptReQuestMode中斷模式堆??臻g
- FiqStackSpaceSPACEFIQ_STACK_LEGTH*4;StackspacesforFastInterruptreQuestMode快速中斷模式堆棧空間
- AbtStackSpaceSPACEABT_STACK_LEGTH*4;StackspacesforSuspendMode中止義模式堆??臻g
- UndtStackSpaceSPACEUND_STACK_LEGTH*4;StackspacesforUndefinedMode未定義模式堆棧
- AREAHeap,DATA,NOINIT
- bottom_of_heapSPACE1
- AREAStacks,DATA,NOINIT
- StackUsr
- END
- ;/*********************************************************************************************************
- ;**EndOfFile
- ;********************************************************************************************************/
評論