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

📄 lpc_vic.c

📁 lpc2148芯片usb通讯c程序
💻 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 + -