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

📄 lpc_timer.c

📁 IAR EWARM嵌入式系统编程与实践光盘源码
💻 C
📖 第 1 页 / 共 2 页
字号:
  switch(DevNum) {
  case TIMER0:
    *pExternalMatchValue = Timer0Config.ExtAction[MRNum];
    *pAction = Timer0Config.MatchCH[MRNum].Action;
    break;
  case TIMER1:
    *pExternalMatchValue = Timer1Config.ExtAction[MRNum];
    *pAction = Timer1Config.MatchCH[MRNum].Action;
    break;
  default:
    return 1;
  }
  return 0;
}


/*************************************************************************
 * 说明:TIMER_GetTimerCapture函数,获得指定定时器的捕获响应信息。
 * 参数:LPC_TimerChanel_t DevNum,
 *       unsigned int CRNum,
 *       unsigned int * pCaptureValue
 * 返回值:int
 *         0:成功
 *         非0:错误号
 *************************************************************************/
int TIMER_GetTimerCapture(LPC_TimerChanel_t DevNum, unsigned int CRNum,
            unsigned int * pCaptureValue) {
  switch(DevNum) {
  case TIMER0:
    if (CRNum >= CPCH_MAXNUM-1)
      return 1;
    *pCaptureValue = Timer0Config.CaptureCH[CRNum].CPValue;
    break;
  case TIMER1:
    if (CRNum >= CPCH_MAXNUM)
      return 1;
    *pCaptureValue = Timer1Config.CaptureCH[CRNum].CPValue;
    break;
  default:
    return 1;
  }
  return 0;
}

/******************************************************************************
 * 说明:TIMER_SetCaptureAction函数,设置指定定时器的捕获响应触发类型及其他信息
 * 参数:LPC_TimerChanel_t DevNum  -- 设备号
 *       unsigned char CPCHNum -- 捕获通道号
 *       unsigned char TriggerType -- 上升沿 | 下降沿
 *       bool EnableInt -- 是否产生中断
 *       void (* Fnpr)(void *) -- 中断函数指针
 *       void * FnprArg -- 相对参数
 * 返回值:int
 *         0:成功
 *         非0:错误号
 *************************************************************************/
int TIMER_SetCaptureAction (LPC_TimerChanel_t DevNum,
                              unsigned char CPCHNum,
                              unsigned char  TriggerType,
                              bool EnableInt,
                              void (* Fnpr)(void *),
                              void * FnprArg )
{
  if (TriggerType > TimerCPTrigger_Rising+TimerCPTrigger_Falling) // 检测有效参数
    return 1;
  switch (DevNum)   {
  case TIMER0:
    if (CPCHNum > CPCH_MAXNUM-2)  // timer0 没有捕获通道3
      return 1;
    Timer0Config.CaptureCH[CPCHNum].Enable = true;
    Timer0Config.CaptureCH[CPCHNum].TriggerType = TriggerType;
    T0CCR &= ~(7 << (3*CPCHNum)); // 清除捕获作用
    switch (CPCHNum) {            // 分配捕获模块引脚
    case CH0:
      if (TriggerType == 0)
        PINSEL0_bit.P0_2 = 0;
      else
        PINSEL0_bit.P0_2 = 0x2;
      break;
    case CH1:
      if (TriggerType == 0)
        PINSEL0_bit.P0_4 = 0;
      else
        PINSEL0_bit.P0_4 = 0x2;
      break;
    case CH2:
      if (TriggerType == 0)
        PINSEL0_bit.P0_6 = 0;
      else
        PINSEL0_bit.P0_6 = 0x2;
      break;
    }
    if (TriggerType & TimerCPTrigger_Rising)     // 设置上升沿捕获
      T0CCR |= TimerCPTrigger_Rising << (3*CPCHNum);
    if (TriggerType & TimerCPTrigger_Falling)    // 设置下降沿捕获
      T0CCR |= TimerCPTrigger_Falling << (3*CPCHNum);
    if (EnableInt && TriggerType) {              // 设置捕获中断
      Timer0Config.CaptureCH[CPCHNum].EnableInt = true;
      Timer0Config.CaptureCH[CPCHNum].Fnpr = Fnpr;
      Timer0Config.CaptureCH[CPCHNum].FnprArg = FnprArg;
      T0CCR |= 0x4 << (3*CPCHNum);
    }
    else {
      Timer0Config.CaptureCH[CPCHNum].EnableInt = false;
      Timer0Config.CaptureCH[CPCHNum].Fnpr = NULL;
      Timer0Config.CaptureCH[CPCHNum].FnprArg = (void *)0;
    }
    return 0;
  case TIMER1:
    if (CPCHNum > CPCH_MAXNUM-1)
      return 1;
    Timer1Config.CaptureCH[CPCHNum].Enable = true;
    Timer1Config.CaptureCH[CPCHNum].TriggerType = TriggerType;

    T1CCR &= ~(7 << (3*CPCHNum));                // 清除捕获作用
    switch (CPCHNum) {                           // 分配捕获模块引脚
    case CH0:
      if (TriggerType == 0)
        PINSEL0_bit.P0_10 = 0;
      else
        PINSEL0_bit.P0_10 = 0x2;
      break;
    case CH1:
      if (TriggerType)
        PINSEL0_bit.P0_11 = 0x2;
      break;
    case CH2:
      if (TriggerType == 0)
        PINSEL1_bit.P0_17 = 0;
      else
        PINSEL1_bit.P0_17 = 0x2;
      break;
    case CH3:
      if (TriggerType == 0)
        PINSEL1_bit.P0_18 = 0;
      else
        PINSEL1_bit.P0_18 = 0x2;
      break;
    }
    if (TriggerType & TimerCPTrigger_Rising)     // 设置上升沿捕获
      T1CCR |= TimerCPTrigger_Rising << (3*CPCHNum);
    if (TriggerType & TimerCPTrigger_Falling)    // 设置下降沿捕获
      T1CCR |= TimerCPTrigger_Falling << (3*CPCHNum);
    if (EnableInt && TriggerType) {              // 设置捕获中断
      Timer1Config.CaptureCH[CPCHNum].EnableInt = true;
      Timer1Config.CaptureCH[CPCHNum].Fnpr = Fnpr;
      Timer1Config.CaptureCH[CPCHNum].FnprArg = FnprArg;
      T1CCR |= 0x4 << (3*CPCHNum);
    }
    else {
      Timer1Config.CaptureCH[CPCHNum].EnableInt = false;
      Timer1Config.CaptureCH[CPCHNum].Fnpr = NULL;
      Timer1Config.CaptureCH[CPCHNum].FnprArg = (void *)0;
    }
    return 0;
  }
  return 1;
}

