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

📄 viccontrol.s

📁 基于ARM7下的2100系列得uc-osII的工程模板!
💻 S
📖 第 1 页 / 共 2 页
字号:
;** input parameters:        uiChannel:  外设对应的中断通道号
;** output parameters:       none
;** Returned value:          1:          成功
;**                          0:          失败
;** Created by:              LinEnqiang
;** Created Date:            2008/04/30
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/

DisablevicIrq
        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, =VICIntEnClr
        MOV     R0, #1
        MOV     R3, R0, lsl R1 
        STR     R3, [R2]
        MOV     R0, #1
        MOVS    PC, LR

;/*********************************************************************************************************
;** Function name:           GetvicIrqStatus
;** Descriptions:            获取所选外设的中断通道号、优先级、中断服务函数地址及中断使能状态
;** input parameters:        R0:         外设对应的中断通道号
;** output parameters:       R2:         配置信息
;** Returned value:          1:          成功
;**                          0:          失败
;** Created by:              LinEnqiang
;** Created Date:            2008/04/30
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;*********************************************************************************************************/

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

        LDR     R3, =VICVectCntl0
        LDR     R3, [R3, R0, lsl #2]
        AND		R0 , R0,#0x1F
        STMIA   R2!, {R0}       				                        ;/* 优先级                      */
        STMIA   R2!, {R3}						                        ;/* 处理函数地址                */

        LDR     R3, =VICIntEnable
        MOV     R0, #1
        MOV     R1, R0, lsl R1 
        LDR     R3, [R3]
        AND     R3, R3, R1            
        CMP     R3, #0
        MOVHI   R3, #1
        STMIA   R2!,{R3}						                        ;/* IRQ使能与否的状态           */
        
		MOV     R0, #1
        MOVS    PC, LR 
                		          			
;/*********************************************************************************************************
;** Function name:           SetvicFiq
;** Descriptions:            设置并使能所选中断通道号为FIQ中断
;** input parameters:        R0:        外设对应的中断通道号
;** output parameters:       none
;** Returned value:          1:          成功
;**                          0:          失败
;** Created by:              LinEnqiang
;** Created Date:            2008/04/30
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
SetvicFiq
       	MSR     CPSR_c, #(NoFIQ | NoInt| SVC32Mode)
       	
        CMP     R1, #MAX_ID						                        ;/* if(通道号 >=32) return FALSE*/
        MOVCS   R0, #0
		MOVCSS  PC, LR
        
        LDR     R0, =VICIntEnable				                        ;/* if(IRQ||DefIRQ 使能)        */
        LDR     R3, [R0]                                                ;/* return FALSE                */
        MOV     R2, #1
        MOV     R2, R2, LSL R1        
        ANDS    R2, R3, R2        
        MOVNE   R0, #0
		MOVNES  PC, LR 
        
        MOV     R2,	LR       					                        ;/* if (IRQ已加载) return FALSE*/
        BL		SEARCH_PRI       
        MOV		LR,	R2        
        CMP     R0,	#MAX_PRI
        MOVCC   R0, #0
		MOVCCS  PC, LR       
        
        LDR     R0, =VICIntSelect				
        LDR     R3, [R0]
        MOV     R2, #1
        MOV     R2, R2, lsl R1 
        ORR     R3, R3, R2                
        STR     R3, [R0]
        
        LDR     R0, =VICIntEnable
        STR     R3, [R0]
        MOV     R0, #1
        MOVS    PC, LR
        
;/*********************************************************************************************************
;** Function name:           ClrvicFiq
;** Descriptions:            清除所选中断通道号的FIQ中断
;** input parameters:        R0:         外设对应的中断通道号
;** output parameters:       none
;** Returned value:          1:          成功
;**                          0:          失败;
;** Created by:              LinEnqiang
;** Created Date:            2008/04/30
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/

ClrvicFiq
		MSR     CPSR_c, #(NoFIQ | NoInt | SVC32Mode)
		
        CMP     R1, #32							                        ;/* if(通道号 >=32) return FALSE*/
        MOVCS   R0, #0
		MOVCSS  PC, LR       
             
        LDR     R0, =VICIntSelect				                        ;/* if(FIQ未使能)return FALSE   */
        LDR     R3, [R0]
        MOV     R2, #1
        MOV     R2, R2, LSL R1        
        ANDS    R2, R3, R2        
        MOVEQ   R0, #0
		MOVEQS  PC, LR         
       
        LDR     R0, =VICIntEnClr
        MOV     R3, R2 
        STR     R3, [R0]  						                        ;/* Disable FIQ                 */
        
        LDR     R0, =VICIntSelect
        LDR     R3, [R0]
        BIC     R3, R3,R2
        STR     R3, [R0]						       
        
        MOV     R0, #1
        MOVS    PC, LR  	
		
;/*********************************************************************************************************
;** Function name:           SetDefIRQ
;** Descriptions:            设置非向量中断服务程序地址
;** input parameters:		 uiFuncAddr  :中断服务程序(普通C语言函数)
;** output parameters:       none
;** Returned value:			 1:          成功
;**                          0:          失败
;** Created by:              LinEnqiang
;** Created Date:            2008/04/30
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/

SetDefIRQ
        CMP     R1, #0							                        ;/* if (Addr==0) return FALSE   */
        MOVEQ   R0, #0
		MOVEQS  PC, LR      	
		
		LDR     R2, =VICDefVectAddr
		STR	    R1, [R2]
		MOV     R0, #1
        MOVS    PC, LR	
;/*********************************************************************************************************
;** Function name:           EnableDefvic
;** Descriptions:            使能所选中断通道号的非向量中断
;** input parameters:		 uiChannel  	:外设对应的中断通道号
;** output parameters:       none
;** Returned value:			 1:          成功
;**                          0:          失败
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/

EnableDefvic
		CMP     R1, #MAX_ID						                        ;/* if (通道号 >=32)            */
        MOVCS   R0, #0                                                  ;/* return FALSE                */
		MOVCSS  PC, LR
		
		LDR     R3, =VICIntEnable				                        ;/* if (IRQ||FIQ)有使能         */
		LDR     R2, [R3]                                                ;/* return FALSE                */
        MOV     R0, #1
        MOV     R0, R0, lsl R1 
        AND     R2, R2, R0                    
        CMP     R2, #0        
        MOVHI   R0, #0
        MOVHIS  PC, LR	
        
        MOV     R2,	LR       					                        ;/* if (IRQ已加载) return FALSE */
        BL		SEARCH_PRI       
        MOV		LR,	R2        
        CMP     R0,	#MAX_PRI
        MOVCC   R0, #0
		MOVCCS  PC, LR       
		
		MOV     R0, #1
        MOV     R2, R0, lsl R1 
        STR		R2,	[R3]
        MOV     R0, #1
        MOVS    PC, LR

;/*********************************************************************************************************
;** Function name:           DisableDefvic
;** Descriptions:            禁止所选中断通道号的非向量中断
;** input parameters:		 uiChannel    	:外设对应的中断通道号
;** output parameters:       none
;** Returned value:			 1:          成功
;**                          0:          失败
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
               					
DisableDefvic
		CMP     R1, #MAX_ID						                        ;/* if (通道号 >=32)return FALSE*/
        MOVCS   R0, #0
		MOVCSS  PC, LR
		
		LDR     R0, =VICIntSelect				                        ;/* if(FIQ使能)return FALSE     */
        LDR     R2, [R0]
        MOV     R3, #1
        MOV     R3, R3, LSL R1        
        ANDS    R2, R3, R2        
        MOVNE   R0, #0
		MOVNES  PC, LR       
		
		MOV     R2,	LR       					                        ;/* if (IRQ已加载)              */
        BL		SEARCH_PRI                                              ;/* return FALSE                */
        MOV		LR,	R2        
        CMP     R0,	#MAX_PRI
        MOVCC   R0, #0
		MOVCCS  PC, LR    
		
		LDR     R0, =VICIntEnClr
		STR		R3,	[R0]
		MOV     R0, #1
        MOVS    PC, LR	
;/*********************************************************************************************************
;** Function name:           EnablevicSoftInt
;** Descriptions:            使能所选中断通道号的向量软中断
;** input parameters:		 uiChannel    	:外设对应的中断通道号
;** output parameters:       none
;** Returned value:			 1:          成功
;**                          0:          失败
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
        
EnablevicSoftInt
		CMP     R1, #0							                        ;/* if (Addr==0) return FALSE   */
        MOVEQ   R0, #0
		MOVEQS  PC, LR  
		
		LDR     R3, =VICIntEnable				                        ;/* if (IRQ||FIQ)有使能         */
		LDR     R2, [R3]                                                ;/* return FALSE                */
        MOV     R0, #1
        MOV     R0, R0, lsl R1 
        AND     R2, R2, R0                    
        CMP     R2, #0        
        MOVEQ   R0, #0
        MOVEQS  PC, LR	
        
        LDR     R3, =VICSoftInt
        STR		R0,[R3]
        MOV     R0, #1
        MOVS    PC, LR	
;/*********************************************************************************************************
;** Function name:           DisablevicSoftInt
;** Descriptions:            禁止所选中断通道号的向量软中断
;** input parameters:		 uiChannel    	:外设对应的中断通道号
;** output parameters:       none
;** Returned value:			 1:          成功
;**                          0:          失败
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/

DisablevicSoftInt
        CMP     R1, #0							                        ;/* if (Addr==0) return FALSE   */
        MOVEQ   R0, #0
		MOVEQS  PC, LR  
		
		MOV     R0, #1
        MOV     R0, R0, lsl R1 
        LDR     R3, =VICSoftIntClear
        STR		R0,[R3]
        MOV     R0, #1
        MOVS    PC, LR	   		
    END
;/********************************************************************************************************
;**                            End Of File
;********************************************************************************************************/

⌨️ 快捷键说明

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