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

📄 viccontrol.s

📁 基于ARM7下的2100系列得uc-osII的工程模板!
💻 S
📖 第 1 页 / 共 2 页
字号:
;/****************************************Copyright (c)**************************************************
;**                         Guangzhou ZHIYUAN electronics Co.,LTD.                               
;**                                     
;**                               http://www.embedtools.com
;**
;**--------------File Info-------------------------------------------------------------------------------
;** File name: 			vicControl.s
;** Last modified Date: 2007-09-09
;** Last Version: 		1.0
;** Descriptions: 		Provide VIC_Control in prerogative mode
;**------------------------------------------------------------------------------------------------------
;** Created by: 		LinEnqiang
;** Created date:   	2007-09-08
;** Version:			1.0
;** Descriptions: 		The original version
;**
;**------------------------------------------------------------------------------------------------------
;** Modified by: 		LinEnqiang
;** Modified date:		2008-04-30
;** Version:			1.0
;** Descriptions:       统一于代码规范V1.2
;********************************************************************************************************/
                                INCLUDE     LPC2200.INC                 ;/* 引入头文件                  */

;/********************************************************************************************************
; 宏定义
;********************************************************************************************************/
NoInt       EQU 0x80
NoFIQ		EQU	0x40

SVC32Mode   EQU 0x13
SYS32Mode   EQU 0x1f

MAX_ID		EQU	0x20
MAX_PRI		EQU 0x10

			;IMPORT  StackUsr 			
			
			EXPORT  RunFirst
	 		EXPORT  vicControl
	 		;EXPORT  IRQ_Handler
	CODE32
    AREA    |RUNFIRST|, CODE, READONLY     

