📄 viccontrol.s
字号:
LDR R2,[R0,R1,LSL #2]
CMP R2,#0
MOVEQ R0, #0
MOVEQS PC, LR
LDR R0, =VICIntEnClr ; Disable IRQ
STR R3, [R0]
LDR R0, =VICVectAddr0 ; Clear VICVectAddr0
MOV R3, #0
STR R3, [R0, R1, 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
LDR R0, =VICVectAddr0 ; if (未加载) return FALSE
LDR R3, [R0, R1, lsl #2]
CMP R3, #0
MOVEQ R0, #0
MOVEQS PC, LR
LDR R0, =VICIntEnable
MOV R2, #1
MOV R3, R2, lsl R1
STR R3, [R0]
MOV R0, #1
MOVS PC, LR
;/*********************************************************************************************************
;** Function name: DisablevicIrq
;** Descriptions: 禁止相应外设的中断
;** 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
LDR R0, =VICVectAddr0 ; if (未加载) return FALSE
LDR R3, [R0, R1, lsl #2]
CMP R3, #0
MOVEQ R0, #0
MOVEQS PC, LR
LDR R0, =VICIntEnClr
MOV R2, #1
MOV R3, R2, lsl R1
STR R3, [R0]
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
LDR R0, =VICVectAddr0 ; if (未加载) return FALSE
LDR R3, [R0, R1, lsl #2]
CMP R3, #0
MOVEQ R0, #0
MOVEQS PC, LR
STMIA R2!, {R1} ; 通道号
LDR R0, =VICVectPri0
LDR R0, [R0, R1, lsl #2]
STMIA R2!, {R0} ; 优先级
STMIA R2!, {R3} ; 处理函数地址
LDR R0, =VICIntEnable
MOV R3, #1
MOV R1, R3, lsl R1
LDR R3, [R0]
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, #32 ; if (通道号 >=32) return FALSE
MOVCS R0, #0
MOVCSS PC, LR
LDR R0, =VICVectAddr0 ; if (IRQ已加载) return FALSE
LDR R3,[R0,R1,LSL #2]
CMP R3,#0
MOVNE R0, #0
MOVNES 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
END
;/********************************************************************************************************
;** End Of File
;********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -