cubemx配置stm32f407VET6实现can通信

背景:
项目上需要把原先的TMC5160电机驱动器替换为购买的电机控制模块(该模块采用canopen通信)
移植canopen的前提是can通信正常,现在添加一下can通信(先用标准帧,250K bit/S的波特率测试)

原理图:
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

软件实现:
1.cubemx配置can通信
参考博客:https://blog.csdn.net/weixin_43362027/article/details/132716496
1)如何计算波特率?
在这里插入图片描述
2)中断

在这里插入图片描述
2.实际配置
can1的时钟在APB1上,APB1的时钟为84MHZ;
所以250k = (84/21)/8 = 4M/8
在这里插入图片描述
在这里插入图片描述
3.生成代码验证功能:
生成的代码不能直接用;
1)can_init要修改

void MX_CAN1_Init(void)
{

  /* USER CODE BEGIN CAN1_Init 0 */

  /* USER CODE END CAN1_Init 0 */

  /* USER CODE BEGIN CAN1_Init 1 */

  /* USER CODE END CAN1_Init 1 */
  hcan1.Instance = CAN1;
  hcan1.Init.Prescaler = 21;
  hcan1.Init.Mode = CAN_MODE_NORMAL;
  hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan1.Init.TimeSeg1 = CAN_BS1_2TQ;
  hcan1.Init.TimeSeg2 = CAN_BS2_5TQ;
  hcan1.Init.TimeTriggeredMode = DISABLE;
  hcan1.Init.AutoBusOff = DISABLE;
  hcan1.Init.AutoWakeUp = DISABLE;
  hcan1.Init.AutoRetransmission = DISABLE;
  hcan1.Init.ReceiveFifoLocked = DISABLE;
  hcan1.Init.TransmitFifoPriority = DISABLE;
  if (HAL_CAN_Init(&hcan1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN CAN1_Init 2 */
    CAN_FilterTypeDef sFilterConfig;
     sFilterConfig.FilterBank = 0;
    sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
    sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
    sFilterConfig.FilterIdHigh = 0x0000;
    sFilterConfig.FilterIdLow = 0x0000;
    sFilterConfig.FilterMaskIdHigh = 0x0000;
    sFilterConfig.FilterMaskIdLow = 0x0000;
    sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
    sFilterConfig.FilterActivation = CAN_FILTER_ENABLE;
    sFilterConfig.SlaveStartFilterBank = 14;

    if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
    {
        /* Filter configuration Error */
        Error_Handler();
    }

    HAL_CAN_Start(&hcan1);
    HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING);
  /* USER CODE END CAN1_Init 2 */

}

``
区别在于要添加这个部分:
在这里插入图片描述
2)实现can发送,我增加了报错信息用于调试

uint32_t pTxMailbox;
CAN_TxHeaderTypeDef 	TxHeader= {
    .RTR = CAN_RTR_DATA,
    .IDE = CAN_ID_STD,
    .StdId = 1,
    .TransmitGlobalTime = DISABLE,
    .DLC = 8,
};

void CanSendData(uint32_t id,uint8_t *data)
{
    //HAL_OK
    int ret=0;
    TxHeader.StdId = id;
    TxHeader.ExtId = id;
    HAL_Delay(5);

    HAL_CAN_AddTxMessage(&hcan1,&TxHeader,data,&pTxMailbox);
      if(ret == HAL_OK)
    HAL_UART_Transmit(&huart2, "\r\ncan send HAL_OK\r\n", strlen("\r\ncan send HAL_OK\r\n"), 100);
  else if(ret ==HAL_ERROR)
    HAL_UART_Transmit(&huart2, "\r\ncan send HAL_ERROR\r\n", strlen("\r\ncan send HAL_ERROR\r\n"), 100);
  else if(ret ==HAL_BUSY)
    HAL_UART_Transmit(&huart2, "\r\ncan send HAL_BUSY\r\n", strlen("\r\ncan send HAL_BUSY\r\n"), 100);
  else if(ret ==HAL_TIMEOUT)
    HAL_UART_Transmit(&huart2, "\r\ncan send HAL_TIMEOUT\r\n", strlen("\r\ncan send HAL_TIMEOUT\r\n"), 100);
    
}

3)实现can接收;我实现的业务逻辑是在can接收回调函数中串口打印接收到的can包

uint8_t User_CAN_RxData[10]=0;
uint32_t  User_CAN_Rx_ID = 0;
CAN_RxHeaderTypeDef   RxHeader;
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
  if(hcan->Instance==CAN1)
  {
    HAL_CAN_GetRxMessage(hcan,CAN_FILTER_FIFO0,&RxHeader,User_CAN_RxData);
    User_CAN_Rx_ID = RxHeader.StdId;

    User_CAN_RxData[8] = '\r';
    User_CAN_RxData[9] = '\n';
    HAL_UART_Transmit(&huart2, User_CAN_RxData, strlen(User_CAN_RxData), 100);
    memset(User_CAN_RxData,0,sizeof(User_CAN_RxData));

    }
}

验证结果:
发送正常;
接收还没测试;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/628926.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【回溯】1255. 得分最高的单词集合

本文涉及知识点 回溯 力扣难道:1881 LeetCode1255. 得分最高的单词集合 你将会得到一份单词表 words,一个字母表 letters (可能会有重复字母),以及每个字母对应的得分情况表 score。 请你帮忙计算玩家在单词拼写游戏…

系统管理(System Keeping):Codigger资源与配置管理(上)

系统管理(System Keeping),作为Codigger不可或缺的一部分,为开发者提供全面而高效的资源与配置管理体验。下面,让我们从它的其中三方面来一探究竟其强大的功能如何助力开发者提升工作效率。 一、环境配置:全…

Linux交叉编译

