LPC2210系統啟動代碼步驟:
1.初始化外部總線控制器;
主要工作是:
1. 初始化引腳鏈接模塊的值,即PINSEL2;
2. 配置外部第0個存儲區和第1個存儲區,設置16位總線寬度,總線速度調到最慢
2.初始化堆棧;
3.初始化目標板;
主要工作是:
1.設置存儲器影射控制模式;
2.設置時鐘;
3.設置存儲器加速模塊;
4.初始化向量中斷控制器
再看看代碼:

;定義堆棧的大小
USR_STACK_LEGTH EQU 256
SVC_STACK_LEGTH EQU 0
FIQ_STACK_LEGTH EQU 0
IRQ_STACK_LEGTH EQU 256
ABT_STACK_LEGTH EQU 0
UND_STACK_LEGTH EQU 0

NoInt EQU 0x80

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
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr

ResetAddr DCD ResetInit
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

;取指令中止
PrefetchAbort
B PrefetchAbort

;取數據中止
DataAbort
B DataAbort

;快速中斷
FIQ_Handler

STMFD SP!, ...{R0-R3, LR}
BL FIQ_Exception

LDMFD SP!, ...{R0-R3, LR}
SUBS PC, LR, #4


InitStack
MOV R0, LR

;設置管理模式堆棧
MSR CPSR_c, #0xd3
LDR SP, StackSvc
;設置中斷模式堆棧
MSR CPSR_c, #0xd2
LDR SP, StackIrq
;設置快速中斷模式堆棧
MSR CPSR_c, #0xd1
LDR SP, StackFiq
;設置中止模式堆棧
MSR CPSR_c, #0xd7
LDR SP, StackAbt
;設置未定義模式堆棧
MSR CPSR_c, #0xdb
LDR SP, StackUnd
;設置系統模式堆棧
MSR CPSR_c, #0xdf
LDR SP, =StackUsr

MOV PC, R0


ResetInit
;初始化外部總線控制器,根據目標板決定配置

LDR R0, =PINSEL2
IF :DEF: EN_CRP
LDR R1, =0x0f814910
ELSE
LDR R1, =0x0f814914
ENDIF
STR R1, [R0]

LDR R0, =BCFG0
LDR R1, =0x1000ffef
STR R1, [R0]

LDR R0, =BCFG1
LDR R1, =0x1000ffef
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 ;目標板基本初始化
;跳轉到c語言入口
B __main



__user_initial_stackheap
LDR r0,=bottom_of_heap
MOV pc,lr


__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




IF :DEF: EN_CRP
IF . >= 0x1fc
INFO 1," The data at 0x000001fc must be 0x87654321. Please 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
