STM32CubeIDE(CAN)
目录
一、概念
1、简述
2、CAN 的几种模式
二、实践
1、环回模式轮询通信
1.1 软件配置
1.2 代码编写
2、环回模式中断通信
2.1 软件配置
2.2 代码编写
一、概念
1、简述
STM32微控制器系列包含多个型号,其中一些型号集成了CAN(Controller Area Network)控制器,使其可以直接通过硬件接口实现CAN通信。CAN总线是一种多主总线,用于实时应用,例如在汽车、工业自动化和医疗设备中进行数据通信。
2、CAN 的几种模式
CAN(Controller Area Network)通信支持几种不同的操作模式,这些模式主要设计用于系统初始化、调试、故障检测和网络管理。
1. 正常模式(Normal Mode): 这是最常见的模式,在这种模式下,CAN节点可以发送和接收数据。所有的CAN功能都是可用的,节点可以参与总线上的数据交换,包括数据帧和远程帧的发送与接收。这是CAN总线在日常操作中最常用的模式。
2. 环回模式(Loopback Mode): 在环回模式下,节点发送的数据会被立即重定向回到同一节点的接收器。这意味着节点可以发送一个数据帧,并立即在同一节点上接收该帧,而不将其发送到总线上。这种模式主要用于测试CAN硬件和软件的正确性,因为它允许开发者检查发送的数据是否与接收的数据一致,而无需其他网络节点的参与。
3. 静默模式(Silent Mode): 在静默模式下,节点可以接收数据,但是不会向总线发送任何数据。这意味着即使在检测到总线上的数据帧或远程帧时,节点也不会进行应答或发送任何数据。静默模式通常用于监控网络活动,而不干扰网络通信。例如,在进行故障诊断时,工程师可能只想观察网络上的数据流,而不是影响它们。
4.静默环回模式(Silent Loopback Mode):它结合了静默模式和环回模式的特点,即节点既不会向总线发送数据,同时也会将发送的数据在内部进行环回,用于更细致的测试和调试目的。
二、实践
1、环回模式轮询通信
1.1 软件配置

1.2 代码编写
if(CAN_SetFilters()==HAL_OK){printf("ID Filter: Only Odd IDs \r\n");}if(HAL_CAN_Start(&hcan1)==HAL_OK){printf("CAN is start \r\n");}uint8_t msgID=1;while (1){//CAN_TestPoll(msgID++,CAN_RTR_DATA);//数据帧//printf("\r\n \r\n");HAL_Delay(2000);CAN_TestPoll(msgID++,CAN_RTR_REMOTE);//遥控帧printf("\r\n \r\n");}
HAL_StatusTypeDef CAN_SetFilters()
{CAN_FilterTypeDef canFilter;canFilter.FilterBank=0;canFilter.FilterMode=CAN_FILTERMODE_IDMASK;canFilter.FilterScale=CAN_FILTERSCALE_32BIT;canFilter.FilterIdHigh =0x0020;canFilter.FilterIdLow = 0x0000;canFilter.FilterMaskIdHigh = 0x0020;canFilter.FilterMaskIdLow = 0x0000;canFilter.FilterFIFOAssignment=CAN_FILTER_FIFO0;canFilter.FilterActivation = CAN_FILTER_ENABLE;canFilter.SlaveStartFilterBank = 14;HAL_StatusTypeDef result = HAL_CAN_ConfigFilter(&hcan1, &canFilter);return result;
}void CAN_TestPoll(uint8_t msgID, uint8_t frameType)
{uint8_t txData[8];txData[0]=msgID;txData[1]=msgID+11;CAN_TxHeaderTypeDef TxHeader;TxHeader.StdId=msgID;TxHeader.RTR=frameType;TxHeader.IDE=CAN_ID_STD;TxHeader.DLC = 2;TxHeader.TransmitGlobalTime =DISABLE;while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan1)<1){}uint32_t TxMailbox;if(HAL_CAN_AddTxMessage(&hcan1, &TxHeader, txData, &TxMailbox)!=HAL_OK){printf("Send to mailbox error \r\n");return ;}//uint8_t tempStr[30];printf("Send MsgID= %d \r\n",msgID);while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan1)!=3){}//轮询方式接收消息HAL_Delay(1);if(HAL_CAN_GetRxFifoFillLevel(&hcan1, CAN_RX_FIFO0)!=1){printf("Message is not received \r\n");return ;}printf("Message is received \r\n");CAN_RxHeaderTypeDef RxHeader;uint8_t RxData[8];if(HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, RxData)==HAL_OK){printf("StdID=%ld \r\n",RxHeader.StdId);printf("RTR(0=Data,2=Remote)=%ld \r\n",RxHeader.RTR);printf("IDE(0=Std,4=Ext)=%ld \r\n",RxHeader.IDE);printf("DLC(Data Length)=%ld \r\n",RxHeader.DLC);if(TxHeader.RTR == CAN_RTR_DATA){printf("Data[0] = %d \r\n",RxData[0]);printf("Data[1] = %d \r\n",RxData[1]);}}
}
2、环回模式中断通信
2.1 软件配置