一. 交叉编译 1.使用环境要求 新版本的orangepi-build是在Ubuntu22.04的x64电脑或虚拟机上运行的 lsb_release -a //查看自己的虚拟机版本 因为编译出的SDK大概有16G大小,因此,至少给虚拟机分配50G的大小。 2.获取Linux SDK 方法一:从…

React框架-Next 学习-1

创建一个 Next.js 应用,node版本要高,16.5以上 npm淘宝镜像切为https://registry.npmmirror.com npm config set registry https://registry.npmmirror.com npx create-next-applatest//安装后 使用npm run dev 启动 Next.js 是围绕着 页面(pages&am…

智慧园区EasyCVR视频智能管理方案:构建高效安全园区新视界

一、背景分析 园区作为城市的基本单元,是最重要的人口和产业聚集区。根据行业市场调研,90%以上城市居民工作与生活在园区进行,80%以上的GDP和90%以上的创新在园区内产生,可以说“城市,除了马路都是园区”。 园区形态…

高通QCS6490开发(二)AI板卡接口

QCS6490是高通公司针对高端物联网终端而优化的SoC,在性能和功耗上有最优的平衡。《高通QCS6490 AIoT应用开发》是一系列AIoT应用开发文章,介绍如何基于QCS6490平台做AIIoT的应用开发。 本文主要介绍FV01开发板的内部和外部接口。 内部的板载接口如下 接口…

怎么做私域?先来了解私域运营模式!

现在,很多企业都在做私域,但仍旧有很多人会问:我的私域到底要怎么做? 关于这个问题,不同产品无论在消费频次与客单价上,还是在决策链路的长度和复杂度上,都有巨大的差异,消费者需要…

GPT-4o模型介绍和使用方法

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

java项目之企业资产管理系统(springboot+vue+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的企业资产管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 管理员功能有个人中心&…

程序员兼职引起的纠纷?

最近跟朋友聊天,说遇到一些因兼职工作而引发的争议,因为我本人也曾涉足过兼职领域,因此对程序员兼职时可能遇到的各种情况和应遵循的“套路”准则还有有一些发言权的,所以想和大家聊聊如何安全“兼职”的1/2事项~ ✅顺便内推个机会…

前端面试题(二十三)(答案版)

面试形式:线上电话面试:一面:时长30分钟 面试评价:精准考察项目所需技术理论工作实践 面试官的提问大纲:本公司项目要求本人简历 工作经验:2-4年 公司名称:深圳XX(想知道的就滴喔…

SHELL编程(一)

目录 一、 Linux操作系统(一)内核与操作系统(二)操作系统的功能 二、Linux高级命令(一) 离线安装 dpkg1. 安装2. 使用3. 查看安装详细信息4. 安装路径5. 不完全删除6. 完全删除 (二)…

(内地家长)为什么不建议做香港优才计划?香港身份的孩子不是全都能低分上名校!

(内地家长)为什么不建议做香港优才计划?香港身份的孩子不能都低分上名校! 大部分申请香港优才的朋友,应该是冲着孩子教育、高考升学来的。 确实,香港优才申请后拿到的香港身份,对于孩子读书教…

HT3S-ECS-MDN网关引领智能称重新篇章欧姆龙EtherCAT PLC的集成应用案例

在现代化工业生产中,精确的数据采集和高效的通信系统是确保生产流程顺利运行的关键。特别是在称重环节,数据的准确性和实时性对于生产质量和成本控制至关重要。今天,我们将为您介绍一个成功的案例,展示HT3S-ECS-MDN网关如何连接称…

git常用命令及其ignore文件

1.git本地操作命令 # 查看git的版本 git --version # 生成空的本地仓库 git init # 将文件添加到暂存区 git add 文件 # 将暂存区里的文件提交到本地仓库 git commit -m "描述"2.git远程仓库命令 # 添加远程仓库 git remote add origin http://192.168.1.130:9000/…

MySQL 8.0 全新特性详解

MySQL 8.0带来了许多令人兴奋的新特性和优化功能,下面我将逐一详细介绍每个特性: 一、原生数据字典 MySQL 8.0 引入了原生数据字典,取代了之前使用的.frm、.par、.opt等文件来存储元数据。这一改进使得元数据的访问和管理更加高效和直接。原…

【Java基础】初识正则表达式

正则表达式只适用于字符串 匹配matches 实际使用的是String类中定义的方法boolean matches(String regex) public static void piPei( ){String regex"[1][356789]\\d{9}";boolean boo"14838384388".matches(regex);System.out.println(boo); }验证qq号…

第四篇 Asciidoc - MindMap 思维导图 不是事

MindMap 是一种对思维的简单抽象,说到底,就是一个树状结构。 以下是一个样例: Figure 1. MindMap示例 我们的目录结构、模块结构、分类结构等等,都是树型结构,它非常普遍,因此 MindMap 是笔记软件中,获得最多支持的一种图。 精确地说,这类图,是对思维结构的一种映射…

泛微OA中设置SAP接口

泛微OA中设置SAP接口 在泛微oa中有些时候我们需要对接其他系统的接口,这个时候就体现出泛微oa的强大兼容性了。只需要将其他系统的接口在集成中心中的SAP集成中配置即可。 在点击服务注册之后,需要输入服务名称,以及接口名称,并…

2024 手把手教你MathType 7.8中文破解版详细安装激活图文教程

MathType 7.8中文破解版是一款全球最受欢迎的专业数学公式编辑器工具软件,MathType可视化公式编辑器轻松创建数学方程式和化学公式.兼容Office Word,PowerPoint,Pages,Keynote,Numbers等700多种办公软件,用于编辑数学试卷,书籍,报刊,论文,幻灯演示等文档轻松编写各种复杂的物理…