起因
库版本不一致,网上找到的都是早期的函数调用,一些函数接口都不一样,现在重新写一份调试文档
条件
Mcu:stm32f103c8t6
Cube调用的库:STM32Cube_FW_F1_V1.8.1
Can的配置流程(先大致说一遍):stm32使用maibox(邮箱)的方式进行数据的收发,需要先配置can的pinmux,波特率,中断函数(其中mailbox的fifo也需要中断使能,否则虽然可以采用查询的方式读取数据,但是无法进入中断函数),滤波参数配置;之后需要跟另外一个can模块相连接通讯,否则调试会报错(这里使用了PC端的usbcan模块Ecantools软件);
详细配置
Cube配置:

Can.c中,代码需要进行修改和添加:
Can波特率的配置有一定的公式,可以寻找对应的公式来设置下面红色的三个参数

在这里插void MX_CAN_Init(void)
{CAN_FilterTypeDef sFilterConfig;hcan1.Instance = CAN1;hcan1.Init.Prescaler = 18;     //pclk0=36Mhz     /18=2Mhzhcan1.Init.Mode = CAN_MODE_NORMAL;hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;hcan1.Init.TimeSeg1 = CAN_BS1_2TQ;  //CAN_BS1_1TQhcan1.Init.TimeSeg2 = CAN_BS2_1TQ;hcan1.Init.TimeTriggeredMode = DISABLE;hcan1.Init.AutoBusOff = DISABLE;hcan1.Init.AutoWakeUp = DISABLE;hcan1.Init.AutoRetransmission = DISABLE;hcan1.Init.ReceiveFifoLocked = DISABLE;hcan1.Init.TransmitFifoPriority = DISABLE;switch(g_board_dev.tboard_cfg.can_rate){case 0:hcan1.Init.Prescaler = 36;    //250kbreak;case 1:hcan1.Init.Prescaler = 18;  //500khzbreak;case 2:hcan1.Init.Prescaler = 9; //1Mhzbreak;default:hcan1.Init.Prescaler = 18;break;}  if (HAL_CAN_Init(&hcan1) != HAL_OK){Error_Handler();}sFilterConfig.FilterIdHigh = 0x0000;//32 位 IDsFilterConfig.FilterIdLow = 0x0000;sFilterConfig.FilterMaskIdHigh = 0x0000;//32 位 MASKsFilterConfig.FilterMaskIdLow = 0x0000;      sFilterConfig.FilterBank = 0;         //过滤器0sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0; //过滤器0关联到FIFO0sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;sFilterConfig.FilterActivation = ENABLE; //激活过滤器0HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig);__HAL_CAN_ENABLE_IT(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);//使能can中断//  CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.//CAN_ITConfig(CAN1, CAN_IT_FMP1, ENABLE);//buffer initCan_FifoBuf_Init(&gpmag_rx, mag_rxbuffer, MAG_RXBUFFER_SIZE);}void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(canHandle->Instance==CAN1){/* USER CODE BEGIN CAN1_MspInit 0 *//* USER CODE END CAN1_MspInit 0 *//* CAN1 clock enable */__HAL_RCC_CAN1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**CAN GPIO Configuration    PA11     ------> CAN_RXPA12     ------> CAN_TX */GPIO_InitStruct.Pin = GPIO_PIN_11;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_12;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* CAN1 interrupt Init */HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 6, 0);HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);HAL_NVIC_SetPriority(CAN1_RX1_IRQn, 6, 0);HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn);/* USER CODE BEGIN CAN1_MspInit 1 *//* USER CODE END CAN1_MspInit 1 */}
}
中断接收函数:
void USB_LP_CAN1_RX0_IRQHandler(void)
{/* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 0 *//* USER CODE END USB_LP_CAN1_RX0_IRQn 0 */HAL_CAN_IRQHandler(&hcan1);/* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 1 *//* USER CODE END USB_LP_CAN1_RX0_IRQn 1 */
}//uint8_t byData[8];
//CAN_RxHeaderTypeDef RxMsg;
//CanRxMsgTypeDefPriv tRxMsgPriv;/*can中断回调函数*/  这里的一帧can数据,帧头和数据进行了分离,不像早先的库都放在了一个结构体里面
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{uint8_t byData[8];CAN_RxHeaderTypeDef RxMsg;CanRxMsgTypeDefPriv    tRxMsgPriv;HAL_StatusTypeDef HAL_RetVal;if(hcan ==&hcan1){    HAL_RetVal = HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxMsg,  byData);if ( HAL_OK==HAL_RetVal){                                     //在这里接收数据memcpy(&tRxMsgPriv.RxMsg, &RxMsg, sizeof(CAN_RxHeaderTypeDef));memcpy(&tRxMsgPriv.Data, &byData, sizeof(byData));//压入队列中去Can_FifoBuf_PutByte(&gpmag_rx, tRxMsgPriv);}}
}

上述这样配置ok以后,可以使用下面的发送函数来进行发送

CAN_TxHeaderTypeDef TxMeg;
//发送数据函数
uint8_t CANx_SendNormalData(CAN_HandleTypeDef* hcan,uint16_t ID,uint8_t *pData,uint16_t Len)
{HAL_StatusTypeDef  HAL_RetVal;uint16_t SendTimes,SendCNT=0;uint8_t  FreeTxNum=0;TxMeg.StdId=ID;if(!hcan || ! pData ||!Len)  return 1;SendTimes=Len/8+(Len%8?1:0);FreeTxNum=HAL_CAN_GetTxMailboxesFreeLevel(hcan);TxMeg.DLC=8;while(SendTimes--){if(0==SendTimes){if(Len%8)TxMeg.DLC=Len%8;}while(0==FreeTxNum){FreeTxNum=HAL_CAN_GetTxMailboxesFreeLevel(hcan);}HAL_Delay(1);   //没有延时很有可能会发送失败HAL_RetVal=HAL_CAN_AddTxMessage(hcan,&TxMeg,pData+SendCNT,(uint32_t*)CAN_TX_MAILBOX0); if(HAL_RetVal!=HAL_OK){return 2;}SendCNT+=8;}return 0;
}
这个发送函数会报错,进入hardfault函数中去,只因HAL_CAN_AddTxMessage这个函数里面的一条语句需要屏蔽掉/* Check transmit mailbox value */if (transmitmailbox > 2U){/* Update error code */hcan->ErrorCode |= HAL_CAN_ERROR_INTERNAL;return HAL_ERROR;}/* Store the Tx mailbox *///*pTxMailbox = (uint32_t)1 << transmitmailbox;        如果不使用中断的方式接收can数据,也可以在主循环中采用查询的方式进行读取数据
HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &recv_test1, can_recv_data);

Stm32f103的can模块配置和调试相关推荐

  1. Nginx 附录C 模块编译,调试与测试

    Nginx 附录C 模块编译,调试与测试 C.1 编译与安装 环境要求 操作系统:目前Nginx各版本在以下操作系统和平台测试通过: FreeBSD 3 - 10 / i386; FreeBSD 5 ...

  2. TRINAMIC静音步进驱动TMC2208模块的基本调试方法

    TRINAMIC静音步进驱动TMC2208模块的基本调试方法 TMC2208-LA Module小模块引脚说明 引脚图片 引脚对应关系以及说明 基本调试方法 TMC2208的有效电流(均方根电流)为1 ...

  3. 短信猫通过超级终端进行配置和调试

    1.首先插上 短信猫 自动获取串口号      串口号的查看方法:桌面计算计右键-管理-设备管理器-端口(com与LTP) 2.下载超级终端,解压出来      下载:    超级终端.rar (15 ...

  4. 蓝牙模块HC-05的调试(利用LED灯来检验信号是否能正常传输)

    蓝牙模块HC-05的调试(利用LED灯来检验信号是否能正常传输) by hasyu 我所用到的硬件 BlueTooth HC-05,arduino 2560(uno也行吧) 电脑 手机 硬件的连接 不 ...

  5. Nginx(二) 配置与调试

    nginx 主配置文件在安装目录下的conf中,名字为nginx.conf: 主配置文件主要分为4部分:main(全局设置).server(主机设置).upstream(负载均衡服务器设置)和loca ...

  6. “笨方法”学习Python笔记(2)-VS Code作为文本编辑器以及配置Python调试环境

    Visual Studio Code 免费跨平台文本编辑器,插件资源丰富,我把其作为Debug的首选. 下载地址:https://code.visualstudio.com/Download 安装之后 ...

  7. 轻量级HTTP服务器Nginx(配置与调试Nginx)

    Nginx安装完毕后,会产生相应的安装目录,根据前面的安装路径,Nginx的配置文件路径为/opt/nginx/conf,其中nginx.conf为Nginx的主配置文件.这里重点介绍下nginx.c ...

  8. pycharm 远程调试图文_Pycharm配置远程调试的图文步骤

    Pycharm配置远程调试方法总结 动机 一些bug由于本地环境和线上环境的不一致可能导致本地无法复现 本地依赖和线上依赖版本不一致也可以导致一些问题 有时一些bug跟数据相关,本地数据无法和线上数据 ...

  9. 轻量级HTTP服务器Nginx(配置与调试Nginx)(转)

    2019独角兽企业重金招聘Python工程师标准>>> 转自:http://www.linuxidc.com/Linux/2012-03/55868p3.htm Nginx安装完毕后 ...

最新文章

  1. 计算机系统的分类补充完整,数据库系统原(理B)13春A卷.doc
  2. asp.net mvc发送邮件
  3. IntelliJ IDEA设置默认换行符
  4. servlet——web应用中路径问题
  5. Django的ModelForm
  6. 部分用户称苹果iPad Air 5产品质量下降 外壳有异响
  7. new java.util.date_java.util.Date的替代品
  8. 将Web应用性能提高十倍的10条建议
  9. Maven安装教程配置
  10. mysql嵌套查询实例_MySQL嵌套查询实例详解_MySQL
  11. 万能密码 php,分析PHP网站下的万能密码
  12. 免费软件时代的来临!可以媲美金蝶用友的ERP产品,完全免费使用。
  13. C站能力认证(C4前端基础认证) //任务二:根据浮动布局以及定位布局的特性,实现构建下列(截图)中的页面
  14. platform驱动和pci驱动的区别
  15. css特效之水滴效果
  16. 加速ubuntu开机速度
  17. 淘客必看的抖音引流方案,淘客小白如何在抖音上引流?
  18. Hadoop之MapReduce02【自定义wordcount案例】
  19. 谷歌浏览器开发工具调试样式
  20. 【Hadoop】HDFS文件写入与文件读取过程

热门文章

  1. 迅捷画图中套用流程图模板编辑方法介绍
  2. 天庭云计算机键盘无法输入,Win7系统下无线键盘失灵无法输入的解决方法
  3. centos7挂载win10共享文件夹详解
  4. excel快速自动填充空白单元格上一行的内容
  5. shell脚本——grep cut sort uniq tee diff paster tr等小工具的使用方法
  6. 赵小楼《天道》《遥远的救世主》深度解析(44)怎么理解肖亚文听到芮小丹说爱上丁元英时所说的“地狱”?
  7. (六)Python查询12306余票:升级版-----图形化界面代码
  8. Java破解9X9数独小游戏
  9. bootstrap-fileinput踩坑-选择文件类型
  10. php资产管理,php固定资产管理系统