2.2 代码编写
if(CAN_SetFilters()==HAL_OK){printf("ID Filter: Only Odd IDs \r\n");}if(HAL_CAN_Start(&hcan1)==HAL_OK){printf("CAN is start \r\n");}uint8_t msgID=1;__HAL_CAN_ENABLE_IT(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING);//使能接收中断__HAL_CAN_ENABLE_IT(&hcan1,CAN_IT_RX_FIFO1_MSG_PENDING);while (1){CAN_SendMsg(msgID++,CAN_RTR_DATA);HAL_Delay(1000);printf("\r\n \r\n");}
HAL_StatusTypeDef CAN_SetFilters()
{CAN_FilterTypeDef canFilter;//设置FIFO0的筛选器canFilter.FilterBank=0;canFilter.FilterMode=CAN_FILTERMODE_IDMASK;canFilter.FilterScale=CAN_FILTERSCALE_32BIT;canFilter.FilterIdHigh =0x0020;canFilter.FilterIdLow = 0x0000;canFilter.FilterMaskIdHigh = 0x0020;canFilter.FilterMaskIdLow = 0x0000;canFilter.FilterFIFOAssignment=CAN_FILTER_FIFO0;canFilter.FilterActivation = CAN_FILTER_ENABLE;canFilter.SlaveStartFilterBank = 14;HAL_StatusTypeDef result = HAL_CAN_ConfigFilter(&hcan1, &canFilter);if(result!=HAL_OK){return result;}//设置FIFO1的筛选器canFilter.FilterBank=1;canFilter.FilterIdHigh =0x0000;canFilter.FilterIdLow = 0x0000;canFilter.FilterMaskIdHigh = 0x0000;canFilter.FilterMaskIdLow = 0x0000;canFilter.FilterFIFOAssignment=CAN_FILTER_FIFO1;result = HAL_CAN_ConfigFilter(&hcan1, &canFilter);return result;
}
void CAN_SendMsg(uint8_t msgID, uint8_t frameType)
{CAN_TxHeaderTypeDef TxHeader;TxHeader.StdId=msgID;TxHeader.RTR=frameType;TxHeader.IDE=CAN_ID_STD;TxHeader.DLC = 4;TxHeader.TransmitGlobalTime =DISABLE;uint32_t random32bit;HAL_RNG_GenerateRandomNumber(&hrng,&random32bit);uint8_t txData[8];txData[0]= random32bit & 0x000000FF;txData[1]=(random32bit & 0x0000FF00)>>8;txData[2]=(random32bit & 0x00FF0000)>>16;txData[3]=(random32bit & 0xFF000000)>>24;while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan1)<1){}printf("Send MsgID = %d \r\n",msgID);uint32_t TxMailbox;if(HAL_CAN_AddTxMessage(&hcan1, &TxHeader, txData, &TxMailbox)!=HAL_OK){printf("Send to mailbox error \r\n");return ;}
}
void CAN_ReadMsg(uint32_t FIFO_num)
{CAN_RxHeaderTypeDef RxHeader;uint8_t RxData[8];if(FIFO_num == CAN_RX_FIFO0){printf("Message received by FIFO0 \r\n");if(HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, RxData)!=HAL_OK){printf("Read FIFO0 error \r\n");return ;}}else if(FIFO_num == CAN_RX_FIFO1){printf("Message received by FIFO1 \r\n");if(HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO1, &RxHeader, RxData)!=HAL_OK){printf("Read FIFO1 error \r\n");return ;}}printf("StdID=%ld \r\n",RxHeader.StdId);printf("RTR(0=Data,2=Remote)=%ld \r\n",RxHeader.RTR);printf("IDE(0=Std,4=Ext)=%ld \r\n",RxHeader.IDE);printf("DLC(Data Length)=%ld \r\n",RxHeader.DLC);printf("Data = %02X %02X %02X %02X \r\n",RxData[0],RxData[1],RxData[2],RxData[3]);
}
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{CAN_ReadMsg(CAN_RX_FIFO0);
}void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan)
{CAN_ReadMsg(CAN_RX_FIFO1);
}
相关文章:
STM32CubeIDE(CAN)
目录 一、概念 1、简述 2、CAN 的几种模式 二、实践 1、环回模式轮询通信 1.1 软件配置 1.2 代码编写 2、环回模式中断通信 2.1 软件配置 2.2 代码编写 一、概念 1、简述 STM32微控制器系列包含多个型号,其中一些型号集成了CAN(Controller Are…...
GO Channel使用详解(各种场景下的最佳实践)
GO Channel使用详解(各种场景下的最佳实践) 一个知识点:通过反射的方式执行 select 语句,在处理很多的 case clause,尤其是不定长的 case clause 的时候,非常有用。而且,在后面介绍任务编排的实现时,我也会采用这种方法,所以,我先带你具体学习下 Channel 的反射用法…...
SwiftUI 5.0(iOS 17)滚动视图的滚动目标行为(Target Behavior)解惑和实战
概览 在 SwiftUI 的开发过程中我们常说:“屏幕不够,滚动来凑”。可见滚动视图对于超长内容的呈现有着多么秉轴持钧的重要作用。 这不,从 SwiftUI 5.0(iOS 17)开始苹果又为滚动视图增加了全新的功能。但是官方的示例可…...
picker 构建记录
picker 构建记录 tomlinuxtom:~/openverify/picker$ cd picker bash: cd: picker: 没有那个文件或目录 tomlinuxtom:~/openverify/picker$ export BUILD_XSPCOMM_SWIGpython tomlinuxtom:~/openverify/picker$ make rm -rf temp build /home/tom/Tools/verible-v0.0-3724/bin/…...
Docker部署kafka,Docker所在宿主机以外主机访问
# 安装启动zookeeper docker run -d --name zookeeper --publish 2181:2181 --volume /etc/localtime:/etc/localtime zookeeper:latest --network 指定的网络 -p:设置映射端口(默认2181) -d:后台启动 # 启动kafka docker run -d…...
控制欲过强的Linux小进程
控制欲强?视奸?普通人那才叫视奸,您是皇帝,天下大事无一逃过您的耳目,您想看什么就看什么,臣怀疑他在朋友圈私养兵士,囤积枪甲,蓄意谋反,图谋皇位啊! 哈哈哈哈开个玩笑&…...
探讨元宇宙和VR虚拟现实之间的区别
在数字时代,人们对虚拟现实的兴趣与日俱增。在虚拟现实技术的推动下,出现了两个概念:元宇宙和VR虚拟现实。虽然这两个概念都与虚拟现实有关,但它们有着不同的特点和用途。在本文中,我们将探讨元宇宙和VR虚拟现实之间的…...
Docker Desktop安装
0 Preface/Foreward 1 安装 1.1 运行docker安装包 安装完Docker Desktop后,运行Docker Desktop,出现WSL 2安装不完整情况,具体情况如下: 解决方法:旧版 WSL 的手动安装步骤 | Microsoft Learn 也可以直接下载新的安…...
《Towards Black-Box Membership Inference Attack for Diffusion Models》论文笔记
《Towards Black-Box Membership Inference Attack for Diffusion Models》 Abstract 识别艺术品是否用于训练扩散模型的挑战,重点是人工智能生成的艺术品中的成员推断攻击——copyright protection不需要访问内部模型组件的新型黑盒攻击方法展示了在评估 DALL-E …...
vscode调试nextjs前端后端程序、nextjs api接口
最近有一个项目使用了nextjs框架,并且使用nextjs同时实现了前后端,由于之前前后端都是分离的,前端的调试可以通过在代码种添加debugger或者直接在浏览器中打断点实现,现在想调试后端接口,前面的方式就不适用了。故研究…...
《SeTformer Is What You Need for Vision and Language》
会议:AAAI 年份:2024 论文:DDAE: Towards Deep Dynamic Vision BERT Pretraining - AMinerhttps://www.aminer.cn/pub/6602613613fb2c6cf6c387c2/ddae-towards-deep-dynamic-vision-bert-pretraining 摘要 这篇论文介绍了一种新型的变换器…...
[保姆级教程]uniapp安装使用uViewUI教程
文章目录 创建 UniApp 项目下载uView UI下载安装方式步骤 1: 安装 uView UI步骤 2: 查看uView UI是否下载成功步骤 3: 引入 uView 主 JS 库步骤 4: 引入 uView 的全局 SCSS 主题文件步骤 5: 引入 uView 基础样式步骤 6: 配置 easycom 组件模式注意事项 NPM方式步骤 1: 安装 uVi…...
网络安全法规对企业做等保有哪些具体规定?
网络安全法规对企业做等保的具体规定 根据《中华人民共和国网络安全法》,企业作为网络运营者,需要履行网络安全等级保护制度的相关义务,确保网络安全和数据保护。具体规定包括: 网络安全等级保护制度:企业应根据网络安…...
Java开发中超好用Orika属性映射工具
Orika属性映射工具 引入pom依赖 <dependency><groupId>ma.glasnost.orika</groupId><artifactId>orika-core</artifactId><version>1.5.4</version></dependency>上干货 封装的工具类:OriUtilsimport ma.glasnost.orika.Map…...
qt初入门8:下拉框,输入框模糊查询,提示简单了解 (借助QCompleter)
实现一个简单的模糊查询的逻辑,输入框能提示相关项。 主要借助qt的QCompleter 类( Qt 框架中提供的一个用于自动补全和模糊搜索的类),结合一些控件,比如QComboBox和QLineEdit,实现模糊查询的功能。 1&…...
【qt】VS中如何配置Qt环境
https://download.qt.io/official_releases/vsaddin/ 首先需要下载一下vsaddin,上面的是下载的网站. 下载的时候可能会出现下图的情况 说明你下的vsaddin和您的VS版本不匹配,所以你可以多下几个其他版本的vsAddin,一般都是和你VS版本相匹配的才可以,如Vs2022,那就试试vsaddin2…...
对于相同网段的IP,部分无法ping通问题
现象1:在Linux上执行 ping 192.168.1.232,无法ping通 分析1:使用ifconfig查询,联网使用eth0口,只能上网192.168.10.xx网段,需要增加网段 解决方法:使用ip addr 查询,本身只具备10网…...
Unity发布XR中用于worldbuilding的全新电子书
通过身临其境的虚拟领域开始旅程,在维度之间传送,或将数字奇迹与现实世界融合——虚拟现实(VR)和混合现实(MR)的千万种可能性将邀请创作者把他们的想象力带入生活。 Unity发布的最新版综合指南将帮助有抱负的创作者和经验丰富的开发者深入研究和理解构建…...
Vue3相比于Vue2进行了哪些更新
1、响应式原理 vue2 vue2中采用 defineProperty 来劫持整个对象,然后进行深度遍历所有属性,给每个属性添加getter和setter,结合发布订阅模式实现响应式。 存在的问题: 检测不到对象属性的添加和删除数组API方法无法监听到需要对…...
Unity UGUI 之 Slider
本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 1.Slider是什么 滑块,由三部分组成:背景 填充条 手柄 填充条就是…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
起重机起升机构的安全装置有哪些?
起重机起升机构的安全装置是保障吊装作业安全的关键部件,主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理: 一、超载保护装置(核心安全装置) 1. 起重量限制器 功能:实时监测起升载荷&a…...
