?? startup.s
字號:
;/****************************************Copyright (c)**************************************************
;** 廣州周立功單片機發展有限公司
;** 研 究 所
;** 產品一部
;**
;** http://www.zlgmcu.com
;**
;**--------------文件信息--------------------------------------------------------------------------------
;**文 件 名: Startup.s
;**創 建 人: 陳明計
;**最后修改日期: 2004年3月3日
;**描 述: lpc22xx的啟動代碼,包含異常向量入口、初始化堆棧的代碼等
;** 每個工程應當有獨立的這個文件的拷貝,并進行相應的修改
;**--------------歷史版本信息----------------------------------------------------------------------------
;** 創建人: 陳明計
;** 版 本: v1.0
;** 日 期: 2004年2月2日
;** 描 述: 原始版本
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陳明計
;** 版 本: v1.01
;** 日 期: 2004年3月3日
;** 描 述: 修改總線配置以適應多數情況
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陳明計
;** 版 本: v1.02
;** 日 期: 2004年3月27日
;** 描 述: 增加代碼以支持芯片的加密功能
;**
;**--------------當前版本修訂------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;** 描 述:
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
;定義堆棧的大小
USR_STACK_LEGTH EQU 256 ;USR堆棧大小
SVC_STACK_LEGTH EQU 0
FIQ_STACK_LEGTH EQU 0
IRQ_STACK_LEGTH EQU 256 ;IRQ堆棧大小(32Bits)
ABT_STACK_LEGTH EQU 0
UND_STACK_LEGTH EQU 0
NoInt EQU 0x80
NoFIQ EQU 0x40
USR32Mode EQU 0x10
SVC32Mode EQU 0x13
SYS32Mode EQU 0x1f
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
PINSEL2 EQU 0xE002C014
BCFG0 EQU 0xFFE00000
BCFG1 EQU 0xFFE00004
BCFG2 EQU 0xFFE00008
BCFG3 EQU 0xFFE0000C
;引入的外部標號在這聲明
IMPORT FIQ_Exception ;快速中斷異常處理程序
IMPORT __main ;C語言主程序入口
IMPORT TargetResetInit ;目標板基本初始化
IMPORT StackUsr
IMPORT bottom_of_heap
;給外部使用的標號在這聲明
EXPORT Reset
EXPORT __rt_div0
EXPORT __user_initial_stackheap
CODE32
AREA vectors,CODE,READONLY
ENTRY
;中斷向量表
Reset
LDR PC, ResetAddr ;0x8000 0000;每個中斷入口保留4字節
LDR PC, UndefinedAddr ;0x8000 0004
LDR PC, SWI_Addr ;0x8000 0008
LDR PC, PrefetchAddr ;0x8000 000C
LDR PC, DataAbortAddr ;0x8000 0010
DCD 0xb9205f80 ;0x8000 0014;系統保留
LDR PC, [PC, #-0xff0] ;0x8000 0008
LDR PC, FIQ_Addr ;0x8000 000C
ResetAddr DCD ResetInit ;DCD用于一段字內存單元分配(4個字)
UndefinedAddr DCD Undefined ;
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
;未定義指令
Undefined
B Undefined
;軟中斷
SoftwareInterrupt
B SoftwareInterrupt
;//增加開/關中斷處理 Chenxibing-2004-02-09
CMP R0, #4
LDRLO PC, [PC, R0, LSL #2]
MOVS PC, LR
SwiFunction
DCD IRQDisable ;0
DCD IRQEnable ;1
DCD FIQDisable ;2
DCD FIQEnable ;3
IRQDisable
;關IRQ中斷
MRS R0, SPSR
ORR R0, R0, #NoInt
MSR SPSR_c, R0
MOVS PC, LR
IRQEnable
;開IRQ中斷
MRS R0, SPSR
BIC R0, R0, #NoInt
MSR SPSR_c, R0
MOVS PC, LR
FIQDisable
;關FIQ中斷
MRS R0, SPSR
ORR R0, R0, #NoFIQ
MSR SPSR_c, R0
MOVS PC, LR
FIQEnable
;開FIQ中斷
MRS R0, SPSR
BIC R0, R0, #NoFIQ
MSR SPSR_c, R0
MOVS PC, LR
;// Changed 2004-12-09
;取指令中止
PrefetchAbort
B PrefetchAbort
;取數據中止
DataAbort
B DataAbort
;快速中斷
FIQ_Handler
STMFD SP!, {R0-R3, LR} ;將R0~R3和LR入棧
BL FIQ_Exception ;調用子程序FIQ_Exception
LDMFD SP!, {R0-R3, LR} ;恢復R0~R3和LR
SUBS PC, LR, #4
;/*********************************************************************************************************
;** 函數名稱: InitStack
;** 功能描述: 初始化堆棧
;** 輸 入: 無
;** 輸 出 : 無
;** 全局變量: 無
;** 調用模塊: 無
;**
;** 作 者: 陳明計
;** 日 期: 2004年2月2日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: Zeloso
;** 日 期: 2007/09/12
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
InitStack ;系統復位后進入管理模式
MOV R0, LR ;保存
;設置管理模式堆棧
MSR CPSR_c, #0xd3 ;1101 0011 Bit7=IRQ OFF,Bit6=FIQ OFF,運行ARM狀態,管理模式
LDR SP, StackSvc ;定義管理模式堆棧空間
;設置中斷模式堆棧
MSR CPSR_c, #0xd2 ;1101 0010 Bit7=IRQ OFF,Bit6=FIQ OFF,運行ARM狀態,中斷模式
LDR SP, StackIrq
;設置快速中斷模式堆棧
MSR CPSR_c, #0xd1 ;1101 0001 Bit7=IRQ OFF,Bit6=FIQ OFF,運行ARM狀態,快速中斷模式
LDR SP, StackFiq
;設置中止模式堆棧
MSR CPSR_c, #0xd7 ;1101 0111 Bit7=IRQ OFF,Bit6=FIQ OFF,運行ARM狀態,中止模式ARM7TDMI無多大用處
LDR SP, StackAbt
;設置未定義模式堆棧
MSR CPSR_c, #0xdb ;1101 1011 Bit7=IRQ OFF,Bit6=FIQ OFF,運行ARM狀態,未定義模式,指令異常響應進入
LDR SP, StackUnd
;設置系統模式堆棧
MSR CPSR_c, #0x5f ;1101 1111 Bit7=IRQ ON,Bit6=FIQ OFF,運行ARM狀態,系統模式,擁有直接切換到其它模式的特權
LDR SP, =StackUsr
MOV PC, R0 ;子程序返回
;/*********************************************************************************************************
;** 函數名稱: ResetInit
;** 功能描述: 復位入口.初始化各個IO配置,符合存儲器尋址
;**
;** 輸 入: 無
;**
;** 輸 出: 無
;**
;** 全局變量: 無
;** 調用模塊: 無
;**
;** 作 者: 陳明計
;** 日 期: 2004年2月2日
;**-------------------------------------------------------------------------------------------------------
;** 修改人: Zeloso
;** 日 期: 2007/09/12
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
ResetInit
;初始化外部總線控制器,根據目標板決定配置
LDR R0, =PINSEL2 ;對PINSEL2進行初始化賦值
IF :DEF: EN_CRP
LDR R1, =0x0f814910 ;P1.31~P1.26=GPIO
ELSE
LDR R1, =0x0f814914 ;0000 1111 1000 0001 0100 1001 0001 0100
;31~28 27~24 23~20 19~16 15~12 11~8 7 ~4 3 ~0
;P1.31~P1.26=DBIO,P1.25~P1.16=GPIO
;P2.7~P2.0=D[7:0],
;P1.0=CS0
;P1.1=OE
;P3.31=BLS0
;P2.15~P2.8=D[15:8]
;P3.30=BLS1
;P2.27~P2.16=D[27:16]
;P2.29~P2.28=D[29:28]
;P2.31~P2.30=D[31:30]
;P3.29~P2.28=BLS[2:3]
;P3.29=GPIO
;P3.28=GPIO
;P3.27=WE
;P3.26=CS1
;P3.23=GPIO
;P3.25=CS2
;P3.24=CS3
;P2.29~P2.28=GPIO
;P2.23=GPIO
;P2.31=GPIO
;P3.00=ADLINE
;P3.31=ADLINE
;P3.23,P3.22,P3.02=ADLINE
ENDIF
STR R1, [R0] ;
LDR R0, =BCFG0 ;設定寄存器組0配置
LDR R1, =0x1000ffef ;0001 0000 0000 0000 1111 1111 1110 1111
;31~28 27~24 23~20 19~16 15~12 11~8 7 ~4 3 ~0
;IDCY=16 cclks
;WST1=34 cclks
;RBLE=存儲器含有16Bits和32Bits器件組成
;WST2=31 cclks
;BUSERR=0
;WPERR=0
;WP=0
;BM=0 NO BurstROM
;MW=32Bits 數據總線寬度
STR R1, [R0] ;
LDR R0, =BCFG1 ;設定寄存器組1配置
LDR R1, =0x1000ffef ;與BCFG0配置一樣
STR R1, [R0]
; LDR R0, =BCFG2
; LDR R1, =0x2000ffef
; STR R1, [R0]
; LDR R0, =BCFG3
; LDR R1, =0x2000ffef
; STR R1, [R0]
BL InitStack ;調用初始化堆棧子程序
BL TargetResetInit ;目標板基本初始化;存儲映射,PLL設置
;跳轉到c語言入口
B __main
;/*********************************************************************************************************
;** 函數名稱: __user_initial_stackheap
;** 功能描述: 庫函數初始化堆和棧,不能刪除
;**
;** 輸 入: 參考庫函數手冊
;**
;** 輸 出: 參考庫函數手冊
;**
;** 全局變量: 無
;** 調用模塊: 無
;**
;** 作 者: 陳明計
;** 日 期: 2004年2月2日
;**-------------------------------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__user_initial_stackheap
LDR r0,=bottom_of_heap
MOV pc,lr
;/*********************************************************************************************************
;** 函數名稱: __rt_div0
;** 功能描述: 整數除法除數為0錯誤處理函數,替代原始的__rt_div0減少目標代碼大小
;**
;** 輸 入: 參考庫函數手冊
;**
;** 輸 出: 無
;**
;** 全局變量: 無
;** 調用模塊: 無
;**
;** 作 者: 陳明計
;** 日 期: 2004年2月2日
;**-------------------------------------------------------------------------------------------------------
;** 修改人: Zeloso
;** 日 期: 2007/09/12
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__rt_div0
B __rt_div0
StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4
StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4 ;進行字對齊
StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4
StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4
StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4
;/*********************************************************************************************************
;** 函數名稱: CrpData
;** 功能描述: 支持芯片加密功能
;**
;** 輸 入: 無
;**
;** 輸 出: 無
;**
;** 全局變量: 無
;** 調用模塊: 無
;**
;** 作 者: 陳明計
;** 日 期: 2004年3月27日
;**-------------------------------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;;********************************************************************************************************/
IF :DEF: EN_CRP
IF . >= 0x1fc
INFO 1,"\nThe data at 0x000001fc must be 0x87654321.\nPlease delete some source before this line."
ENDIF
CrpData
WHILE . < 0x1fc
NOP
WEND
CrpData1
DCD 0x87654321 ;/* 當此數為0x87654321時,用戶程序被保護 */
ENDIF
;/* 分配堆棧空間 */
AREA MyStacks, DATA, NOINIT, ALIGN=2
SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;管理模式堆棧空間
IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;中斷模式堆棧空間
FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;快速中斷模式堆棧空間
AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;中止義模式堆棧空間
UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;未定義模式堆棧
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -