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

📄 stm32f10x_can.c

📁 stm32f10xx的中文译文例程
💻 C
📖 第 1 页 / 共 3 页
字号:
  return MessagePending;
}

/*******************************************************************************
* 函数名称: CAN_Receive
* 功能描述: 接收一个报文.
* 输入参数: FIFO number: 接收FIFO的编号,CANFIFO0或CANFIFO1.
* 输出参数: RxMessage: 指向一个包括CAN ID,CAN DLC和CAN数据的结构体。
* 返回参数: 无.
*******************************************************************************/
void CAN_Receive(u8 FIFONumber, CanRxMsg* RxMessage)
{
  /* Check the parameters [检查参数]*/
  assert_param(IS_CAN_FIFO(FIFONumber));

  /* Get the Id [取得Id]*/
  RxMessage->IDE = (u8)0x04 & CAN->sFIFOMailBox[FIFONumber].RIR;
  if (RxMessage->IDE == CAN_ID_STD)
  {
    RxMessage->StdId = (u32)0x000007FF & (CAN->sFIFOMailBox[FIFONumber].RIR >> 21);
  }
  else
  {
    RxMessage->ExtId = (u32)0x1FFFFFFF & (CAN->sFIFOMailBox[FIFONumber].RIR >> 3);
  }
  
  RxMessage->RTR = (u8)0x02 & CAN->sFIFOMailBox[FIFONumber].RIR;

  /* Get the DLC [取得DLC]*/
  RxMessage->DLC = (u8)0x0F & CAN->sFIFOMailBox[FIFONumber].RDTR;

  /* Get the FMI [取得FMI]*/
  RxMessage->FMI = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDTR >> 8);

  /* Get the data field [取得数据字段]*/
  RxMessage->Data[0] = (u8)0xFF & CAN->sFIFOMailBox[FIFONumber].RDLR;
  RxMessage->Data[1] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDLR >> 8);
  RxMessage->Data[2] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDLR >> 16);
  RxMessage->Data[3] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDLR >> 24);

  RxMessage->Data[4] = (u8)0xFF & CAN->sFIFOMailBox[FIFONumber].RDHR;
  RxMessage->Data[5] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDHR >> 8);
  RxMessage->Data[6] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDHR >> 16);
  RxMessage->Data[7] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDHR >> 24);

  /* Release the FIFO [释放FIFO]*/
  CAN_FIFORelease(FIFONumber);
}

/*******************************************************************************
* 函数名称: CAN_Sleep
* 功能描述: 将CAN置于低功耗模式.
* 输入参数: 无.
* 输出参数: 无.
* 返回参数: CANSLEEPOK(如果进入睡眠)CANSLEEPFAILED(其他情况).
*******************************************************************************/
u8 CAN_Sleep(void)
{
  u8 SleepStatus = 0;

  /* Sleep mode entering request [进入睡眠模式请求]*/
  CAN->MCR |= CAN_MCR_SLEEP;
  SleepStatus = CANSLEEPOK;

  /* Sleep mode status [睡眠模式状态]*/
  if ((CAN->MCR&CAN_MCR_SLEEP) == 0)
  {
    /* Sleep mode not entered [进不去睡眠模式]*/
    SleepStatus = CANSLEEPFAILED;
  }

  /* At this step, sleep mode status [在这步,睡眠模式状态]*/
  return SleepStatus;
}

/*******************************************************************************
* 函数名称: CAN_WakeUp
* 功能描述: 唤醒CAN.
* 输入参数: 无.
* 输出参数: 无.
* 返回参数: CANWAKEUPOK(如果退出了睡眠模式)CANWAKEUPFAILED(其他情况).
*******************************************************************************/
u8 CAN_WakeUp(void)
{
  u8 WakeUpStatus = 0;

  /* Wake up request [唤醒请求]*/
  CAN->MCR &= ~CAN_MCR_SLEEP;
  WakeUpStatus = CANWAKEUPFAILED;

  /* Sleep mode status [睡眠模式状态]*/
  if ((CAN->MCR&CAN_MCR_SLEEP) == 0)
  {
    /* Sleep mode exited [退出睡眠模式]*/
    WakeUpStatus = CANWAKEUPOK;
  }

  /* At this step, sleep mode status [在这步,睡眠模式状态]*/
  return WakeUpStatus;
}

