📄 viccontrol.s
字号:
;/****************************************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 + -