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

📄 startup.s

📁 philips arm7 lpc2103的常用功能的库函数第二部分
💻 S
📖 第 1 页 / 共 2 页
字号:
	   BEQ    RESULTFALSE
	   ADDNE  R4,R4,#4
	   CMP    R4,#64
	   BCC    FINDLOOP  					                           ;/* 查询优先级结束,可设置中断   */ 
	   LDR	  R0,=VICVectAddr0				                           ;/* 进行参数设置工作             */
	   STR	  R3,[R0,R2, LSL #2]			                           ;/* 存储服务地址                 */
	   LDR    R0,=VICIntEnable
	   MOV    R4,#1
	   MOV    R3,R4,LSL R1
	   STR    R3,[R0]						                           ;/* 使能中断                     */
	   LDR    R0,=VICIntSelect
	   LDR    R5,[R0]
	   BIC    R4,R5,R3 
	   STR    R4,[R0]						                           ;/* 选择IRQ中断                  */
	   ORR	  R1, R1, #0x20
	   LDR    R0,=VICVectCntl0
	   STR    R1, [R0,R2,LSL #2]			                           ;/* 打开中断通道                 */
 	   B	  RESULTTRUE
 
SYSIRQVicGet                                                           ;/* IRQ中断状态获取              */
	   CMP    R1, #32				                                   ;/* if(通道号 >=32) return FALSE */
 	   BCS	  RESULTFALSE
 	  
 	   MOV    R4,#0					                                   ;/* 开始循环查找                 */
 	   LDR    R0,=VICVectCntl0
 	   ORR    R5,R1,#0X20
SETLOOP
 	   CMP    R4,#64
 	   BCS    RESULTFALSE
 	   LDR    R3,[R0,R4]
  	   CMP    R3,R5
 	   ADDNE  R4,R4,#4				
 	   BNE    SETLOOP
 	   MOV    R4,R4,LSR #2
 	   STR    R4,[R2]				
 	   STR    R1,[R2,#4]
 	   LDR    R0,=VICVectAddr0
 	   LDR    R3,[R0,R4,LSL #2]
 	   STR    R3,[R2,#8]
 	   B      RESULTTRUE
 	   
SYSIRQVicClr                                                           ;/* IRQ中断清除函数              */
	   CMP    R1, #32				                                   ;/* if(通道号 >=32) return FALSE */
 	   BCS	  RESULTFALSE
 	   
 	   MOV    R4,#0					
 	   LDR    R0,=VICVectCntl0
 	   ORR    R2,R1,#0x20
CLRLOOP
 	   CMP    R4,#64
 	   BCS    RESULTFALSE
 	   LDR    R3,[R0,R4]
 	   CMP    R3,R2
 	   ADDNE  R4,R4,#4				 
 	   BNE    CLRLOOP
  	   LDR    R0,=VICIntEnClr
	   MOV    R3,#1
 	   MOV    R3,R3,LSL R1
 	   STR    R3,[R0]
 	   LDR    R0,=VICVectCntl0
 	   MOV    R1,#0
 	   STR    R1,[R0,R4]			 
 	   LDR    R0,=VICVectAddr0
 	   STR    R1,[R0,R4]
 	   B      RESULTTRUE
 	   
;/*
; *  非向量中断管理,调用该函数原形见IRQManage.h
; */
SYSIRQVicDefSet                                                        ;/* 非向量IRQ中断设置              */
	   CMP    R1, #32                                                  ;/* if(通道号 >=32) return FALSE */
 	   BCS	  RESULTFALSE
		
	   LDR    R0,=VICDefVectAddr
	   LDR    R4,[R0]
	   CMP    R4,#0
	   BNE    RESULTFALSE
	   STR    R2,[R0]                                                  ;/* 设置非向量中断服务程序地址   */
	   MOV    R4,#1
	   MOV    R1,R4,LSL R1 
	   LDR    R0,=VICIntEnable
	   STR    R1,[R0]                                                  ;/* 设置中断允许                 */
	   LDR    R0,=VICIntSelect		
	   LDR    R3,[R0]
	   BIC    R3,R3,R1
	   STR    R3,[R0]                                                  ;/* 设置为IRQ                    */
	   B      RESULTTRUE
	   
SYSIRQVicDefClr                                                        ;/* 非向量IRQ中断清除            */
	   CMP    R1, #32				                                   ;/* if(通道号 >=32) return FALSE */
 	   BCS	  RESULTFALSE
 	   
	   LDR    R0,=VICDefVectAddr
	   LDR    R4,[R0]
	   CMP    R4,#0
	   BEQ    RESULTFALSE
	   MOV    R4,#0
	   STR    R4,[R0]                                                  ;/* 设置非向量中断服务程序地址   */
	   MOV    R4,#1
	   MOV    R1,R4,LSL R1 
	   LDR    R0,=VICIntEnClr
	   STR    R1,[R0]				                                   ;/* 设置中断允许                 */
	   B      RESULTTRUE
	   
;/*
; *  设置系统FIQ中断开关,具体使用看FIQ.H头文件描述   
; */     
SYSFIQSet                                                              ;/* FIQ中断设置                  */
        MOV	  R3,#0
        LDR	  R0,=VICIntSelect			
        LDR   R2,[R0]
        MOV   R0,#1
        MOV   R1,R0,LSL R1
        CMP   R2,#0                                                    ;/* 判断是否已经设置了FIQ        */
        BNE   RESULTFALSE
        LDR   R0,=VICIntSelect			
        STR   R1,[R0]
        LDR   R0,=VICIntEnable			
        STR   R1,[R0]
        B     RESULTTRUE

SYSFIQClr                                                              ;/* FIQ中断清除                  */
        MOV   R3,#0
        LDR   R2,[R3,#-0xff4]			
        MOV   R0,#1
        MOV   R1,R0,LSL R1
        CMP   R2,#0
        BEQ   RESULTFALSE
        BICNE R2,R2,R1
        STRNE R2,[R3,#-0xff4]			
        STRNE R1,[R3,#-0xfec]			
        CMP   R2,#0
        BEQ   RESULTTRUE
        
RESULTFALSE                                                            ;/* 失败返回                     */
 	    MSR     CPSR_c,#(SYS32Mode | NoInt | NoFIQ )
 	    LDMFD   SP!,{R4-R6} 
 	    MSR     CPSR_c,#(SVC32Mode | NoInt | NoFIQ )	  
		MOV     R0,#-1
        MOVS    PC, LR
        
RESULTTRUE                                                             ;/* 成功返回                     */
 	    MSR     CPSR_c,#(SYS32Mode | NoInt | NoFIQ )
 	    LDMFD   SP!,{R4-R6} 
 	    MSR     CPSR_c,#(SVC32Mode | NoInt | NoFIQ )	  
		MOV     R0,#1
        MOVS    PC, LR
            
;/********************************************************************************************************
;** Function name:           InitStack
;** Descriptions:            初始化堆栈
;** Input parameters:        NONE
;** Output parameters:       NONE
;** Returned value:          NONE
;********************************************************************************************************/
InitStack    
        MOV     R0, LR
;Build the SVC stack
;设置管理模式堆栈
        MSR     CPSR_c, #0xd3		
        LDR     SP, StackSvc	
;Build the IRQ stack	
;设置中断模式堆栈
        MSR     CPSR_c, #0xd2
        LDR     SP, StackIrq
;Build the FIQ stack
;设置快速中断模式堆栈
        MSR     CPSR_c, #0xd1
        LDR     SP, StackFiq
;Build the DATAABORT stack
;设置中止模式堆栈
        MSR     CPSR_c, #0xd7
        LDR     SP, StackAbt
;Build the UDF stack
;设置未定义模式堆栈
        MSR     CPSR_c, #0xdb
        LDR     SP, StackUnd
;Build the User stack
;设置用户模式堆栈
        MSR     CPSR_c, #0xd0
        LDR     SP, =StackUsr

        MOV     PC, R0

;/********************************************************************************************************
;** Function name:           ClrVic
;** Descriptions:            清楚中断向量表残留设置,主要方便仿真调试
;** Input parameters:        NONE
;** Output parameters:       NONE
;** Returned value:          NONE
;********************************************************************************************************/
ClrVic
   MVN R0,#0
   LDR R1,=VICIntEnClr
   STR R0,[R1]
   MOV R0,#0
   LDR R1,=VICIntSelect
   STR R0,[R1]
   MOV R2,#0
   LDR R1,=VICVectAddr0
   
ClrADDRLoop
   STR R0,[R1,R2]
   ADD R2,R2,#4
   CMP R2,#64
   BCC ClrADDRLoop
   MOV R2,#0
   LDR R1,=VICVectCntl0
   
ClrCntlLoop
   STR R0,[R1,R2]
   ADD R2,R2,#4
   CMP R2,#64
   BCC ClrCntlLoop
   LDR R1,=VICDefVectAddr
   STR R0,[R1]
   LDR R1,=VICVectAddr
   STR R0,[R1]
   
   MOV PC,LR
   

;/********************************************************************************************************
;** Function name:           ResetInit
;** Descriptions:            复位入口
;** Input parameters:        NONE
;** Output parameters:       NONE
;** Returned value:          NONE
;********************************************************************************************************/
ResetInit

;/* 
; *  初始化中断进入次数
; */
        LDR     R0,=IRQ_EnterSum        
        MOV     R1,#1
        STR     R1,[R0]
        
        BL      ClrVic
        BL      InitStack               ;初始化堆栈 Initialize the stack
        BL      TargetResetInit         ;目标板基本初始化 Initialize the target board
        B       __main                  ;跳转到c语言入口 Jump to the entry point of C program
        
;/********************************************************************************************************
;** Function name:           __user_initial_stackheap
;** Descriptions:            库函数初始化堆和栈
;** Input parameters:        NONE
;** Output parameters:       NONE
;** Returned value:          NONE
;********************************************************************************************************/
__user_initial_stackheap    
    LDR   r0,=bottom_of_heap
;    LDR   r1,=StackUsr
    MOV   pc,lr


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  ;Stack spaces for Administration Mode 管理模式堆栈空间
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
bottom_of_heap    SPACE   1

        AREA    Stacks, DATA, NOINIT
StackUsr

    END
;/********************************************************************************************************
;   END FILE
;********************************************************************************************************/

⌨️ 快捷键说明

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