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

📄 startup_1.s

📁 LPC2292 bios测试程序 说明:YL_LPC229X_BIOS_Data的目录说明
💻 S
字号:

;/********************************************************************************************************/
;定义堆栈的大小
USR_STACK_LEGTH         EQU         256
SVC_STACK_LEGTH         EQU         0
FIQ_STACK_LEGTH         EQU         0
IRQ_STACK_LEGTH         EQU         256
ABT_STACK_LEGTH         EQU         0
UND_STACK_LEGTH         EQU         0
;USR_STACK_LEGTH		EQU			0


NoInt       EQU 0x80

USR32Mode   EQU 0x10
SVC32Mode   EQU 0x13
SYS32Mode   EQU 0x1f
IRQ32Mode   EQU 0x12
FIQ32Mode   EQU 0x11

PINSEL2     EQU 0xE002C014

BCFG0       EQU 0xFFE00000
BCFG1       EQU 0xFFE00004
BCFG2       EQU 0xFFE00008
BCFG3       EQU 0xFFE0000C
;//************************************************************
;检查是否使用tasm.exe进行编译
	
 GBLL    THUMBCODE
    [ {CONFIG} = 16	
THUMBCODE SETL	{TRUE}
    CODE32
    |   
THUMBCODE SETL	{FALSE}
    ]

    [ THUMBCODE
    CODE32   ;for start-up code for Thumb mode
    ]
    
	MACRO		
	MOV_PC_LR
	[ THUMBCODE
    	bx lr
	|
		mov pc, lr
	]
	MEND
 

;引入的外部标号在这声明
    IMPORT  FIQ_Exception                   ;快速中断异常处理程序
    EXPORT __rt_div0
    IMPORT  main                          ;C语言主程序入口 
    IMPORT  TargetResetInit                 ;目标板基本初始化
   

;给外部使用的标号在这声明
    EXPORT  Reset
  
    CODE32

    AREA    vectors,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

;未定义指令
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

;/*********************************************************************************************************
;** 函数名称: 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, =StackUsr

        MOV     PC, R0

;/*********************************************************************************************************
;** 函数名称: ResetInit
;********************************************************************************************************/
ResetInit
;初始化外部总线控制器,根据目标板决定配置

        LDR     R0, =PINSEL2
    IF :DEF: EN_CRP
        LDR     R1, =0x0f814910
    ELSE
        LDR     R1, =0x0f814914
    ENDIF
        STR     R1, [R0]

        LDR     R0, =BCFG0
        LDR     R1, =((1<<28)+(0x4<<11)+(1<<10)+(0x4<<5)+(0x01));//16位数据宽度,存取周期90nS(SST39VF1601-90)  OK
        STR     R1, [R0]	;//以上的值是我实验最快的值,速度再快就要出错了!gongjun

        LDR     R0, =BCFG1
        LDR     R1, =((1<<28)+(0x02<<11)+(1<<10)+(0x02<<5)+(1));//16位数据宽度,存取周期10nS(SRAM 慢速)  OK
        ;//LDR     R1, =((1<<28)+(1<<11)+(1<<10)+(1<<5)+(1));//16位数据宽度,存取周期10nS(SRAM IS61LV25616-10T)
        STR     R1, [R0]	;//以上的值是我实验最快的值,速度再快就要出错了!gongjun

        LDR     R0, =BCFG2
        ;//LDR     R1, =((0<<28)+(0x5<<11)+(1<<10)+(0x5<<5)+(0x01))		;//8位数据宽度,(PDIUSBD12和LCD、NandFlash)
        LDR     R1, =((0<<28)+(0x6<<11)+(1<<10)+(0x6<<5)+(0x01))		;//8位数据宽度,(PDIUSBD12和LCD、NandFlash)  OK
        STR     R1, [R0]

        LDR     R0, =BCFG3
        LDR     R1, =((1<<28)+(0x0f<<11)+(1<<10)+(0x0f<<5)+(0x8))		;//16位数据宽度,(GCS3 用户使用)  OK
        ;//LDR     R1, =((1<<28)+(0x04<<11)+(1<<10)+(0x04<<5)+(0x1))		;//16位数据宽度,(GCS3 用户使用)
        ;//LDR     R1, =((1<<28)+(0x1f<<11)+(1<<10)+(0x1f<<5)+(0xf))		;//16位数据宽度,(GCS3 用户使用)
        STR     R1, [R0]
        
        BL      InitStack               ;初始化堆栈
        BL      TargetResetInit         ;目标板基本初始化
                                        
        B       main					;跳转到c语言入口

