⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 startup.s

📁 使用ads1.2编译器
💻 S
字号:
;/****************************************Copyright (c)**************************************************
;** 修改人: 
;** 日 期:
;** 描 述:
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/

;定义堆栈的大小
SVC_STACK_LEGTH     EQU         0
FIQ_STACK_LEGTH     EQU         16
IRQ_STACK_LEGTH     EQU         128
ABT_STACK_LEGTH     EQU         0
UND_STACK_LEGTH     EQU         0

MEMMAP	    EQU	0xE01FC040   			; REMAP控制寄存器      
PINSEL2     EQU 0xE002C014
BCFG0       EQU 0xFFE00000
BCFG1       EQU 0xFFE00004
BCFG2       EQU 0xFFE00008
BCFG3       EQU 0xFFE0000C

;引入的外部标号在这声明
    IMPORT  FIQ_Handler                   ;快速中断异常处理程序
    IMPORT  __main                          ;C语言主程序入口 
    IMPORT __use_two_region_memory

    IMPORT  HZK16                   ;
    IMPORT  ASCII16                   ;
    IMPORT  HZK_16                   ;
    IMPORT  ASCII_16                   ;

    IMPORT  HZK12                   ;
    IMPORT  ASCII12                   ;
    IMPORT  HZK_12                   ;
    IMPORT  ASCII_12                   ;

    IMPORT  ||Image$$STACK$$ZI$$Base||                   ;
    IMPORT  ||Image$$STACK$$ZI$$Limit||                   ;
    IMPORT  ||Image$$HEAP$$ZI$$Base||                   ;
    IMPORT  ||Image$$HEAP$$ZI$$Limit||                   ;
    IMPORT  ||Image$$ROM_EXEC$$Limit||                   ;
    IMPORT  ||Image$$IRAM$$Length||                   ;

;给外部使用的标号在这声明
	EXPORT	ARMDisableInt
	EXPORT	ARMEnableInt
    EXPORT  __user_initial_stackheap
	EXPORT  P_HZKASCII

	EXPORT  ROM_END_ADD

    CODE32

    AREA    Startup,CODE,READONLY

;中断向量表
Vectors
        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_Exception

;未定义指令
Undefined
        B       Undefined

;软中断
SoftwareInterrupt
        B       SoftwareInterrupt

PrefetchAbort
        B       PrefetchAbort

;取数据中止
DataAbort
        B       DataAbort


;快速中断
FIQ_Exception
        STMFD   SP!, {R0-R3, LR}
        BL      FIQ_Exception
        LDMFD   SP!, {R0-R3, LR}
        SUBS    PC,  LR,  #4

;/*********************************************************************************************************
;**函数名称: 	ResetInit
;**功能描述: 	RESET  复位入口初始化外部总线控制器,根据目标板决定配置
;**输 入:   	None 无
;**输 出 :  	None 无
;********************************************************************************************************/
ResetInit
        LDR     R0, =PINSEL2
    IF :DEF: EN_CRP
        LDR     R1, =0x0f814910
    ELSE
        LDR     R1, =0x0f814914
    ENDIF
        STR     R1, [R0]

        LDR     R0, =BCFG0
        LDR     R1, =0x10001c41
        STR     R1, [R0]

        LDR     R0, =BCFG1
        LDR     R1, =0x1000ffef
        STR     R1, [R0]

;        LDR     R0, =BCFG3
;        LDR     R1, =0x2000ffef
;        STR     R1, [R0]
        
;/*********************************************************************************************************
;** 函数名称: InitStack
;** 功能描述: 初始化堆栈
;********************************************************************************************************/
InitStack    
        MOV     R0, LR

;设置管理模式堆栈
        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, stack_limit

; 实现REMAP操作
;REMAPS
;		MOV		R2,#0x40000000			; 复制中断向量代码,设置目标地址
;		LDR		R1,=Vectors				; 设置源地址
;		LDMIA	R1!,{R3-R10}			; 共复制16个字(64字节)
;		STMIA	R2!,{R3-R10}
;		LDMIA	R1!,{R3-R10}
;		STMIA	R2!,{R3-R10}
			
;		LDR		R2,=MEMMAP				; REMAP操作					
;		MOV		R1,#0x01
;		STR		R1,[R2]
;       MSR     CPSR_c, #0x1f
		
		B		__main
		
        MOV     PC, R0

; 其它
P_HZKASCII
		LDR R4,=HZK16
		LDR R5,=HZK_16
		STR R4,[R5]

		LDR R4,=ASCII16
		LDR R5,=ASCII_16
		STR R4,[R5]

		LDR R4,=HZK12
		LDR R5,=HZK_12
		STR R4,[R5]

		LDR R4,=ASCII12
		LDR R5,=ASCII_12
		STR R4,[R5]
		
ARMDisableInt
	STMDB	sp!, {r0}
	MRS		r0, CPSR
	ORR		r0, r0, #0x80
	MSR		CPSR_c, r0
	LDMIA	sp!, {r0}
	MOV	pc, lr

ARMEnableInt
	STMDB	sp!, {r0}
	MRS	r0, CPSR
	BIC	r0, r0, #0x80
	MSR	CPSR_c, r0
	LDMIA	sp!, {r0}
	MOV	pc, lr
;/*********************************************************************************************************
;** 函数名称: __user_initial_stackheap 
;** 功能描述: 库函数初始化堆和栈,不能删除
;** 
;** 输 入: 参考库函数手册
;** 输 出: 参考库函数手册
;**
;********************************************************************************************************/
__user_initial_stackheap    
    LDR   r0,heap_base			;堆的基地址,地址从小往大增长
    LDR   r1,stack_limit		;栈的底部地址
    LDR   r2,heap_limit		;堆的顶部地址
    LDR   r3,stack_base		;栈的基址址,地址从大往小增长
    MOV   pc,lr

;/*********************************************************************************************************
;** 函数名称: __rt_div0
;** 功能描述: 整数除法除数为0错误处理函数,替代原始的__rt_div0减少目标代码大小
;** 
;** 输 入: 参考库函数手册
;********************************************************************************************************/
__rt_div0

        B       __rt_div0

heap_base          DCD     ||Image$$HEAP$$ZI$$Base||  
heap_limit         DCD     (||Image$$HEAP$$ZI$$Limit||-1)  
stack_base         DCD     ||Image$$STACK$$ZI$$Base||  
stack_limit        DCD     ||Image$$STACK$$ZI$$Limit||
ROM_END_ADD        DCD     (||Image$$ROM_EXEC$$Limit||+||Image$$IRAM$$Length||+0x20)
       
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  ;管理模式堆栈空间
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
		SPACE   0x1000
        AREA    Stacks, DATA, NOINIT
		SPACE   0x1000

    END
;/*********************************************************************************************************
;**                            End Of File
;********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -