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 + -
显示快捷键?