;/********************************************************************************************************/
	EXPORT DisableInt
DisableInt
	mrs	r0,	cpsr
	orr	r0,	r0, #NoInt
	msr	cpsr_cf, r0
	MOV_PC_LR
	
	EXPORT EnableInt
EnableInt
	mrs	r0,	cpsr
	bic	r0,	r0, #NoInt
	msr	cpsr_cf, r0
	MOV_PC_LR
	
;save cpsr and disable int, r0 = address to save cpsr
	EXPORT	EnterCritical
EnterCritical   
	mrs	r1, cpsr
	str	r1, [r0]
	orr	r1, r1, #NoInt
	msr	cpsr_cxsf, r1		
	MOV_PC_LR
;restore cpsr, r0 = address to restore cpsr	
	EXPORT	ExitCritical
ExitCritical
	ldr	r1, [r0]
	msr	cpsr_cxsf, r1	
	MOV_PC_LR	

	EXPORT	outportb
outportb	strb	r0, [r1]
	MOV_PC_LR
	
	EXPORT	outportw
outportw	strh	r0, [r1]
	MOV_PC_LR
	
	EXPORT	outportl
outportl	str	r0, [r1]
	MOV_PC_LR
	
	EXPORT	inportb
inportb	ldrb	r0, [r0]
	MOV_PC_LR

	EXPORT	inportw
inportw	ldrh	r0, [r0]
	MOV_PC_LR

	EXPORT	inportl
inportl	ldr	r0, [r0]
	MOV_PC_LR
	


;/*********************************************************************************************************
;** 函数名称: __rt_div0
;/********************************************************************************************************/
__rt_div0

        B       __rt_div0

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


    MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function

        EXPORT  $IRQ_Label                      ; 输出的标号
        IMPORT  $IRQ_Exception_Function         ; 引用的外部标号

$IRQ_Label
        SUB     LR, LR, #4                      ; 计算返回地址
        STMFD   SP!, {R0-R3, R12, LR}           ; 保存任务环境
        MRS     R3, SPSR                        ; 保存状态
        STMFD   SP!, {R3}
        STMFD   SP, {LR}^                       ; 保存用户状态的SP,注意不能回写
                                                ; 如果回写的是用户的SP,所以后面要调整SP
        SUB     SP, SP, #4

        MSR     CPSR_c, #(NoInt | SYS32Mode)    ; 切换到系统模式
       
        BL      $IRQ_Exception_Function         ; 调用c语言的中断处理程序

        MSR     CPSR_c, #(NoInt | IRQ32Mode)    ; 切换回irq模式
        LDMFD   SP, {LR}^                       ; 恢复用户状态的SP,注意不能回写
                                                ; 如果回写的是用户的SP,所以后面要调整SP
        ADD     SP, SP, #4                      ; 
        LDMFD   SP!, {R3}
        MSR     SPSR_cxsf, R3

        LDMFD   SP!, {R0-R3, R12, PC}^          ;
    MEND

;/*********************************************************************************************************
;** 函数名称: CrpData
;** 功能描述: 支持芯片加密功能
;/********************************************************************************************************/
    IF :DEF: EN_CRP
        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          ;/* 当此数为0x87654321时,用户程序被保护 */
    DCD     0x00000000          ;/* 当此数不为0x87654321时,用户程序不被保护 */
    ENDIF
;/* 分配堆栈空间 */
        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  ;未定义模式堆栈
StackUsr   		   SPACE 	1
    END
;/*********************************************************************************************************
;**                            End Of File
;/********************************************************************************************************/

⌨️ 快捷键说明

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