/*************************************************************************
 * 说明:TIMER_GetREGValue_CR函数,获得 CR 寄存器的值。
 * 参数:LPC_TimerChanel_t DevNum
 *       int CRNum
 * 返回值:unsigned long
 *************************************************************************/
unsigned long TIMER_GetREGValue_CR(LPC_TimerChanel_t DevNum, int CRNum) {
  switch (DevNum) {
  case TIMER0:
    switch (CRNum) {
    case CPCH0:
      return T0CR0;
    case CPCH1:
      return T0CR1;
    case CPCH2:
      return T0CR2;
    case CPCH3:
      return T0CR3;
    }
  case TIMER1:
    switch (CRNum) {
    case CPCH0:
      return T1CR0;
    case CPCH1:
      return T1CR1;
    case CPCH2:
      return T1CR2;
    case CPCH3:
      return T1CR3;
    }
  }
  return (unsigned int)-1;
}

/*************************************************************************
 * 说明:TIMER_GetREGValue_TC函数,获得 TC 寄存器的值
 * 参数:LPC_TimerChanel_t DevNum
 * 返回值:unsigned long
 *************************************************************************/
unsigned long TIMER_GetREGValue_TC(LPC_TimerChanel_t DevNum) {
  switch (DevNum) {
  case TIMER0:
    return T0TC;
  case TIMER1:
    return T1TC;
  }
  return (unsigned int)-1;
}

/*************************************************************************
 * 说明:TIMER_CheckIntSrc函数,获得定时器中断类型。
 * 参数:LPC_TimerChanel_t DevNum
 * 返回值:unsigned long
 *************************************************************************/
unsigned long TIMER_CheckIntType(LPC_TimerChanel_t DevNum) {
  switch (DevNum) {
  case TIMER0:
    return (T0IR & 0xFF);
  case TIMER1:
    return (T1IR & 0xFF);
  default:
    return (unsigned long)-1;
  }
}

/*************************************************************************
 * 说明:RTC_ClearInt函数,清除定时器中断。
 * 参数:LPC_TimerChanel_t DevNum
 *       int IntType
 * 返回值:unsigned long
 *         0:成功
 *         1:失败
 *************************************************************************/
unsigned long TIMER_ClearInt(LPC_TimerChanel_t DevNum, int IntType) {
  if (IntType<1 || IntType>0xFF)
    return 1;
  switch (DevNum) {
  case TIMER0:
    T0IR = (IntType & 0xFF);
    break;
  case TIMER1:
    T1IR = (IntType & 0xFF);
    break;
  default:
    return 1;
  }
  return 0;
}

/*************************************************************************
 * 说明:TIMER0中断函数
 * 参数:无
 * 返回值:无
 *************************************************************************/
