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