Stm32f103的can模块配置和调试
起因:
库版本不一致,网上找到的都是早期的函数调用,一些函数接口都不一样,现在重新写一份调试文档
条件:
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模块配置和调试相关推荐
- Nginx 附录C 模块编译,调试与测试
Nginx 附录C 模块编译,调试与测试 C.1 编译与安装 环境要求 操作系统:目前Nginx各版本在以下操作系统和平台测试通过: FreeBSD 3 - 10 / i386; FreeBSD 5 ...
- TRINAMIC静音步进驱动TMC2208模块的基本调试方法
TRINAMIC静音步进驱动TMC2208模块的基本调试方法 TMC2208-LA Module小模块引脚说明 引脚图片 引脚对应关系以及说明 基本调试方法 TMC2208的有效电流(均方根电流)为1 ...
- 短信猫通过超级终端进行配置和调试
1.首先插上 短信猫 自动获取串口号 串口号的查看方法:桌面计算计右键-管理-设备管理器-端口(com与LTP) 2.下载超级终端,解压出来 下载: 超级终端.rar (15 ...
- 蓝牙模块HC-05的调试(利用LED灯来检验信号是否能正常传输)
蓝牙模块HC-05的调试(利用LED灯来检验信号是否能正常传输) by hasyu 我所用到的硬件 BlueTooth HC-05,arduino 2560(uno也行吧) 电脑 手机 硬件的连接 不 ...
- Nginx(二) 配置与调试
nginx 主配置文件在安装目录下的conf中,名字为nginx.conf: 主配置文件主要分为4部分:main(全局设置).server(主机设置).upstream(负载均衡服务器设置)和loca ...
- “笨方法”学习Python笔记(2)-VS Code作为文本编辑器以及配置Python调试环境
Visual Studio Code 免费跨平台文本编辑器,插件资源丰富,我把其作为Debug的首选. 下载地址:https://code.visualstudio.com/Download 安装之后 ...
- 轻量级HTTP服务器Nginx(配置与调试Nginx)
Nginx安装完毕后,会产生相应的安装目录,根据前面的安装路径,Nginx的配置文件路径为/opt/nginx/conf,其中nginx.conf为Nginx的主配置文件.这里重点介绍下nginx.c ...
- pycharm 远程调试图文_Pycharm配置远程调试的图文步骤
Pycharm配置远程调试方法总结 动机 一些bug由于本地环境和线上环境的不一致可能导致本地无法复现 本地依赖和线上依赖版本不一致也可以导致一些问题 有时一些bug跟数据相关,本地数据无法和线上数据 ...
- 轻量级HTTP服务器Nginx(配置与调试Nginx)(转)
2019独角兽企业重金招聘Python工程师标准>>> 转自:http://www.linuxidc.com/Linux/2012-03/55868p3.htm Nginx安装完毕后 ...
最新文章
- 计算机系统的分类补充完整,数据库系统原(理B)13春A卷.doc
- asp.net mvc发送邮件
- IntelliJ IDEA设置默认换行符
- servlet——web应用中路径问题
- Django的ModelForm
- 部分用户称苹果iPad Air 5产品质量下降 外壳有异响
- new java.util.date_java.util.Date的替代品
- 将Web应用性能提高十倍的10条建议
- Maven安装教程配置
- mysql嵌套查询实例_MySQL嵌套查询实例详解_MySQL
- 万能密码 php,分析PHP网站下的万能密码
- 免费软件时代的来临!可以媲美金蝶用友的ERP产品,完全免费使用。
- C站能力认证(C4前端基础认证) //任务二:根据浮动布局以及定位布局的特性,实现构建下列(截图)中的页面
- platform驱动和pci驱动的区别
- css特效之水滴效果
- 加速ubuntu开机速度
- 淘客必看的抖音引流方案,淘客小白如何在抖音上引流?
- Hadoop之MapReduce02【自定义wordcount案例】
- 谷歌浏览器开发工具调试样式
- 【Hadoop】HDFS文件写入与文件读取过程
热门文章
- 迅捷画图中套用流程图模板编辑方法介绍
- 天庭云计算机键盘无法输入,Win7系统下无线键盘失灵无法输入的解决方法
- centos7挂载win10共享文件夹详解
- excel快速自动填充空白单元格上一行的内容
- shell脚本——grep cut sort uniq tee diff paster tr等小工具的使用方法
- 赵小楼《天道》《遥远的救世主》深度解析(44)怎么理解肖亚文听到芮小丹说爱上丁元英时所说的“地狱”?
- (六)Python查询12306余票:升级版-----图形化界面代码
- Java破解9X9数独小游戏
- bootstrap-fileinput踩坑-选择文件类型
- php资产管理,php固定资产管理系统