;/********************************************************************************************************
;** Function name:          RunFirst
;**
;** Descriptions:           初始化VIC
;**
;** input parameters:       None
;** Returned value:         None
;**
;** Created by:             LinEnqiang
;** Created Date:           2008/04/30
;**-------------------------------------------------------------------------------------------------------
;** Modified by:            
;** Modified date:          
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/

RunFirst

		LDR     R2, =VICIntEnClr
		MVN     R3, #0x00
		STR	    R3, [R2] 
		
		LDR     R2, =VICSoftIntClear		
		STR	    R3, [R2] 
		
		LDR     R2, =VICIntSelect
		MOV     R3, #0x00
		STR	    R3, [R2] 

		LDR     R2, =VICDefVectAddr
		STR	    R3, [R2]
		
		LDR     R2, =VICVectAddr
		STR	    R3, [R2] 
		
        LDR     R0, =VICVectAddr0
        MOV     R1, #0
        MOV     R2, #0
        MOV     R3, #0
        MOV     R4, #0
        MOV     R5, #0
        MOV     R6, #0
        MOV     R7, #0
        MOV     R8, #0
        STMIA   R0!, {R1-R8}
        STMIA   R0!, {R1-R8}    
        
        LDR     R0, =VICVectCntl0
        STMIA   R0!, {R1-R8}
        STMIA   R0!, {R1-R8}     		
		
		
		LDR     R2, =VICProtection
        MOV     R3, #0x01
        STR	    R3, [R2]   
         
		BX	    LR	

;/********************************************************************************************************
;** Function name:           SEARCH_PRI
;** Descriptions:            查询给定通道号(R1)的IRQ优先级,通过R0返回
;** input parameters:        依功能而定
;** output parameters:       依功能而定
;** Returned value:          依功能而定
;** Created by:              LinEnqiang
;** Created Date:            2008/04/30
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/

SEARCH_PRI	
		MSR     CPSR_c, #(NoFIQ | NoInt | SYS32Mode)
        STMFD   SP!, {R2,R3}
		
		CMP     R1, #MAX_ID
		MOVCS   R0, #0xFF
		BCS   	%F1	
		
        MOV		R0, #0
		LDR		R2,	=VICVectCntl0
						
0		CMP     R0, #MAX_PRI
		MOVCS   R0, #0xFF
		BCS		%F1		
		
		LDR		R3,	[R2,R0,LSL #2]
		AND		R3,	R3,R1 
        CMP     R3,	R1
        BEQ		%F1
        
        ADDNE	R0,R0,#1
        BNE	    %B0  
        
1		LDMFD	SP!,{R2,R3}
        MSR   	CPSR_c, #(NoFIQ | NoInt | SVC32Mode)
        MOV   	PC, LR
;/********************************************************************************************************
;** Function name:           vicControl
;** Descriptions:            软件中断,用于提供VIC管理服务
;** input parameters:        依功能而定
;** output parameters:       依功能而定
;** Returned value:          依功能而定
;** Created by:              LinEnqiang
;** Created Date:            2008/04/30
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
vicControl 
        SUB     R0, R0, #0x100
        CMP     R0, #0x0C
        LDRLO   PC, [PC, R0, LSL #2]
        MOVS    PC, LR
SwiFunctionAdd
        DCD     SetvicIrqFunc                                           ;  0
        DCD     ClrvicIrqFunc                                           ;  1
        DCD     EnablevicIrq                                            ;  2
        DCD     DisablevicIrq                                           ;  3
        DCD     GetvicIrqStatus                                         ;  4
        DCD     SetvicFiq                                               ;  5
        DCD     ClrvicFiq                                               ;  6    
        DCD		SetDefIRQ												;  7
        DCD		EnableDefvic      	        							;  8
        DCD		DisableDefvic               							;  9
        DCD		EnablevicSoftInt	        							;  10
        DCD		DisablevicSoftInt	        							;  11	
;/*********************************************************************************************************
;** Function name:           SetvicIrqFunc
;** Descriptions:            设置所选外设的中断优先级、中断服务函数地址,并使能中断
;** input parameters:        R0:         外设对应的中断通道号
;**                          R1:         中断优先级
;**                          R2:         中断服务函数地址
;** output parameters:       none
;** Returned value:          1:          成功
;**                          0:          失败
;** Created by:              LinEnqiang
;** Created Date:            2008/04/30
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;*********************************************************************************************************/
SetvicIrqFunc
        CMP     R1, #32                                                 ;/* if(通道号 >=32) return FALSE*/
        MOVCS   R0, #0
        MOVCSS  PC, LR
        CMP     R2, #16                                                 ;/* if(优先级 >=16) return FALSE*/
        MOVCS   R0, #0 
        MOVCSS  PC, LR 
        CMP     R3, #0                                                  ;/* if(处理函数==0) return FALSE*/
        MOVEQ   R0, #0
        MOVEQS  PC, LR
		     
 		MSR     CPSR_c, #(NoFIQ | NoInt | SYS32Mode)
        STMFD   SP!, {R2, R3}
		MOV     R2, #1                                                  ;/* if (Enable) return FALSE    */
        MOV     R3, R2, lsl R1 
       
        LDR     R0, =VICIntEnable
        LDR     R2, [R0]
        ANDS    R2, R2, R3
        BNE     SetvicIrqFunc_j
        
        LDR     R0, =VICVectCntl0                                       ;/* if(IRQ已经使能) return FALSE*/       	
       	LDR		R2, [SP] 	        
        LDR     R3, [R0, R2, lsl #2]
        CMP     R3, #0     
        BNE     SetvicIrqFunc_j
        
        LDR     R0, =VICVectAddr0    
        LDR     R3, [R0, R2, lsl #2]
        CMP     R3, #0           
SetvicIrqFunc_j
        LDMFD   SP!, {R2, R3}
        MSR     CPSR_c, #(NoFIQ | NoInt | SVC32Mode)
        MOVNE   R0, #0
        MOVNES  PC, LR 
        
        STR     R3, [R0, R2, lsl #2]
        LDR     R0, =VICVectCntl0        
        ORR		R3,R1,#0x20        
        STR     R3, [R0, R2, lsl #2] 
        		        
        LDR     R0, =VICIntEnable
        MOV     R2, #1
        MOV     R3, R2, lsl R1 
        STR     R3, [R0] 
                                                      
        MOV     R0, #1
        MOVS    PC, LR 
;/*********************************************************************************************************
;** Function name:           ClrvicIrqFunc
;** Descriptions:            清除所选外设的IRQ资源
;** input parameters:        R0:        外设对应的中断通道号
;** output parameters:       none
;** Returned value:          1:         成功
;**                          0:         失败
;** Created by:              LinEnqiang
;** Created Date:            2008/04/30
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;*********************************************************************************************************/

ClrvicIrqFunc
        CMP     R1, #32 						                        ;/* if(通道号 >=32) return FALSE*/
        MOVCS   R0, #0
		MOVCSS  PC, LR		
        
		LDR     R0, =VICIntSelect      			                        ;/* if (FIQ) return FALSE       */
        LDR     R0, [R0]        
        MOV     R3, #1
        MOV     R3, R3, LSL R1 
        ANDS    R0, R0, R3        
        MOVNE   R0, #0
		MOVNES  PC, LR
        
        MOV     R2,	LR       
        BL		SEARCH_PRI       
        MOV		LR,	R2        	
        CMP     R0, #MAX_PRI      	                                    ;/* if(优先级 >=16) return FALSE*/
        MOVCS   R0, #0 
        MOVCSS  PC, LR 
        
        LDR     R2, =VICVectAddr0				                        ;/* if (IRQ was not Set)        */
        LDR     R2,[R2,R0,LSL #2]                                       ;/* return FALSE                */ 
        CMP     R2,	#0
        MOVEQ   R0, #0
		MOVEQS  PC, LR
        
        LDR     R2, =VICVectCntl0				                        ;/* if (IRQ was not Set)        */
        LDR     R2,	[R2,R0,LSL #2]                                      ;/* return FALSE                */
        AND		R2,	R2,R1 
        CMP     R2,	R1
        MOVNE   R0, #0
		MOVNES  PC, LR
		
		LDR     R2, =VICIntEnClr       			                        ;/* Disable IRQ                 */
        STR     R3, [R2]             
        
        LDR     R2, =VICVectAddr0      			                        ;/* Clear VICVectAddr0          */
        MOV     R3, #0
        STR     R3, [R2, R0, lsl #2]        
        LDR     R2, =VICVectCntl0
        STR     R3, [R2, R0, lsl #2] 
        
        MOV     R0, #1        
		MOVS    PC, LR
		
;/*********************************************************************************************************
;** Function name:           EnablevicIrq
;** Descriptions:            使能相应外设的中断
;** input parameters:        R0:         外设对应的中断通道号
;** output parameters:       none
;** Returned value:          1:          成功
;**                          0:          失败
;** Created by:              LinEnqiang
;** Created Date:            2008/04/30
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;*********************************************************************************************************/

EnablevicIrq
        CMP     R1, #32                                                 ;/* if(通道号 >=32) return FALSE*/
        MOVCS   R0, #0
        MOVCSS  PC, LR 
        
        MOV     R2,	LR       
        BL		SEARCH_PRI       
        MOV		LR,	R2        	
        CMP     R0, #MAX_PRI      	                                    ;/* if(优先级 >=16) return FALSE*/
        MOVCS   R0, #0 
        MOVCSS  PC, LR 
        
        LDR     R2, =VICVectAddr0                                       ;/* if (未加载) return FALSE    */
        LDR     R3, [R2, R0, lsl #2]
        CMP     R3, #0
        MOVEQ   R0, #0
        MOVEQS  PC, LR
		
		LDR     R2, =VICIntEnable
        MOV     R0, #1
        MOV     R3, R0, lsl R1 
        STR     R3, [R2]
        MOV     R0, #1
        MOVS    PC, LR       

;/*********************************************************************************************************
;** Function name:           DisablevicIrq
;** Descriptions:            禁止相应外设的中断

⌨️ 快捷键说明

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