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
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
NoInt EQU
0x80
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
USR32Mode EQU
0x10
SVC32Mode EQU
0x13
SYS32Mode EQU
0x1f
IRQ32Mode EQU
0x12
FIQ32Mode EQU
0x11
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
PINSEL2 EQU
0xE002C014
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
BCFG0 EQU
0xFFE00000
BCFG1 EQU
0xFFE00004
BCFG2 EQU
0xFFE00008
BCFG3 EQU
0xFFE0000C
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
;引入的外部標號在這聲明
IMPORT FIQ_Exception ;快速中斷異常處理程序
IMPORT __main ;C語言主程序入口
IMPORT TargetResetInit ;目標板基本初始化
IMPORT StackUsr
IMPORT bottom_of_heap
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
;給外部使用的標號在這聲明
EXPORT Reset
EXPORT __rt_div0
EXPORT __user_initial_stackheap
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
CODE32
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
;未定義指令
Undefined
B Undefined
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
;軟中斷
SoftwareInterrupt
B SoftwareInterrupt
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
;取指令中止
PrefetchAbort
B PrefetchAbort
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
;取數據中止
DataAbort
B DataAbort
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
;快速中斷
FIQ_Handler
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
STMFD SP
!
,
...
{R0-R3, LR}
BL FIQ_Exception
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
LDMFD SP
!
,
...
{R0-R3, LR}
SUBS PC, LR, #
4
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
InitStack
MOV R0, LR
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
;設置管理模式堆棧
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
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
MOV PC, R0
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
ResetInit
;初始化外部總線控制器,根據目標板決定配置
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
LDR R0,
=
PINSEL2
IF :DEF: EN_CRP
LDR R1,
=
0x0f814910
ELSE
LDR R1,
=
0x0f814914
ENDIF
STR R1, [R0]
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
LDR R0,
=
BCFG0
LDR R1,
=
0x1000ffef
STR R1, [R0]
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
LDR R0,
=
BCFG1
LDR R1,
=
0x1000ffef
STR R1, [R0]
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
; LDR R0,
=
BCFG2
; LDR R1,
=
0x2000ffef
; STR R1, [R0]
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
; LDR R0,
=
BCFG3
; LDR R1,
=
0x2000ffef
; STR R1, [R0]
BL InitStack ;初始化堆棧
BL TargetResetInit ;目標板基本初始化
;跳轉到c語言入口
B __main
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
__user_initial_stackheap
LDR r0,
=
bottom_of_heap
MOV pc,lr
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
__rt_div0
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
B __rt_div0
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
DCD
0x87654321
;
/**/
/* 當此數為0x87654321時,用戶程序被保護 */
ENDIF
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
;
/**/
/* 分配堆棧空間 */
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