📄 startup.s
字号:
;/****************************************Copyright (c)**************************************************
;** SDT
;** TeTong1
;**
;**--------------File Info-------------------------------------------------------------------------------
;** File name: Startup.s
;** Last modified Date: 2009/03/30
;** Last Version: 1.0
;** Descriptions: The start up codes for LPC2200, including the initializing codes for the entry point of exceptions and the stacks of user tasks.
;** Every project should have a independent copy of this file for related modifications
;**------------------------------------------------------------------------------------------------------
;** Created by: ZengFan
;** Created date: 2009/03/30
;** Version: 1.0
;** Descriptions: Startup启动文件,设置异常向量表,初始化各种模式的堆栈,初始化外部总线控制器,参考了周立功的Startup.S文件
;**
;**------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;** Version:
;** Descriptions:
;**
;********************************************************************************************************/
;定义堆栈的大小 /ZF
FIQ_STACK_LEGTH EQU 16
IRQ_STACK_LEGTH EQU 256 ;every layer need 9 bytes stack , permit 8 layer .每层嵌套需要9个字堆栈,允许8层嵌套
ABT_STACK_LEGTH EQU 16
UND_STACK_LEGTH EQU 16
NoIRQ EQU 0x80
NoFIQ EQU 0x40
NoInt EQU 0xC0
USR32Mode EQU 0x10
SVC32Mode EQU 0x13
SYS32Mode EQU 0x1f
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
;注意,下面只是定义一个地址,由于这里没有包含LPC2214的头文件,所以这里进行单独的定义,仅在该文件使用 /ZF
PINSEL2 EQU 0xE002C014 ;管脚功能选择寄存器2
BCFG0 EQU 0xFFE00000 ;存储器组0配置寄存器
BCFG1 EQU 0xFFE00004 ;存储器组1配置寄存器
BCFG2 EQU 0xFFE00008 ;存储器组2配置寄存器
BCFG3 EQU 0xFFE0000C ;存储器组3配置寄存器
;引入的外部标号在这声明 /ZF
IMPORT OS_CPU_ARM_ExceptUndefInstrHndlr
IMPORT OS_CPU_ARM_ExceptSwiHndlr
IMPORT OS_CPU_ARM_ExceptPrefetchAbortHndlr
IMPORT OS_CPU_ARM_ExceptDataAbortHndlr
IMPORT OS_CPU_ARM_ExceptIrqHndlr
IMPORT OS_CPU_ARM_ExceptFiqHndlr
IMPORT __main ;The entry point to the main function C语言主程序入口
IMPORT TargetResetInit ;initialize the target board 目标板基本初始化
;给外部使用的标号在这声明
EXPORT bottom_of_heap
EXPORT bottom_of_Stacks
EXPORT top_of_heap
EXPORT StackUsr
EXPORT Reset
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 0xb8a06f58 ; 这个值其实不用计算,如果不对的话在调试的时候会有错误提示,然后
; 询问是否对0x00000014处的值进行修改,选择"确定",然后在Startup
; 的调试文件里面插入汇编语句,再查看该处的值就可以了 /ZF
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
SWI_Addr DCD SwiHand
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD IRQ_Handler
FIQ_Addr DCD FIQ_Handler
;未定义指令
Undefined
B OS_CPU_ARM_ExceptUndefInstrHndlr
;软中断指令
SwiHand
B OS_CPU_ARM_ExceptSwiHndlr
;取指令中止
PrefetchAbort
B OS_CPU_ARM_ExceptPrefetchAbortHndlr
;取数据中止
DataAbort
B OS_CPU_ARM_ExceptDataAbortHndlr
;普通中断
IRQ_Handler
B OS_CPU_ARM_ExceptIrqHndlr
;快速中断
FIQ_Handler
B OS_CPU_ARM_ExceptFiqHndlr ;添加 /ZF
;/*********************************************************************************************************
;** Function name: InitStack
;**
;** Descriptions: RESET 复位入口,复位后第一个执行的函数
;**
;** input parameters: None
;** Returned value: None
;**
;** Used global variables: None
;** Calling modules: None
;**
;** Created by: ZengFan
;** Created Date: 2009/03/26
;********************************************************************************************************/
ResetInit
;初始化外部总线控制器,根据目标板决定配置
LDR R0, =PINSEL2
IF :DEF: EN_CRP ; 该指令相当与c语言中的 #ifdef /ZF
LDR R1, =0x0f814910 ; 当程序中定义了 EN_CRP ,那么CrpData就会对代码进行保护,
ELSE ; 被保护后的是不允许调试的,故把该管脚作为一个普通I/O口使用
LDR R1, =0x0f814914 ; 详细内容参考用户手册(中文版)67页
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 ; 在该开发板中,BCFG2/BCFG3管辖的地址没有被使用,所以无需配置 /ZF
; LDR R1, =0x2000ffef
; STR R1, [R0]
; LDR R0, =BCFG3
; LDR R1, =0x2000ffef
; STR R1, [R0]
BL InitStack ; Initialize the stack 初始化堆栈
BL TargetResetInit ; Initialize the target board 目标板基本初始化
; Jump to the entry point of C program 跳转到c语言入口
B __main
;/*********************************************************************************************************
;** Function name: InitStack
;**
;** Descriptions: stack initializtion
;**
;** Input parameters: None
;** Returned value: None
;**
;** Used global variables: None
;** Calling modules: None
;**
;** Created by: ZengFan
;** Created Date: 2009/03/26
;********************************************************************************************************/
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
InitStack
MOV R0, LR
MSR CPSR_c, #0xd2 ;Build the SVC stack
LDR SP, StackIrq
MSR CPSR_c, #0xd1 ;Build the FIQ stack
LDR SP, StackFiq
MSR CPSR_c, #0xd7 ;Build the DATAABORT stack
LDR SP, StackAbt
MSR CPSR_c, #0xdb ;Build the UDF stack
LDR SP, StackUnd
MSR CPSR_c, #0xdf ;Build the SYS stack
LDR SP, =StackUsr
MOV PC, R0
;/*********************************************************************************************************
;** Function name : __user_initial_stackheap
;** Descriptions : Initial the function library stacks and heaps, can not deleted! 库函数初始化堆和栈,不能删除
;** input parameters : reference by function library 参考库函数手册
;** Returned value : reference by function library 参考库函数手册
;** Used global variables : None 无
;** Calling modules : None 无
;**
;** Created by : Chenmingji(周立功2200系列开发板源程序)
;** Created Date : 2004/09
;**-------------------------------------------------------------------------------------------------------
;** Modified by
;** Modified date
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__user_initial_stackheap
LDR r0,=bottom_of_heap
; LDR r1,=StackUsr
LDR r2,=top_of_heap
LDR r3,=bottom_of_Stacks
MOV pc,lr
;/*********************************************************************************************************
;** unction name : CrpData
;** Descriptions : encrypt the chip 该代码是周立功文件中本来就有的,具体的用途不清楚 /zf
;** input parameters : None 无
;** Returned value : None 无
;** Used global variables : None 无
;** Calling modules : None 无
;**
;** Created by : Chenmingji(周立功2200系列开发板源程序)
;** Created Date : 2004/09
;**-------------------------------------------------------------------------------------------------------
;** Modified by :
;** Modified date :
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
IF :DEF: EN_CRP ; 该指令相当与c语言中的 #ifdef /ZF
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 ;/*When the Data is 为0x87654321,user code be protected. 当此数为0x87654321时,用户程序被保护 */
ENDIF
;/*********************************************************************************************************/
; /* 分配堆栈空间 */
; SPACE 指令是分配一段内存空间,其前面的段名就是一个指向刚分配内存空间的开始位置的指针
;
; 下面的这些代码要和分散加载描述文件联合起来才容易看明白,在这些代码中一共声明了5个数据段,在这里其实并没有
; 定义这些段的其实地址,它们地址的分配是在分散加载描述文件里面定义的
;/*********************************************************************************************************/
AREA MyStacks, DATA, NOINIT, ALIGN=2
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 Heap, DATA, NOINIT ;声明一个数据段,段名为Heap
bottom_of_heap SPACE 1 ;分配一个字节空间
AREA StackBottom, DATA, NOINIT ;
bottom_of_Stacks SPACE 1
AREA HeapTop, DATA, NOINIT ;
top_of_heap
AREA Stacks, DATA, NOINIT ;
StackUsr
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -