📄 lpc_vic.c
字号:
// 定义VIC API函数
#include "LPC_Vic.h"
/******************************************************************************
* 说明:VIC_SetProtectionMode函数,根据参数决定VIC访问模式(特权模式或用户模式)
* 参数:LPC_Vic_ProtectionMode_t ProtectionType
* 返回值:无
*****************************************************************************/
void VIC_SetProtectionMode(LPC_Vic_ProtectionMode_t ProtectionType) {
VICProtection_bit.PROTECT = ProtectionType;
return ;
}
/******************************************************************************
* 说明:VIC_GetProtectionMode函数,获得VIC访问模式(特权模式或用户模式)
* 参数:无
* 返回值:LPC_Vic_ProtectionMode_t
*****************************************************************************/
LPC_Vic_ProtectionMode_t VIC_GetProtectionMode(void) {
LPC_Vic_ProtectionMode_t ProtectionType;
if (VICProtection & 0x1)
ProtectionType = PrivilegedMode;
else
ProtectionType = UserandPrivilegedMode;
return ProtectionType;
}
/*************************************************************************
* 说明:VIC_Init函数,初始化 VIC
* 参数:无
* 返回值:无
*************************************************************************/
void VIC_Init(void) {
VICIntSelect = 0; // 分配所有中断通道给VIC
VICIntEnClear = 0xFFFFFFFF; // 禁止所有中断
VICSoftIntClear = 0xFFFFFFFF; // 清除所有软件中断
VICProtection = 0; // 可通过用户或特权模式访问VIC寄存器
VICVectAddr = 0; // 清除中断
VICDefVectAddr = 0; // 清0非向量IRQ中断服务程序地址
VICVectAddr15 = 0; // 清0向量IRQ中断服务程序地址
VICVectCntl15 = 0; // 禁止所有向量IRQ slots
}
/***************************************************************************
* 说明:VIC_GetIRQStatus函数,获得VIC的IRQ状态。返回寄存器VICIRQSTATUS的值。
* 如果允许了某个IRQ中断请求,则寄存器VICIRQSTATUS的相应位置位。
* 参数:无
* 返回值:unsigned int
*************************************************************************/
unsigned int VIC_GetIRQStatus(void) {
return (VICIRQStatus);
}
/***************************************************************************
* 说明:VIC_GetFIQStatus函数,获得VIC的FIQ状态。返回寄存器VICFIQSTATUS的值。
* 如果允许了某个FIQ中断请求,则寄存器VICFIQSTATUS的相应位置位。如果
* 分配多个中断请求给FIQ,则通过调用本函数可以决定中断源。
* 参数:无
* 返回值:unsigned int
*************************************************************************/
unsigned int VIC_GetFIQStatus(void) {
return (VICFIQStatus);
}
/*************************************************************************
* 说明:VIC_EnableInt函数,允许指定中断。
* 参数:lpc_uint32 IntType
* 返回值:无
*************************************************************************/
void VIC_EnableInt(unsigned int IntType) {
VICIntEnable |= IntType;
}
/*************************************************************************
* 说明:VIC_DisableInt函数,禁止指定中断。
* 参数:unsigned int IntType
* 返回值:无
*************************************************************************/
void VIC_DisableInt(unsigned int IntType) {
VICIntEnClear |= IntType;
}
/***************************************************************************
* 说明:VIC_EnableNonVectoredIRQ函数,将VICDefVectAddr设置为IRQ子程序地址。
* 参数:pIRQSub - 非向量IRQ子程序地址
* 返回值:无
*************************************************************************/
void VIC_EnableNonVectoredIRQ(void(*pIRQSub)()) {
VICDefVectAddr = (unsigned int)pIRQSub;
}
/*************************************************************************
* 说明:VIC_DisableNonVectoredIRQ函数,将VICDefVectAddr设置为复位值(NULL)
* 参数:无
* 返回值:无
*************************************************************************/
void VIC_DisableNonVectoredIRQ(void) {
VICDefVectAddr = NULL;
}
/*************************************************************************
* 说明:VIC_SetVectoredIRQ函数,初始化向量中断。
* 参数: void(*pIRQSub)()
* LPC_VicIrqSlots_t VicIrqSlot
* unsigned int VicIntSouce
* 返回值:无
*************************************************************************/
void VIC_SetVectoredIRQ(void(*pIRQSub)(), LPC_VicIrqSlots_t VicIrqSlot, unsigned int VicIntSource) {
unsigned long volatile *pReg;
pReg = &VICVectAddr0; // 加载向量地址寄存器的偏移地址
*(pReg+VicIrqSlot) = (unsigned long)pIRQSub; // 为相应Slot设置回调函数地址
pReg = &VICVectCntl0; // 加载控制寄存器基地址
*(pReg+VicIrqSlot) = VicIntSource | 0x20; // 设置源通道并允许该Slot
VICIntSelect &= ~(1<<VicIntSource); // 清除FIQ选择位
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -