LPC2114发动代码的编写首要包含:
1.反常向量表的树立
2.MCU各种形式仓库的初始化
3.体系根本的初始化作业
下面别离进行介绍.
(一)ARM相关指令及伪指令
LDR PC,ResetAddr
将ResetAddr标号地址所指的内容传送给PC寄存器
LDR PC,=ResetAddr
将ResetAddr标号地址传送给PC寄存器
ResetAddr DCD ResetInit
为ResetAddr分配一个字的地址空间,以ResetInit初始化,即ResetAddr地址所指的内容为ResetInit标号地址
SvcStackSpace Space SVC_STACK_LENGTH*4
为SvcStackSpace分配一块SVC_STACK_LENGTH*4巨细的地址区域,并以0初始化区域内容
(二)反常向量表的树立
反常是有内部或外部源发生的,以引起处理器处理的一个事情,反常呈现后,CPU强制从反常类型对应的固定存储地址开端履行程序,如当IRQ间断发生后,CPU强制跳转到0x00000018出履行代码,咱们要做的就是在这个代码地址出编写相应的指令,让它顺畅履行IRQ间断程序.一般咱们会在这儿放置一条搬运指令,因为0x00000018只给你一个字的编程空间.
程序如下:
AREA vectors,CODE,READONLY
ENTRY
;interrupt vectors
;间断向量表
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
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
**
**
ResetInit
BL InitStack ;初始化仓库 Initialize the stack
BL TargetResetInit ;方针板根本初始化 Initialize the target board
;跳转到c言语进口 Jump to the entry point of C program
B __main
咱们能够看到,每种反常都有相应的处理程序,如:当体系复位后,程序跳转到0x00000000处履行指令,那么就履行 LDR PC, ResetAddr,及履行ResetInit地址处的代码,这儿放置了BL InitStack指令,担任完结各种形式下仓库的初始化,接着履行BL TargetResetInit,完结方针板根本初始化,最终进入c言语进口,履行main函数.
(三)MCU各种形式仓库的初始化
因为各种反常形式下都有本身的SP仓库指针,因而就必须先进入各自的反常形式进行SP的设置,各种形式的切换能够经过改动CPSR来完结,程序如下:
InitStack
MOV R0, LR
;Build the SVC stack
;设置管理形式仓库
MSR CPSR_c, #0xd3
LDR SP, StackSvc
;Build the IRQ stack
;设置间断形式仓库
MSR CPSR_c, #0xd2
LDR SP, StackIrq
;Build the FIQ stack
;设置快速间断形式仓库
MSR CPSR_c, #0xd1
LDR SP, StackFiq
;Build the DATAABORT stack
;设置间断形式仓库
MSR CPSR_c, #0xd7
LDR SP, StackAbt
;Build the UDF stack
;设置未定义形式仓库
MSR CPSR_c, #0xdb
LDR SP, StackUnd
;Build the SYS stack
;设置体系形式仓库
MSR CPSR_c, #0x5f
LDR SP, =StackUsr
MOV PC, R0
**
**
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
**
**
;/* 分配仓库空间 */
AREA MyStacks, DATA, NOINIT, ALIGN=2
SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;Stack spaces for Administration Mode 管理形式仓库空间
IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;Stack spaces for Interrupt ReQuest Mode 间断形式仓库空间
FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;Stack spaces for Fast Interrupt reQuest Mode 快速间断形式仓库空间
AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;Stack spaces for Suspend Mode 间断义形式仓库空间
UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;Stack spaces for Undefined Mode 未定义形式仓库
****
***
AREA Stacks, DATA, NOINIT
StackUsr
阐明:MSR CPSR_c, #XX指令完结各种反常形式的切换,如切换到IRQ形式,则履行MSR CPSR_c, #0xd2,而SP的值由SvcStackSpace的地址加上SVC_STACK_LEGTH 的所指的巨细而定.
(四)体系根本的初始化作业
完结仓库初始化后履行BL TargetResetInit,它担任体系一些根本的初始化,如地址重映射,PLL时钟初始化,VIC间断初始化等,详细代码见Easy Arm2100开发版的target.c文件.
最终,履行B __main,__main是ADS的一个体系函数,它担任一些初始化环境然后履行用户的main函数.