startup.s
来自「基于ARM和uC/OS-II实现的串口控制台」· S 代码 · 共 298 行
S
298 行
;/******************************************************************************
;**
;** File Name: Startup.s
;** Author: Zhoudan
;** Last Modified: 2007-03-06
;** Last Version: 0.1
;** Environment: LPC2214/RVDSv2.2/uCOS-II2.52
;** Descriptions:
;**
;******************************************************************************/
;定义堆栈的大小
FIQ_STACK_LEGTH EQU 32
IRQ_STACK_LEGTH EQU 256 ; 每层嵌套需要9个字堆栈,允许8层嵌套
ABT_STACK_LEGTH EQU 32
UND_STACK_LEGTH EQU 32
NoInt EQU 0x80
USR32Mode EQU 0x10
SVC32Mode EQU 0x13
SYS32Mode EQU 0x1f
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
PINSEL0 EQU 0xE002C000
PINSEL1 EQU 0xE002C004
PINSEL2 EQU 0xE002C014
IO0DIR EQU 0xE0028008
IO1DIR EQU 0xE0028018
IO2DIR EQU 0xE0028028
IO3DIR EQU 0xE0028038
BCFG0 EQU 0xFFE00000
BCFG1 EQU 0xFFE00004
BCFG2 EQU 0xFFE00008
BCFG3 EQU 0xFFE0000C
IMPORT __use_no_semihosting_swi
IMPORT __use_two_region_memory
IMPORT FIQ_Exception
IMPORT __main
IMPORT TargetResetInit
IMPORT SoftwareInterrupt ;os_cpu_a.s
IMPORT HandlerUndefined
IMPORT HandlerPrefetchAbort
IMPORT HandlerDataAbort
EXPORT bottom_of_heap
EXPORT bottom_of_Stacks
EXPORT top_of_heap
EXPORT StackUsr
EXPORT __user_initial_stackheap
PRESERVE8
CODE32
AREA bootloader,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
CRCSpace
WHILE . < 0x4C
DCD 0
WEND
Undefined
STMFD SP!, {R0-R12, LR}
;设置系统模式
MSR CPSR_c, #0xdf
MOV R0, SP
MOV R1, LR
;设置中断模式
MSR CPSR_c, #0xd2
MOV R2, SP
MOV R3, LR
;设置未定义模式
MSR CPSR_c, #0xdb
STMFD SP!, {R0-R3}
MOV R0, SP
B HandlerUndefined
PrefetchAbort
STMFD SP!, {R0-R12, LR}
;设置系统模式
MSR CPSR_c, #0xdf
MOV R0, SP
MOV R1, LR
;设置中断模式
MSR CPSR_c, #0xd2
MOV R2, SP
MOV R3, LR
;设置中止模式
MSR CPSR_c, #0xd7
STMFD SP!, {R0-R3}
MOV R0, SP
B HandlerPrefetchAbort
DataAbort
STMFD SP!, {R0-R12, LR}
;设置系统模式
MSR CPSR_c, #0xdf
MOV R0, SP
MOV R1, LR
;设置中断模式
MSR CPSR_c, #0xd2
MOV R2, SP
MOV R3, LR
;设置中止模式
MSR CPSR_c, #0xd7
STMFD SP!, {R0-R3}
MOV R0, SP
B HandlerDataAbort
FIQ_Handler
STMFD SP!, {R0-R3, LR}
BL FIQ_Exception
LDMFD SP!, {R0-R3, LR}
SUBS PC, LR, #4
;/******************************************************************************
;** 函数名称: ResetInit
;** 功能描述: 复位入口
;**
;** 作 者: 陈明计
;** 日 期: 2004/02/02
;**-----------------------------------------------------------------------------
;** 修 改: 周丹
;** 日 期: 2006/12/25
;**-----------------------------------------------------------------------------
;******************************************************************************/
ResetInit
IF :DEF: EN_CRP
LDR R1, =0x0f814920
ELSE
LDR R1, =0x0f814924
ENDIF
LDR R0, =PINSEL2
STR R1, [R0]
LDR R1, =0x00000000
LDR R0, =PINSEL0
STR R1, [R0]
LDR R0, =PINSEL1
STR R1, [R0]
LDR R1, =0x00000000
LDR R0, =IO0DIR
STR R1, [R0]
LDR R0, =IO1DIR
STR R1, [R0]
LDR R0, =IO2DIR
STR R1, [R0]
LDR R0, =IO3DIR
STR R1, [R0]
LDR R0, =BCFG0 ; 外部SRAM
LDR R1, =0x20000C20
STR R1, [R0]
LDR R0, =BCFG1 ; 外部FLASH
LDR R1, =0x1000ffef
;LDR R1, =0x100004C0
STR R1, [R0]
LDR R0, =BCFG2 ; 以太网
LDR R1, =0x100034C0
STR R1, [R0]
LDR R0, =BCFG3 ; FPGA
LDR R1, =0x2000ffef
STR R1, [R0]
BL InitStack
BL TargetResetInit
B __main
;/******************************************************************************
;** 函数名称: InitStack
;** 功能描述: 初始化堆栈
;**
;** 作 者: 陈明计
;** 日 期: 2004/02/02
;**-----------------------------------------------------------------------------
;** 修 改: 周丹
;** 日 期: 2006/01/30
;**-----------------------------------------------------------------------------
;******************************************************************************/
InitStack
MOV R0, LR
;设置中断模式堆栈
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-32
BX R0
;/******************************************************************************
;** 函数名称: __user_initial_stackheap
;** 功能描述: 库函数初始化堆和栈,不能删除
;** 输 入: 参考库函数手册
;** 输 出 : 参考库函数手册
;**
;** 作 者: 陈明计
;** 日 期: 2004/02/02
;**-----------------------------------------------------------------------------
;** 修 改:
;** 日 期:
;**-----------------------------------------------------------------------------
;******************************************************************************/
__user_initial_stackheap
LDR r0,=bottom_of_heap
LDR r1,=StackUsr
LDR r2,=top_of_heap
LDR r3,=bottom_of_Stacks
BX lr
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
;** 功能描述: encrypt the chip
;**
;** 作 者: 陈明计
;** 日 期: 2004/03/27
;**-----------------------------------------------------------------------------
;** 修 改:
;** 日 期:
;**-----------------------------------------------------------------------------
;******************************************************************************/
IF :DEF: EN_CRP
CrpData
WHILE . < 0x1fc
NOP
WEND
CrpData1
DCD 0x87654321
ENDIF
;/* 分配堆栈空间 */
AREA MyStacks, DATA, NOINIT, ALIGN=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 ; 未定义模式堆栈
AREA Heap, DATA, NOINIT
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 + =
减小字号Ctrl + -
显示快捷键?