STM32 CUBE Can调试
STM32 CUBE Can调试
- 1、CAN配置
- 2、时钟配置
- 3、手动添加
- 4、回调函数
- 5、启动函数和发送函数
- 6、使用方法(采用消息队列来做缓存)
- 7、数据不多在发送函数中获取空邮箱发送,否则循环等待空邮箱
1、CAN配置
2、时钟配置
3、手动添加
需要注意的是STM32CUBE配置的代码需要再手动添加过滤器,并且将FIFO关联。
/* CAN init function */
void MX_CAN_Init(void)
{/* USER CODE BEGIN CAN_Init 0 *//* USER CODE END CAN_Init 0 *//* USER CODE BEGIN CAN_Init 1 *//* USER CODE END CAN_Init 1 */hcan.Instance = CAN1;hcan.Init.Prescaler = 18;hcan.Init.Mode = CAN_MODE_NORMAL;hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;hcan.Init.TimeSeg1 = CAN_BS1_8TQ;hcan.Init.TimeSeg2 = CAN_BS2_7TQ;hcan.Init.TimeTriggeredMode = DISABLE;hcan.Init.AutoBusOff = DISABLE;hcan.Init.AutoWakeUp = DISABLE;hcan.Init.AutoRetransmission = DISABLE;hcan.Init.ReceiveFifoLocked = DISABLE;hcan.Init.TransmitFifoPriority = DISABLE;if (HAL_CAN_Init(&hcan) != HAL_OK){Error_Handler();}/* USER CODE BEGIN CAN_Init 2 *//* 手动新增 */CAN_FilterTypeDef CAN1_sFilterConfig;CAN1_sFilterConfig.FilterIdHigh = CAN1_ID_H; //32位基础ID设置(高16位)CAN1_sFilterConfig.FilterIdLow = CAN1_ID_L; //32位基础ID设置(低16位)CAN1_sFilterConfig.FilterMaskIdHigh = CAN1_MASK_H; //32位屏蔽MASK设置(高16位)CAN1_sFilterConfig.FilterMaskIdLow = CAN1_MASK_L; //32位屏蔽MASK设置(低16位)CAN1_sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; //接收到的报文放入FIFO0位置CAN1_sFilterConfig.FilterBank = 0; //过滤器0CAN1_sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; //设为IDLIST列表模式/IDMASK屏蔽模式CAN1_sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; //过滤器位宽度CAN1_sFilterConfig.FilterActivation = ENABLE; //ENABLE激活过滤器,DISABLE禁止过滤器CAN1_sFilterConfig.SlaveStartFilterBank = 0; //过滤器组设置(单个CAN总线时无用)if (HAL_OK!=HAL_CAN_ConfigFilter(&hcan, &CAN1_sFilterConfig))//判断开启是否成功{/* Filter configuration Error */Error_Handler(); //开启CAN总线失败的处理程序}/* USER CODE END CAN_Init 2 */}
4、回调函数
/*** @brief CAN FIFO0的中断回调函数,在里面完成数据的接收* @param hcan CAN的句柄*/uint8_t date_CAN[8];//设为全局变量,用于接收CAN数据
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{if(hcan->Instance ==CAN1){CAN_RxHeaderTypeDef RxHeader; //接受句柄HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, date_CAN); //接收,CAN邮箱为0FPGA_Comm_Analysis(RxHeader.ExtId, date_CAN, RxHeader.DLC);return ;}
}
5、启动函数和发送函数
启动函数记得添加在while循环之前。
HAL_CAN_ActivateNotification(hcan ,CAN_IT_RX_FIFO0_MSG_PENDING);
需要发送时调用发送函数:
/*******************************************************
函数名称: Drv_Can_Write
功能描述:
输 入: 无输 出: 无
******************************************************/
uint8_t Drv_Can_Write(CAN_HandleTypeDef* hcan, uint32_t ID, uint8_t *pData,uint16_t Len)
{ uint8_t ret=1;HAL_StatusTypeDef res = HAL_OK;uint32_t TxMailbox;CAN_TxHeaderTypeDef st_TxHeader;st_TxHeader.StdId=0;st_TxHeader.ExtId=ID;st_TxHeader.IDE=CAN_ID_EXT;st_TxHeader.RTR=0;st_TxHeader.DLC=Len;/*找到空的发送邮箱,把数据发送出去*/res = HAL_CAN_AddTxMessage(hcan, &st_TxHeader, pData, &TxMailbox);if(res != HAL_OK){//printf("HAL_CAN_AddTxMessage TxMailbox = %d fail! result = %d", TxMailbox, res);ret = 0;}return ret;
}/******************************************************
函数名称: Drv_Can_Start
功能描述:
输 入: 无输 出: 无
********************************************************/
void Drv_Can_Start(CAN_HandleTypeDef *hcan)
{HAL_CAN_ActivateNotification(hcan ,CAN_IT_RX_FIFO0_MSG_PENDING);HAL_CAN_Start(hcan);
}
6、使用方法(采用消息队列来做缓存)
7、数据不多在发送函数中获取空邮箱发送,否则循环等待空邮箱
uint8_t CAN1_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;uint8_t FreeLevelCount=0;uint32_t CAN_TX_BOX0;TxMeg.StdId=ID;TxMeg.IDE = CAN_ID_STD;//扩展帧标识(STD标准帧/EXT扩展帧)TxMeg.RTR = CAN_RTR_DATA;//远程帧标识(DATA数据帧/REMOTE远程帧)if(!hcan||!pData||!Len){printf("\n\rCAN发送失败!\n\r"); //串口发送return HAL_ERROR;//如果总线名、数据、数量任何一个为0则返回值为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;//则加入最后不足8个的数据内容}FreeLevelCount = 0;//防止死循环while(0 == FreeTxNum&&FreeLevelCount<10){FreeLevelCount++;HAL_Delay(1);FreeTxNum = HAL_CAN_GetTxMailboxesFreeLevel(hcan);}HAL_Delay(1);//延时防止速度过快导致的发送失败//开始发送数据(参数:总线名,设置参数,数据,邮箱号)HAL_RetVal=HAL_CAN_AddTxMessage(hcan,&TxMeg,pData+SendCNT,&CAN_TX_BOX0);if(HAL_RetVal!=HAL_OK){printf("\n\rCAN总线忙碌!\n\r"); //串口发送return HAL_BUSY;//如果发送失败,则返回值为2}SendCNT+=8;}return HAL_OK;//如果发送成功结束,返回值为0
}
//CAN总线通信,使用CAN1,这是CAN专用的printf函数
//调用方法:CAN1_printf("123"); //向UART8发送字符123
void CAN1_printf (char *fmt, ...)
{char buff[CAN1_REC_LEN+1]; //用于存放转换后的数据 [长度]uint16_t i=0;va_list arg_ptr;va_start(arg_ptr, fmt);vsnprintf(buff, CAN1_REC_LEN+1, fmt, arg_ptr);//数据转换i=strlen(buff);//得出数据长度if(strlen(buff)>CAN1_REC_LEN)i=CAN1_REC_LEN;//如果长度大于最大值,则长度等于最大值(多出部分忽略)CAN1_SendNormalData(&hcan,0x11,(uint8_t *)buff,i);//CAN发送数据函数(ID为0x11)va_end(arg_ptr);
}
相关文章:

STM32 CUBE Can调试
STM32 CUBE Can调试 1、CAN配置2、时钟配置3、手动添加4、回调函数5、启动函数和发送函数6、使用方法(采用消息队列来做缓存)7、数据不多在发送函数中获取空邮箱发送,否则循环等待空邮箱 1、CAN配置 2、时钟配置 3、手动添加 需要注意的是STM32CUBE配置的代码需要再…...

MySQL数据存储- 索引组织表
索引组织表 前言数据存储堆表索引组织表 二级索引二级索引的性能评估🔹为什么 idx_name 的性能开销最大?🔹 为什么 idx_last_modify_date 更新频繁会影响性能?分析二级索引性能表格为什么主键应该“紧凑且顺序”?二级索…...

基于STM32设计的仓库环境监测与预警系统
目录 项目开发背景设计实现的功能项目硬件模块组成设计思路系统功能总结使用的模块的技术详情介绍总结 1. 项目开发背景 随着工业化和现代化的进程,尤其是在制造业、食品业、医药业等行业,仓库环境的监控和管理成为了至关重要的一环。尤其是在存储易腐…...

VSCode便捷开发
一、常用插件 Vue 3 Snippets、Vetur、Vue - Official 二、常用开发者工具 三、Vue中使用Element-UI 安装步骤: 1、在VSCode的终端执行如下指令: npm i element-ui -S 2、在main.js中全局引入: import Vue from vue; import ElementUI from …...
理解 Maven 的 pom.xml 文件
pom.xml 是 Maven 项目的核心文件,它是项目构建、依赖管理、插件配置和项目元数据的主要地方。通过 pom.xml 文件,Maven 知道如何构建项目、下载依赖库、执行测试等任务。每个 Maven 项目都必须包含一个 pom.xml 文件。本文将详细讲解 pom.xml 文件的结构…...
docker数据持久化的意义
Docker 数据持久化是指在 Docker 容器中保存的数据不会因为容器的停止、删除或重启而丢失。Docker 容器本身是临时性的,默认情况下,容器内的文件系统是临时的,容器停止或删除后,其中的数据也会随之丢失。为了确保重要数据…...

opentelemetry-collector 配置elasticsearch
一、修改otelcol-config.yaml receivers:otlp:protocols:grpc:endpoint: 0.0.0.0:4317http:endpoint: 0.0.0.0:4318 exporters:debug:verbosity: detailedotlp/jaeger: # Jaeger supports OTLP directlyendpoint: 192.168.31.161:4317tls:insecure: trueotlphttp/prometheus: …...
ASP.NET Core JWT Version
目录 JWT缺点 方案 实现 Program.cs IdentityHelper.cs Controller NotCheckJWTVersionAttribute.cs JWTVersionCheckkFilter.cs 优化 JWT缺点 到期前,令牌无法被提前撤回。什么情况下需要撤回?用户被删除了、禁用了;令牌被盗用了&…...

【ArcGIS】R语言空间分析、模拟预测与可视化技术
R语言在空间数据挖掘中具有广泛的应用,以下是一些关键内容和常用包的介绍: R语言空间数据挖掘的关键技术 空间数据类型 矢量数据:包括点(Point)、线(Line)、面(Polygon)等…...

日常知识点之面试后反思遗留问题汇总
梳理一下最近接触到的几个知识点: 1:突然问到端口复用 (SO_REUSEADDR) 端口复用一般用在服务端重启时,套接字处于time_wait状态时,无法绑定该端口,导致无法启动问题。 设置端口复用ÿ…...

链表(LinkedList) 1
上期内容我们讲述了顺序表,知道了顺序表的底层是一段连续的空间进行存储(数组),在插入元素或者删除元素需要将顺序表中的元素整体移动,时间复杂度是O(n),效率比较低。因此,在Java的集合结构中又引入了链表来解决这一问…...

Qt:Qt Creator项目创建
目录 认识Qt Creator Qt Creator概览 使用Qt Creator新建项目 选择项目模板 选择项目路径 选择构建系统 填写类信息设置界面 选择语言和翻译文件 选择Qt套件 选择版本控制系统 最终效果 认识Qt Creator Qt Creator概览 从开始菜单或者快捷方式打开Qt Creator集成开…...
windows11上,使用pipx安装Poetry,Poetry的安装路径是什么?
当使用 pipx 安装 Poetry 时,pipx 会将 Poetry 安装到一个独立的虚拟环境中,并将其可执行文件链接到一个集中的目录中。以下是 pipx 安装 Poetry 时的路径信息: 1. Poetry 的安装路径 pipx 会为每个工具(如 Poetry)创…...

详解状态模式
引言 水有固态、液态、气态三种状态,在不同条件下这三种状态可以相互转化。同样在软件设计中,有些对象也有不同的状态,不同状态的行为不同,状态模式就是用来处理这种情况的。 1.概念 状态模式(State Pattern):允许一个…...
能否通过蓝牙建立TCP/IP连接来传输数据
前言: 最近在做一个项目时,产生了一个疑问:能否通过蓝牙建立TCP/IP连接来传输数据 查阅了一些文章,可以得出结论:不行 下面是我截取的两篇个人认可的文章的回答: 文章一: 蓝牙是一种短距离无…...
uniapp mqttjs 小程序开发
在UniApp中集成MQTT.js开发微信小程序时,需注意平台差异、协议兼容性及消息处理等问题。以下是关键步骤与注意事项的综合指南: 一、环境配置与依赖安装 安装MQTT.js 推荐使用兼容性较好的版本:mqtt4.1.0(H5和小程序兼容性最佳&…...

爬虫工程师分享:获取京东商品详情SKU数据的技术难点与攻破方法
在电商数据领域,京东商品详情页的SKU数据是许多爬虫工程师的目标。这些数据包含了商品的价格、库存、规格等关键信息,对于市场分析、价格监控等应用场景至关重要。然而,获取这些数据并非易事,京东作为国内电商巨头,其反…...

数据库操作与数据管理——Rust 与 SQLite 的集成
第六章:数据库操作与数据管理 第一节:Rust 与 SQLite 的集成 在本节中,我们将深入探讨如何在 Rust 中使用 SQLite 数据库,涵盖从基本的 CRUD 操作到事务处理、数据模型的构建、性能优化以及安全性考虑等方面。SQLite 是一个轻量…...

LeetCode 0063.不同路径 II:动态规划 - 原地使用地图数组,几乎无额外空间开销
【LetMeFly】63.不同路径 II:动态规划 - 原地使用地图数组,几乎无额外空间开销 力扣题目链接:https://leetcode.cn/problems/unique-paths-ii/ 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0]&#…...

elementui:el-table支持搜索、切换分页多选功能,以及数据回显
1、el-table相关代码,需注意:row-key"(row) > { return row.id }" 以及 :reserve-selection"true" <div class"boxList"><div class"search-form"><!-- 搜索表单 --><el-form :inline"true&q…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

GraphRAG优化新思路-开源的ROGRAG框架
目前的如微软开源的GraphRAG的工作流程都较为复杂,难以孤立地评估各个组件的贡献,传统的检索方法在处理复杂推理任务时可能不够有效,特别是在需要理解实体间关系或多跳知识的情况下。先说结论,看完后感觉这个框架性能上不会比Grap…...
Python的__call__ 方法
在 Python 中,__call__ 是一个特殊的魔术方法(magic method),它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时(例如 obj()),Python 会自动调用该对象的 __call__ 方法…...

鸿蒙Navigation路由导航-基本使用介绍
1. Navigation介绍 Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(Navigation的子组件)或非首页显示(Nav…...