/*******************************************************************************
* 函数名称: CAN_GetFlagStatus
* 功能描述: 检查指定的CAN标志是否置位.
* 输入参数: CAN_FLAG: 指定要检查的标志.
*                  这个参数可以是: CAN_FLAG_EWG, CAN_FLAG_EPV或CAN_FLAG_BOF.
* 输出参数: 无.
* 返回参数: CAN_FLAG的新状态(SET或RESET).
*******************************************************************************/
FlagStatus CAN_GetFlagStatus(u32 CAN_FLAG)
{
  FlagStatus bitstatus = RESET;

  /* Check the parameters [检查参数]*/
  assert_param(IS_CAN_FLAG(CAN_FLAG));

  /* Check the status of the specified CAN flag [检查指定的CAN标志状态]*/
  if ((CAN->ESR & CAN_FLAG) != (u32)RESET)
  {
    /* CAN_FLAG is set [置位CAN_FLAG]*/
    bitstatus = SET;
  }
  else
  {
    /* CAN_FLAG is reset [复位CAN_FLAG]*/
    bitstatus = RESET;
  }
  /* Return the CAN_FLAG status [返回CAN_FLAG状态]*/
  return  bitstatus;
}

/*******************************************************************************
* 函数名称: CAN_ClearFlag
* 功能描述: 清除CAN挂起标志.
* 输入参数: CAN_FLAG: 指定需要清除的标志。
* 输出参数: 无.
* 返回参数: 无.
*******************************************************************************/
void CAN_ClearFlag(u32 CAN_FLAG)
{
  /* Check the parameters [检查参数]*/
  assert_param(IS_CAN_FLAG(CAN_FLAG));

  /* Clear the selected CAN flags [清除选择的CAN标志]*/
  CAN->ESR &= ~CAN_FLAG;
}

/*******************************************************************************
* 函数名称: CAN_GetITStatus
* 功能描述: 检查指定的CAN中断是否发生.
* 输入参数: CAN_IT: CAN需要检查的中断源。
*                  这个参数可以是: CAN_IT_RQCP0, CAN_IT_RQCP1, CAN_IT_RQCP2,
*                                         CAN_IT_FF0, CAN_IT_FOV0, CAN_IT_FF1,
*                                         CAN_IT_FOV1, CAN_IT_EWG, CAN_IT_EPV, 
*                                         CAN_IT_BOF, CAN_IT_WKU or CAN_IT_SLK.
* 输出参数: 无.
* 返回参数: CAN_IT的新状态(SET或RESET).
*******************************************************************************/
ITStatus CAN_GetITStatus(u32 CAN_IT)
{
  ITStatus pendingbitstatus = RESET;

  /* Check the parameters [检查参数]*/
  assert_param(IS_CAN_ITStatus(CAN_IT));

  switch (CAN_IT)
  {
    case CAN_IT_RQCP0:
      pendingbitstatus = CheckITStatus(CAN->TSR, CAN_TSR_RQCP0);
      break;
    case CAN_IT_RQCP1:
      pendingbitstatus = CheckITStatus(CAN->TSR, CAN_TSR_RQCP1);
      break;
    case CAN_IT_RQCP2:
      pendingbitstatus = CheckITStatus(CAN->TSR, CAN_TSR_RQCP2);
      break;
    case CAN_IT_FF0:
      pendingbitstatus = CheckITStatus(CAN->RF0R, CAN_RF0R_FULL0);
      break;
    case CAN_IT_FOV0:
      pendingbitstatus = CheckITStatus(CAN->RF0R, CAN_RF0R_FOVR0);
      break;
    case CAN_IT_FF1:
      pendingbitstatus = CheckITStatus(CAN->RF1R, CAN_RF1R_FULL1);
      break;
    case CAN_IT_FOV1:
      pendingbitstatus = CheckITStatus(CAN->RF1R, CAN_RF1R_FOVR1);
      break;
    case CAN_IT_EWG:
      pendingbitstatus = CheckITStatus(CAN->ESR, CAN_ESR_EWGF);
      break;
    case CAN_IT_EPV:
      pendingbitstatus = CheckITStatus(CAN->ESR, CAN_ESR_EPVF);
      break;
    case CAN_IT_BOF:
      pendingbitstatus = CheckITStatus(CAN->ESR, CAN_ESR_BOFF);
      break;
    case CAN_IT_SLK:
      pendingbitstatus = CheckITStatus(CAN->MSR, CAN_MSR_SLAKI);
      break;
    case CAN_IT_WKU:
      pendingbitstatus = CheckITStatus(CAN->MSR, CAN_MSR_WKUI);
      break;

    default :
      pendingbitstatus = RESET;
      break;
  }

  /* Return the CAN_IT status [返回CAN_IT状态]*/
  return  pendingbitstatus;
}

