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

📄 2440vectors.s

📁 很不错的基于UCOS2的GUI源码
💻 S
字号:
;=========================================
; NAME: 2440vectors.S
; DESC: C start up codes
;       Configure memory, ISR ,stacks
;	Initialize C-variables
; HISTORY:
; 2007.07.12:   Freddy.Ding   : ver 0.0
;=========================================


	GET ..\2440_CODE\option.inc
	GET ..\2440_CODE\memcfg.inc
	GET ..\2440_CODE\2440addr.inc

    IMPORT OSIntEnter
	IMPORT OSIntExit
	IMPORT ResetHandler           ; In init.s
	

 		MACRO
$HandlerLabel HANDLER $HandleLabel

$HandlerLabel
	sub	sp,sp,#4	              ;decrement sp(to store jump address)
	stmfd	sp!,{r0}	          ;PUSH the work register to stack(lr does not push because it return to original address)
	ldr     r0,=$HandleLabel      ;load the address of HandleXXX to r0
	ldr     r0,[r0]	              ;load the contents(service routine start address) of HandleXXX
	str     r0,[sp,#4]            ;store the contents(ISR) of HandleXXX to stack
	ldmfd   sp!,{r0,pc}           ;POP the work register and pc(jump to ISR)
	MEND


		
	AREA    Vect,CODE,READONLY

	ENTRY
; *****************
; Exception Vectors
; *****************

; Note: LDR PC instructions are used here, though branch (B) instructions
; could also be used, unless the ROM is at an address >32MB.
	
VectorsAddr
        LDR     PC, Reset_Addr
        LDR     PC, Undefined_Addr
        LDR     PC, SWI_Addr
        LDR     PC, Prefetch_Addr
        LDR     PC, Abort_Addr
        NOP                              ; Reserved vector
        LDR     PC, IRQ_Addr
        LDR     PC, FIQ_Addr
        
   EXPORT VectorsAddr     

	
Reset_Addr      DCD     ResetHandler
Undefined_Addr  DCD     HandlerUndef
SWI_Addr        DCD     HandlerSWI
Prefetch_Addr   DCD     HandlerPabort
Abort_Addr      DCD     HandlerDabort
IRQ_Addr        DCD     HandlerIRQ
FIQ_Addr        DCD     HandlerFIQ



	
HandlerFIQ      HANDLER HandleFIQ
HandlerIRQ      HANDLER HandleIRQ
HandlerUndef    HANDLER HandleUndef
HandlerSWI      HANDLER HandleSWI
HandlerDabort   HANDLER HandleDabort
HandlerPabort   HANDLER HandlePabort

IRQMODE     EQU 	0x12
SVCMODE     EQU 	0x13	
NOINT       EQU 	0xc0
    
    IMPORT C_IRQHandler
    EXPORT IRQ_ISR
	EXPORT HandleIRQ
IRQ_ISR
	 	;STMFD 	sp!, {r0-r12,lr}               ;    irq will change these reg so,push them first
	 	
		STMFD   SP!, {R1-R3}                   ;    PUSH WORKING REGISTERS ONTO IRQ STACK

        MOV     R1, SP                         ;    Save   IRQ stack pointer

        SUB     R2, LR,#4                      ;    Adjust PC for return address to task

        MRS     R3, SPSR                       ;    Copy SPSR (i.e. interrupted tasks CPSR) to R3
        
        ADD     SP, SP, #12
		;-------------------
		;从IRQ切换到SVC模式
		;-------------------
        MSR     CPSR_c, #(NOINT | SVCMODE)     ;    Change to SVC mode

                                               ;    SAVE TASKS CONTEXT ONTO TASKS STACK
        STMFD   SP!, {R2}                      ;    Push tasks Return PC
        STMFD   SP!, {LR}                      ;    Push tasks LR
        STMFD   SP!, {R4-R12}                  ;    Push tasks R12-R4

        LDMFD   R1!, {R4-R6}                   ;    Move tasks R1-R3 from IRQ stack to SVC stack
        STMFD   SP!, {R4-R6}
        STMFD   SP!, {R0}                      ;    Push tasks R0    onto tasks stack
        STMFD   SP!, {R3}                      ;    Push tas CPSR (i.e. IRQs SPSR);
	       
	
	    BL OSIntEnter
    
    
; ----------------identify source of interrupt----------BEGIN---------------

	   ldr	r9,=INTOFFSET
	   ldr	r9,[r9]
	   ldr	r0,=HandleEINT0
	   add	r0,r0,r9,lsl #2
	   ldr	r0,[r0]

; ----------------identify source of interrupt-----------END----------------
	 
	
	
	   BL C_IRQHandler
	
	
	   BL OSIntExit
	   
	
	
    LDMFD 	sp!, {r4}                ; get cpsr_svc from stack
	MSR     spsr_cxsf, r4      		 ; prepare spsr_cxsf to return svc mode	
	LDMFD	sp!, {r0-r12, lr,pc}^       ; recover r0-r12 and pc from stack, cpsr also


	ALIGN

	AREA RamData, DATA, READWRITE

	^   _ISR_STARTADDRESS		; _ISR_STARTADDRESS=0x33FF_FF00
HandleReset 	#   4
HandleUndef 	#   4
HandleSWI		#   4
HandlePabort    #   4
HandleDabort    #   4
HandleReserved  #   4
HandleIRQ		#   4
HandleFIQ		#   4

;Dont use the label 'IntVectorTable',
;The value of IntVectorTable is different with the address you think it may be.
;IntVectorTable
;@0x33FF_FF20
HandleEINT0		#   4
HandleEINT1		#   4
HandleEINT2		#   4
HandleEINT3		#   4
HandleEINT4_7	#   4
HandleEINT8_23	#   4
HandleCAM		#   4		; Added for 2440.
HandleBATFLT	#   4
HandleTICK		#   4
HandleWDT		#   4
HandleTIMER0 	#   4
HandleTIMER1 	#   4
HandleTIMER2 	#   4
HandleTIMER3 	#   4
HandleTIMER4 	#   4
HandleUART2  	#   4
;@0x33FF_FF60
HandleLCD 		#   4
HandleDMA0		#   4
HandleDMA1		#   4
HandleDMA2		#   4
HandleDMA3		#   4
HandleMMC		#   4
HandleSPI0		#   4
HandleUART1		#   4
HandleNFCON		#   4		; Added for 2440.
HandleUSBD		#   4
HandleUSBH		#   4
HandleIIC		#   4
HandleUART0 	#   4
HandleSPI1 		#   4
HandleRTC 		#   4
HandleADC 		#   4
;@0x33FF_FFA0

   
	END

⌨️ 快捷键说明

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