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

📄 int.s

📁 s3c2410平台下USB驱动的源代码:USB1.1协议及S3C2410 USB device实验
💻 S
📖 第 1 页 / 共 2 页
字号:

;// 初始化IRQ模式下的堆栈   
    MRS    	r0,CPSR                         	;// Pickup current CPSR
    BIC    	r0,r0,#MODE_MASK                	;// Clear the mode bits
    ORR    	r0,r0,#MODE_IRQ                 	;// Set the IRQ mode bits
    MSR    	CPSR_cxsf,r0                    	;// Move to IRQ mode                                	
	LDR		SP,=IRQ_STACK                         	;// Setup IRQ stack pointer
;// 初始化SUP模式下的堆栈   
    MRS    	r0,CPSR                         	;// Pickup current CPSR
    BIC    	r0,r0,#MODE_MASK                	;// Clear the mode bits
    ORR    	r0,r0,#MODE_SUP               	;// Set the SUP mode bits
    MSR    	CPSR_cxsf,r0                    	;// Move to SUP mode                                	
	LDR		SP,=SVC_STACK                         	;// Setup SUP stack pointer
;// 转回系统模式,并使能中断标志位    
    MRS    	r0,CPSR                         	;// Pickup current CPSR
    BIC    	r0,r0,#MODE_MASK                	;// Clear mode bits
    ORR    	r0,r0,#MODE_SYS                 	;// Set the SYSTEM mode bits    
    BIC		R0,R0,#INTLOCK						;// 开中断    
    MSR     CPSR_cxsf,r0                    	;// All interrupt stacks are setup,
                                           		;// return to supervisor mode
                           		
    
                                           	                                           	
;/*
;***************************************************************************************************
;									  C语言的调用(跳至应用程序)                       
;***************************************************************************************************
;*/	

	IMPORT		C_Entry
	B			C_Entry ;C_Entry是一个循环程序

    
;/*
;***************************************************************************************************
;*												INT_IRQ
;*
;***************************************************************************************************
;*/
  
    AREA IRQ,CODE,READONLY
    EXPORT  INT_IRQ
INT_IRQ
;/* This Code is used to correctly handle interrupts and
;   is necessary due to the nature of the ARM7 architecture  */
    STMDB   sp!, {r1}   ;保存寄存器r1,将r1压栈
    MRS     r1, SPSR
    TST     r1, #I_BIT
    LDMIA   sp!, {r1}
    SUBNES  pc,lr,#4