/*******************************************************************************
* 函数名称: CAN_ClearITPendingBit
* 功能描述: 清除CAN中断挂起位.
* 输入参数: CAN_IT: 指定需要清除的中断挂起位。
* 输出参数: 无.
* 返回参数: 无.
*******************************************************************************/
void CAN_ClearITPendingBit(u32 CAN_IT)
{
  /* Check the parameters [检查参数]*/
  assert_param(IS_CAN_ITStatus(CAN_IT));

  switch (CAN_IT)
  {
    case CAN_IT_RQCP0:
      CAN->TSR = CAN_TSR_RQCP0; /* rc_w1*/
      break;
    case CAN_IT_RQCP1:
      CAN->TSR = CAN_TSR_RQCP1; /* rc_w1*/
      break;
    case CAN_IT_RQCP2:
      CAN->TSR = CAN_TSR_RQCP2; /* rc_w1*/
      break;
    case CAN_IT_FF0:
      CAN->RF0R = CAN_RF0R_FULL0; /* rc_w1*/
      break;
    case CAN_IT_FOV0:
      CAN->RF0R = CAN_RF0R_FOVR0; /* rc_w1*/
      break;
    case CAN_IT_FF1:
      CAN->RF1R = CAN_RF1R_FULL1; /* rc_w1*/
      break;
    case CAN_IT_FOV1:
      CAN->RF1R = CAN_RF1R_FOVR1; /* rc_w1*/
      break;
    case CAN_IT_EWG:
      CAN->ESR &= ~ CAN_ESR_EWGF; /* rw */
      break;
    case CAN_IT_EPV:
      CAN->ESR &= ~ CAN_ESR_EPVF; /* rw */
      break;
    case CAN_IT_BOF:
      CAN->ESR &= ~ CAN_ESR_BOFF; /* rw */
      break;
    case CAN_IT_WKU:
      CAN->MSR = CAN_MSR_WKUI;  /* rc_w1*/
      break;
    case CAN_IT_SLK:
      CAN->MSR = CAN_MSR_SLAKI;  /* rc_w1*/
      break;
    default :
      break;
  }
}

/*******************************************************************************
* 函数名称: CheckITStatus
* 功能描述: 检查CAN中断是否发生.
* 输入参数: (1)CAN_Reg: 要检查的指定的CAN中断寄存器.
*           (2)It_Bit: 要检查的指定的中断源位.
* 输出参数: 无.
* 返回参数: CAN中断的新状态 (SET or RESET).
*******************************************************************************/
static ITStatus CheckITStatus(u32 CAN_Reg, u32 It_Bit)
{
  ITStatus pendingbitstatus = RESET;

  if ((CAN_Reg & It_Bit) != (u32)RESET)
  {
    /* CAN_IT is set [置位CAN_IT]*/
    pendingbitstatus = SET;
  }
  else
  {
    /* CAN_IT is reset [复位CAN_IT]*/
    pendingbitstatus = RESET;
  }

  return pendingbitstatus;
}

/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/

⌨️ 快捷键说明

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