OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7065|回复: 3

stm32 can实验部分总结

[复制链接]

38

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2011-7-12
在线时间
0 小时
发表于 2011-12-1 10:25:05 | 显示全部楼层 |阅读模式
 

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

fficeffice" />

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;
  }
}

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


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

图片1.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2011-12-1 10:50:46 | 显示全部楼层
回复【楼主位】 天马 :
---------------------------------
打包发上源码吧.

另外论坛可以上传图片的.不用搞附件.



我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2011-11-9
在线时间
0 小时
发表于 2012-8-13 20:46:16 | 显示全部楼层
求整个源码 谢谢 1058563914@qq.com
回复 支持 反对

使用道具 举报

11

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2016-7-16
在线时间
72 小时
发表于 2016-10-28 19:33:17 | 显示全部楼层
请问这句代码CANx->sFIFOMailBox[FIFONumber].RIR的RIR代表什么啊?我查的结果只是被定义的一个结构体,没有赋值,那样就找不到CANx->sFIFOMailBox[FIFONumber].RIR它的值了,看的头大,求解啊!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 13:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表