;//LR_IRQ,SPSR_IRQ压栈来避免下一次中断发生使它们被冲掉
  SUB	lr, lr, #4
  STMFD	sp!, {lr} 
  MRS	r14, SPSR
  STMFD	sp!, {r0-r4, r14}
 ;// 查寄存器INTOFFSET找出对应的中断    
 	LDR		R0,=INTOFFSET
 	LDR		R0,[R0,#0]
 	CMP		R0,#0X0
 	BNE		IRQ_VECTOR_FOUND
;// No bits in pending register set, restore context and exit interrupt servicing
    LDMIA	SP!,{R0-R4,R14}
    MSR		SPSR_csxf,R14
    LDMIA	SP!,{PC}^
;//清中断控制源
IRQ_VECTOR_FOUND
	CMP R0,#Handler_ADC
	BNE SUB_UART_CLEAR
	LDR	R1,=ADCTSC		;//设置触摸屏为Y转换模式
	LDR	R2,=0X69
	STR	R2,[R1,#0]
	LDR   R1,=SUBSRCPND
	LDR	  R2,=INT_SUB_TC	
	STR   R2,[R1,#0]
	B	INT_SOUR_CLEAR 
SUB_UART_CLEAR			;//清uart中断源
	CMP R0,#Handler_UART0
	BNE INT_SOUR_CLEAR
	LDR   R1,=SUBSRCPND		;//清touch panel中断源
	LDR	R2,=(INT_SUB_TXD0:OR:INT_SUB_RXD0)
	STR	R2,[R1,#0]
INT_SOUR_CLEAR 
	LDR		R2,=INTPND
	LDR		R3,[R2,#0]      
	LDR		R1,=SRCPND
	STR		R3,[R1,#0]
	STR		R3,[R2,#0]
	
;// Get IRQ vector table address
    LDR     r3,=INT_IRQ_Vectors         ;// Get IRQ vector table address
    MOV     r2, r0, LSL #2              ;// Multiply vector by 4 to get offset into table
    ADD     r3, r3, r2                  ;// Adjust vector table address to correct offset
    LDR     r2, [r3,#0]                 ;// Load branch address from vector table
    MOV     PC, r2                      ;// Jump to correct branch location based on vector table




;/*
;***************************************************************************************************
;*										INT_ADC_Shell
;*
;***************************************************************************************************
;*/

	EXPORT	INT_ADC_Shell
INT_ADC_Shell
    MRS     r1,CPSR                      ;// Pickup current CPSR
    BIC     r1,r1,#MODE_MASK             ;// Clear the mode bits
    ORR     r1,r1,#MODE_SYS              ;// Set the SYS mode bits
   BIC     r1,r1,#I_BIT		         ;//ENABLE INT
   MSR     CPSR_cxsf,r1                 ;// Change to IRQ mode 

    MOV     r4,lr                        ;// Put IRQ return address into r4

;// 跳至上下文保存处理程序
	
	STMDB	SP!,{LR}

;// 跳至中断服务程序 
	 	
 ;//   BL      TPLCD_LISR		          ;// processing.     
    LDMIA	SP!,{LR}                                    
;// 返回到IRQ模式        		 						                                            
    MRS     r1,CPSR                      ;// Pickup current CPSR
    BIC     r1,r1,#MODE_MASK             ;// Clear the mode bits
    ORR     r1,r1,#MODE_IRQ              ;// Set the IRQ mode bits
    ORR	    R1,R1,#I_BIT			;//DISABLE INT
    MSR     CPSR_cxsf,r1                 ;// Change to IRQ mode
    
 ;//此值是在进入IRQ时设置的 
    LDMIA	SP!,{R0-R4,R14}
    MSR		SPSR_csxf,R14
    LDMIA	SP!,{PC}^









;/*
;***************************************************************************************************
;*										INT_UART0_Shell
;*
;***************************************************************************************************
;*/

	EXPORT	INT_UART0_Shell
INT_UART0_Shell
    MRS     r1,CPSR                      ;// Pickup current CPSR
    BIC     r1,r1,#MODE_MASK             ;// Clear the mode bits
    ORR     r1,r1,#MODE_SYS              ;// Set the SYS mode bits
    BIC     r1,r1,#I_BIT		 ;//ENABLE INT
    MSR     CPSR_cxsf,r1                 ;// Change to IRQ mode 

   ;// MOV     r4,lr                        ;// Put IRQ return address into r4

;// 跳至上下文保存处理程序
	
	STMDB	SP!,{LR}

;// 跳至中断服务程序 
;//	LDR R0,=Handler_UART0
;//    BL      SDC_LISR	 	          ;// processing.     
    LDMIA	SP!,{LR}                                    
;// 返回到IRQ模式        		 						                                            
    MRS     r1,CPSR                      ;// Pickup current CPSR
    BIC     r1,r1,#MODE_MASK             ;// Clear the mode bits
    ORR     r1,r1,#MODE_IRQ              ;// Set the IRQ mode bits
    ORR	    R1,R1,#I_BIT			;//DISABLE INT
    MSR     CPSR_cxsf,r1                 ;// Change to IRQ mode
    
 ;//此值是在进入IRQ时设置的   
    LDMIA	SP!,{R0-R4,R14}
    MSR		SPSR_csxf,R14
    LDMIA	SP!,{PC}^
		
;/*
;***************************************************************************************************
;*										INT_USBD_Shell
;*
;***************************************************************************************************
;*/

	EXPORT	INT_USBD_Shell
INT_USBD_Shell
    MRS     r1,CPSR                      ;// Pickup current CPSR
    BIC     r1,r1,#MODE_MASK             ;// Clear the mode bits
    ORR     r1,r1,#MODE_SYS              ;// Set the SYS mode bits
    ORR     r1,r1,#I_BIT				 ;//DISABLE INT
    MSR     CPSR_cxsf,r1                 ;// Change to IRQ mode 

   ;// MOV     r4,lr                        ;// Put IRQ return address into r4

;// 跳至上下文保存处理程序
	
	STMDB	SP!,{LR}

;// 跳至中断服务程序 
;//	LDR R0,=Handler_UART0
;//    BL      SDC_LISR	 	          ;// processing.
	BL	IsrUsbd     
    LDMIA	SP!,{LR}                                    
;// 返回到IRQ模式        		 						                                            
    MRS     r1,CPSR                      ;// Pickup current CPSR
    BIC     r1,r1,#MODE_MASK             ;// Clear the mode bits
    ORR     r1,r1,#MODE_IRQ              ;// Set the IRQ mode bits
    BIC	    R1,R1,#I_BIT				;//ENABLE INT
    MSR     CPSR_cxsf,r1                 ;// Change to IRQ mode
    
 ;//此值是在进入IRQ时设置的   
    LDMIA	SP!,{R0-R4,R14}
    MSR		SPSR_csxf,R14
    LDMIA	SP!,{PC}^
		
				
	END 

⌨️ 快捷键说明

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