打印

stm32 can实验部分总结

[复制链接]
2777|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 chenzongxi123 于 2011-12-1 10:10 编辑

1.CAN接收需要开中断,用中断方式接收(查询也可以),发送不用中断。


2.接收中断可以用CAN_ITConfig 打开,但不能用CAN_ClearITPendingBit 关闭,因为这个里面没有接收中断CAN_IT_FMP0

@brief  Clears the CANx's interrupt pending bits.

  * @param  CANx:    where x can be 1 or 2 to to select the CAN peripheral.

  * @param  CAN_IT: specifies the interrupt pending bit to clear.

  *                  -  CAN_IT_TME                     

  *                  -  CAN_IT_FF0               

  *                  -  CAN_IT_FOV0                     

  *                  -  CAN_IT_FF1               

  *                  -  CAN_IT_FOV1              

  *                  -  CAN_IT_WKU  

  *                  -  CAN_IT_SLK  

  *                  -  CAN_IT_EWG   

  *                  -  CAN_IT_EPV   

  *                  -  CAN_IT_BOF   

  *                  -  CAN_IT_LEC   

  *                  -  CAN_IT_ERR


3.接收中断如果用库函数CAN_Receive,则不用关中断,因为函数在最后释放邮箱,CANx->RF0R |= CAN_RF0R_RFOM0;

stm32f10x_can.c中如下函数:

void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage)
{
  /* Check the parameters */
  assert_param(IS_CAN_ALL_PERIPH(CANx));
  assert_param(IS_CAN_FIFO(FIFONumber));
  /* Get the Id */
  RxMessage->IDE = (uint8_t)0x04 & CANx->sFIFOMailBox[FIFONumber].RIR;
  if (RxMessage->IDE == CAN_Id_Standard)
  {
    RxMessage->StdId = (uint32_t)0x000007FF & (CANx->sFIFOMailBox[FIFONumber].RIR >> 21);
  }
  else
  {
    RxMessage->ExtId = (uint32_t)0x1FFFFFFF & (CANx->sFIFOMailBox[FIFONumber].RIR >> 3);
  }
  
  RxMessage->RTR = (uint8_t)0x02 & CANx->sFIFOMailBox[FIFONumber].RIR;
  /* Get the DLC */
  RxMessage->DLC = (uint8_t)0x0F & CANx->sFIFOMailBox[FIFONumber].RDTR;
  /* Get the FMI */
  RxMessage->FMI = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDTR >> 8);
  /* Get the data field */
  RxMessage->Data[0] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RDLR;
  RxMessage->Data[1] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 8);
  RxMessage->Data[2] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 16);
  RxMessage->Data[3] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 24);
  RxMessage->Data[4] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RDHR;
  RxMessage->Data[5] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 8);
  RxMessage->Data[6] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 16);
  RxMessage->Data[7] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 24);
  /* Release the FIFO */
  /* Release FIFO0 */
  if (FIFONumber == CAN_FIFO0)
  {
    CANx->RF0R |= CAN_RF0R_RFOM0;
  }
  /* Release FIFO1 */
  else /* FIFONumber == CAN_FIFO1 */
  {
    CANx->RF1R |= CAN_RF1R_RFOM1;
  }
}




如果邮箱空了,那即使打开邮箱也不会产生中断,所以接收中断函数中不用清中断。


以上是个人理解,欢迎纠错

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

6

帖子

0

粉丝