void TIMER0_ISR () {
int IntStatus;
  IntStatus = TIMER_CheckIntType(TIMER0);
  TIMER_ClearInt(TIMER0, IntStatus);

  if (IntStatus & TIMERMR0Int) {           // 匹配寄存器中断
    (Timer0Config.MatchCH[0].Fnpr)((void *)Timer0Config.MatchCH[0].FnprArg);
  }

  if (IntStatus & TIMERMR1Int) {
    (Timer0Config.MatchCH[1].Fnpr)((void *)Timer0Config.MatchCH[1].FnprArg);
  }

  if (IntStatus & TIMERMR2Int) {
    (Timer0Config.MatchCH[2].Fnpr)((void *)Timer0Config.MatchCH[2].FnprArg);
  }

  if (IntStatus & TIMERMR3Int) {
    (Timer0Config.MatchCH[3].Fnpr)((void *)Timer0Config.MatchCH[3].FnprArg);
  }

  if (IntStatus & TIMERCR0Int) {          // 捕获寄存器中断
    Timer0Config.CaptureCH[0].CPValue = TIMER_GetREGValue_CR(TIMER0, CPCH0);
    (Timer0Config.CaptureCH[0].Fnpr)((void *)Timer0Config.CaptureCH[0].FnprArg);
  }

  if (IntStatus & TIMERCR1Int) {
    Timer0Config.CaptureCH[1].CPValue = TIMER_GetREGValue_CR(TIMER0, CPCH1);
    (Timer0Config.CaptureCH[1].Fnpr)((void *)Timer0Config.CaptureCH[1].FnprArg);
  }

  if (IntStatus & TIMERCR2Int) {
    Timer0Config.CaptureCH[2].CPValue = TIMER_GetREGValue_CR(TIMER0, CPCH2);
    (Timer0Config.CaptureCH[2].Fnpr)((void *)Timer0Config.CaptureCH[2].FnprArg);
  }

  if (IntStatus & TIMERCR3Int) {
    Timer0Config.CaptureCH[3].CPValue = TIMER_GetREGValue_CR(TIMER0, CPCH3);
    (Timer0Config.CaptureCH[3].Fnpr)((void *)Timer0Config.CaptureCH[3].FnprArg);
  }
  VICVectAddr = 0;                // 清除VIC中断
}

/*************************************************************************
 * 说明:TIMER1中断函数
 * 参数:无
 * 返回值:无
 *************************************************************************/
void TIMER1_ISR () {
  int IntStatus;
  IntStatus = TIMER_CheckIntType(TIMER1);
  TIMER_ClearInt(TIMER1, IntStatus);

  if (IntStatus & TIMERMR0Int) {           // 匹配寄存器中断
    (Timer1Config.MatchCH[0].Fnpr)((void *)Timer1Config.MatchCH[0].FnprArg);
  }

  if (IntStatus & TIMERMR1Int) {
    (Timer1Config.MatchCH[1].Fnpr)((void *)Timer1Config.MatchCH[1].FnprArg);
  }

  if (IntStatus & TIMERMR2Int) {
    (Timer1Config.MatchCH[2].Fnpr)((void *)Timer1Config.MatchCH[2].FnprArg);
  }

  if (IntStatus & TIMERMR3Int) {
    (Timer1Config.MatchCH[3].Fnpr)((void *)Timer1Config.MatchCH[3].FnprArg);
  }

  if (IntStatus & TIMERCR0Int) {          // 捕获寄存器中断
    Timer1Config.CaptureCH[0].CPValue = TIMER_GetREGValue_CR(TIMER1, CPCH0);
    (Timer1Config.CaptureCH[0].Fnpr)((void *)Timer1Config.CaptureCH[0].FnprArg);
  }

  if (IntStatus & TIMERCR1Int) {
    Timer1Config.CaptureCH[1].CPValue = TIMER_GetREGValue_CR(TIMER1, CPCH1);
    (Timer1Config.CaptureCH[1].Fnpr)((void *)Timer1Config.CaptureCH[1].FnprArg);
  }

  if (IntStatus & TIMERCR2Int) {
    Timer1Config.CaptureCH[2].CPValue = TIMER_GetREGValue_CR(TIMER1, CPCH2);
    (Timer1Config.CaptureCH[2].Fnpr)((void *)Timer1Config.CaptureCH[2].FnprArg);
  }

  if (IntStatus & TIMERCR3Int) {
    Timer1Config.CaptureCH[3].CPValue = TIMER_GetREGValue_CR(TIMER1, CPCH3);
    (Timer1Config.CaptureCH[3].Fnpr)((void *)Timer1Config.CaptureCH[3].FnprArg);
  }

  VICVectAddr = 0;              // 清除 VIC 中断
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -