当前位置: 首页 > news >正文

STM32 CAN使用记录:FDCAN基础通讯

文章目录

  • 目的
  • 关键配置与代码
    • 轮询方式
    • 中断方式
    • 收发测试
  • 示例链接
  • 总结

目的

CAN是非常常用的一种数据总线,被广泛用在各种车辆系统中。这篇文章将对STM32中FDCAN的使用做个示例。

CAN的一些基础介绍与使用可以参考下面文章:
《CAN基础概念》https://blog.csdn.net/Naisu_kun/article/details/132814079
《STM32 CAN使用记录:bxCAN基础通讯》https://blog.csdn.net/Naisu_kun/article/details/132830073

本文使用STM32H750作为主控芯片,PD0设置为FDCAN1_RXPD1设置为FDCAN1_TX 。本文使用使用STM32CubeIDE进行开发。

关键配置与代码

轮询方式

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

除了默认生成的代码只需在 main.c 中手动添加一些代码即可:

#include "main.h"FDCAN_HandleTypeDef hfdcan1;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_FDCAN1_Init(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_FDCAN1_Init();/**************** 以下为过滤器设置 ****************/FDCAN_FilterTypeDef sFilterConfig;// 下面这组设置只接受标准帧ID为0x666的消息sFilterConfig.IdType = FDCAN_STANDARD_ID;sFilterConfig.FilterIndex = 0;sFilterConfig.FilterType = FDCAN_FILTER_MASK;sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;sFilterConfig.FilterID1 = 0x666;sFilterConfig.FilterID2 = 0x7FF;sFilterConfig.RxBufferIndex = 0;HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig);// 下面这组设置只接受扩展ID为0x233和0x2233的消息sFilterConfig.IdType = FDCAN_EXTENDED_ID;sFilterConfig.FilterIndex = 0;sFilterConfig.FilterType = FDCAN_FILTER_MASK;sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;sFilterConfig.FilterID1 = 0x00002233;sFilterConfig.FilterID2 = 0x1FFFDFFF;sFilterConfig.RxBufferIndex = 0;HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig);// 默认情况下,如果未配置全局过滤器,则会接收所有不匹配的帧并将其重定向到RxFIFO0// 后面四个参数分别 拒绝未匹配的标准数据帧 拒绝未匹配的扩展数据帧 拒绝标准远程帧 拒绝扩展远程帧HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_REJECT_REMOTE, FDCAN_REJECT_REMOTE);/**************** 以下为启动CAN外设 ****************/HAL_FDCAN_Start(&hfdcan1);while (1){/**************** 以下为接收消息并回发处理 ****************/if(HAL_FDCAN_GetRxFifoFillLevel(&hfdcan1, FDCAN_RX_FIFO0) != 0) // 接收队列不为0,有数据可读{FDCAN_RxHeaderTypeDef   RxHeader; // 用来保存接收到的数据帧头部信息uint8_t                 RxData[64]; // 用来保存接收数据端数据if(HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &RxHeader, RxData) == HAL_OK) // 从接收队列中读取数据帧{FDCAN_TxHeaderTypeDef   TxHeader = {0}; // 用来保存发送数据帧头部信息uint8_t                 TxData[64]; // 用来保存发送数据帧数据TxHeader.Identifier = RxHeader.Identifier;TxHeader.IdType = RxHeader.IdType; // 标准-FDCAN_STANDARD_ID; 扩展-FDCAN_EXTENDED_IDTxHeader.TxFrameType = RxHeader.RxFrameType; // 数据帧-FDCAN_DATA_FRAME; 远程帧-FDCAN_REMOTE_FRAMETxHeader.DataLength = RxHeader.DataLength; // FDCAN_DLC_BYTES_xx// xx = 0 1 2 3 4 5 6 7 8 12 16 20 24 32 48 64TxHeader.ErrorStateIndicator = RxHeader.ErrorStateIndicator; // FDCAN_ESI_ACTIVE FDCAN_ESI_PASSIVETxHeader.BitRateSwitch = RxHeader.BitRateSwitch; // 波特率不可变-FDCAN_BRS_OFF; 波特率可变-FDCAN_BRS_ONTxHeader.FDFormat = RxHeader.FDFormat; // 经典CAN-FDCAN_CLASSIC_CAN; CANFD-FDCAN_FD_CAN// TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;// TxHeader.MessageMarker = 0;for(int i=0; i<64; i++){TxData[i] = RxData[i];}while(HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) == 0); // 等待有发送邮箱可用HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); // 发送数据帧}}}
}

中断方式

在这里插入图片描述

除了默认生成的代码只需在 main.c 中手动添加一些代码即可:

#include "main.h"FDCAN_HandleTypeDef hfdcan1;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_FDCAN1_Init(void);/**************** 以下为重写中断回调函数 ****************/
// Fifo0收到消息回调
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{if (hfdcan == &hfdcan1) // 判断是hfdcan1的中断{if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET) // 判断是FIFO0_NEW_MESSAGE回调{FDCAN_RxHeaderTypeDef   RxHeader; // 用来保存接收到的数据帧头部信息uint8_t                 RxData[64]; // 用来保存接收数据端数据if(HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &RxHeader, RxData) == HAL_OK) // 从接收队列中读取数据帧{FDCAN_TxHeaderTypeDef   TxHeader = {0}; // 用来保存发送数据帧头部信息uint8_t                 TxData[64]; // 用来保存发送数据帧数据TxHeader.Identifier = RxHeader.Identifier;TxHeader.IdType = RxHeader.IdType; // 标准-FDCAN_STANDARD_ID; 扩展-FDCAN_EXTENDED_IDTxHeader.TxFrameType = RxHeader.RxFrameType; // 数据帧-FDCAN_DATA_FRAME; 远程帧-FDCAN_REMOTE_FRAMETxHeader.DataLength = RxHeader.DataLength; // FDCAN_DLC_BYTES_xx// xx = 0 1 2 3 4 5 6 7 8 12 16 20 24 32 48 64TxHeader.ErrorStateIndicator = RxHeader.ErrorStateIndicator; // FDCAN_ESI_ACTIVE FDCAN_ESI_PASSIVETxHeader.BitRateSwitch = RxHeader.BitRateSwitch; // 波特率不可变-FDCAN_BRS_OFF; 波特率可变-FDCAN_BRS_ONTxHeader.FDFormat = RxHeader.FDFormat; // 经典CAN-FDCAN_CLASSIC_CAN; CANFD-FDCAN_FD_CAN// TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;// TxHeader.MessageMarker = 0;for(int i=0; i<64; i++){TxData[i] = RxData[i];}while(HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) == 0); // 等待有发送邮箱可用HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); // 发送数据帧}}}
}int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_FDCAN1_Init();/**************** 以下为过滤器设置 ****************/FDCAN_FilterTypeDef sFilterConfig;// 下面这组设置只接受标准帧ID为0x666的消息sFilterConfig.IdType = FDCAN_STANDARD_ID;sFilterConfig.FilterIndex = 0;sFilterConfig.FilterType = FDCAN_FILTER_MASK;sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;sFilterConfig.FilterID1 = 0x666;sFilterConfig.FilterID2 = 0x7FF;sFilterConfig.RxBufferIndex = 0;HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig);// 下面这组设置只接受扩展ID为0x233和0x2233的消息sFilterConfig.IdType = FDCAN_EXTENDED_ID;sFilterConfig.FilterIndex = 0;sFilterConfig.FilterType = FDCAN_FILTER_MASK;sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;sFilterConfig.FilterID1 = 0x00002233;sFilterConfig.FilterID2 = 0x1FFFDFFF;sFilterConfig.RxBufferIndex = 0;HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig);// 默认情况下,如果未配置全局过滤器,则会接收所有不匹配的帧并将其重定向到RxFIFO0// 后面四个参数分别 拒绝未匹配的标准数据帧 拒绝未匹配的扩展数据帧 拒绝标准远程帧 拒绝扩展远程帧HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_REJECT_REMOTE, FDCAN_REJECT_REMOTE);/**************** 以下为启动中断 ****************/HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); // 使能FIFO0数据接收中断/**************** 以下为启动CAN外设 ****************/HAL_FDCAN_Start(&hfdcan1);while (1){}
}

收发测试

本示例演示结果可以通过各种CAN工具配合上位机软件进行测试:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

示例链接

仓库地址: https://github.com/NaisuXu/STM32_MCU_Examples

本文中的示例位于仓库中 FDCAN_RxTxPoll_H750FDCAN_RxTxIT_H750

总结

STM32中使用FDCAN并不复杂,进行配置生成代码后只需要设置过滤器,然后就可以收发数据了。

相关文章:

STM32 CAN使用记录:FDCAN基础通讯

文章目录 目的关键配置与代码轮询方式中断方式收发测试 示例链接总结 目的 CAN是非常常用的一种数据总线&#xff0c;被广泛用在各种车辆系统中。这篇文章将对STM32中FDCAN的使用做个示例。 CAN的一些基础介绍与使用可以参考下面文章&#xff1a; 《CAN基础概念》https://blo…...

GB/T 11945-2019 蒸压灰砂实心砖和实心砌块检测

蒸压灰砂砖是以砂、石灰为主要原料&#xff0c;经坯料制备&#xff0c;压制成型、蒸压养护而成的实心砖&#xff0c;简称灰砂砖&#xff0c;具有良好的耐久性能和强度。 GB/T 11945-2019蒸压灰砂实心砖和实心砌块检测&#xff1a; 测试要求 测试标准 抗压强度 GB/T 2542 GB…...

echarts静态饼图

<div class"cake"><div id"cakeChart"></div></div> import * as echarts from "echarts";mounted() {this.$nextTick(() > {this.getCakeEcharts()})},methods: {// 饼状图getCakeEcharts() {let cakeChart echart…...

Linux中的apt与yum

Linux中的apt与yum apt和yum区别 apt和yum执行流程 apt和yum区别 apt 和 yum 是两种不同的包管理工具&#xff0c;用于在 Linux 操作系统中安装、升级和删除软件包。它们主要用于不同的 Linux 发行版。 命令适用系统aptUbuntu、DebianyumCentOS、Redhat 也就是说&#xff0…...

DQN算法概述及基于Pytorch的DQN迷宫实战代码

一. DQN算法概述 1.1 算法定义 Q-Learing是在一个表格中存储动作对应的奖励值&#xff0c;即状态-价值函数Q(s,a)&#xff0c;这种算法存在很大的局限性。在现实中很多情况下&#xff0c;强化学习任务所面临的状态空间是连续的&#xff0c;存在无穷多个状态&#xff0c;这种情…...

Pytorch学习整理笔记(一)

文章目录 数据处理DatasetTensorboard使用Transformstorchvision数据集使用DataLoader使用nn.Module的使用神经网络 数据处理Dataset 主要是对Dataset的使用&#xff1a; 继承 Dataset实现init方法&#xff0c;主要是进行一些全局变量的定义&#xff0c;在对其初始化时需要赋…...

paddlespeech asr脚本demo

概述 paddlespeech是百度飞桨平台的开源工具包&#xff0c;主要用于语音和音频的分析处理&#xff0c;其中包含多个可选模型&#xff0c;提供语音识别、语音合成、说话人验证、关键词识别、音频分类和语音翻译等功能。 本文介绍利用ps中的asr功能实现批量处理音频文件的demo。…...

算法分析与设计编程题 递归与分治策略

棋盘覆盖 题目描述 解题代码 // para: 棋盘&#xff0c;行偏移&#xff0c;列偏移&#xff0c;特殊行&#xff0c;特殊列 void dividedCovering(vector<vector<int>>& chessBoard, int dr, int dc, int sr, int sc, int size) {if (size 1) return;size / 2…...

Java的XWPFTemplate工具类导出word.docx的使用

依赖 <!-- word导出 --><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.7.3</version></dependency><!-- 上面需要的依赖--><dependency><groupId>org.ap…...

Science adv | 转录因子SPIC连接胚胎干细胞中的细胞代谢与表观调控

代谢是生化反应网络的结果&#xff0c;这些反应吸收营养物质并对其进行处理&#xff0c;以满足细胞的需求&#xff0c;包括能量产生和生物合成。反应的中间体被用作各种表观基因组修饰酶的底物和辅助因子&#xff0c;因此代谢与表观遗传密切相关。代谢结合表观遗传涉及疾病&…...

机器学习实战-系列教程7:SVM分类实战2线性SVM(鸢尾花数据集/软间隔/线性SVM/非线性SVM/scikit-learn框架)项目实战、代码解读

&#x1f308;&#x1f308;&#x1f308;机器学习 实战系列 总目录 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 SVM分类实战1之简单SVM分类 SVM分类实战2线性SVM SVM分类实战3非线性SVM 3、不同软间隔C值 3.1 数据标准化的影响 如图左边是没…...

DOM渲染与优化 - CSS、JS、DOM解析和渲染阻塞问题

文章目录 DOM渲染面试题DOM的渲染过程DOM渲染的时机与渲染进程的概述浏览器的渲染流程1. 解析HTML生成DOM树&#xff1a;遇到<img>标签加载图片2. 解析CSS生成CSSOM(CSS Object Model): 遇见背景图片链接不加载3. 将DOM树和CSSOM树合并生成渲染树&#xff1a;加载可视节点…...

基于小程序的理发店预约系统

一、项目背景及简介 现在很多的地方都在使用计算机开发的各种管理系统来提高工作的效率&#xff0c;给人们带来很多的方便。计算机技术从很大的程度上解放了人们的双手&#xff0c;并扩大了人们的活动范围&#xff0c;是人们足不出户就可以通过电脑进行各种事情的管理。信息系…...

MD5 算法流程

先通过下面的命令对 md5算法有个感性的认识&#xff1a; $ md5sum /tmp/1.txt 1dc792fcaf345a07b10248a387cc2718 /tmp/1.txt$ md5sum // 从键盘输入&#xff0c;ctrl-d 结束输入 hello, world! 910c8bc73110b0cd1bc5d2bcae782511 -从上面可以看到&#xff0c;一个文件或一…...

TCP/IP协议详解

TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;传输控制协议/互联网协议&#xff09;是互联网的基本协议&#xff0c;也是国际互联网络的基础。 TCP/IP 不是指一个协议&#xff0c;也不是 TCP 和 IP 这两个协议的合称&#xff0c;而是一个协…...

SSM SpringBoot vue快递柜管理系统

SSM SpringBoot vue快递柜管理系统 系统功能 登录 注册 个人中心 快递员管理 用户信息管理 用户寄件管理 配送信息管理 寄存信息管理 开发环境和技术 开发语言&#xff1a;Java 使用框架: SSM(Spring SpringMVC Mybaits)或SpringBoot 前端: vue 数据库&#xff1a;Mys…...

期权交易保证金比例一般是多少?

期权交易是一种非常受欢迎的投资方式之一&#xff0c;它为期权市场带来了更为多样化和灵活化的交易形式。而其中的期权卖方保证金比例是期权交易中的一个重要指标&#xff0c;直接关系到投资者的风险与收益&#xff0c;下文介绍期权交易保证金比例一般是多少&#xff1f;本文来…...

029:vue项目,勾选后今天不再弹窗提示

第029个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…...

Unet语义分割-语义分割与实例分割概述-001

文章目录 前言1、图像分割和图像识别1.语义分割2.实例分割 2、分割任务中的目标函数定义3.IOU 前言 大纲目录 1、图像分割和图像识别 下面是图像识别和图像分割的区别&#xff0c;图像识别就是识别出来&#xff0c;画个框&#xff0c;右边的是图像分割。 1.语义分割 两张图把…...

Linux常用命令字典篇

Linux命令 1. 翻页查看文件 less [-N] 文件名&#xff1a;可以向后翻页&#xff0c;也可以向前翻页&#xff0c;-N表示显示行号 more 文件名&#xff1a;仅可以向后翻页 2. 端口占用信息查看 netstat -tunlp | grep 端口号&#xff1a;查看端口号对应的信息 lsof i: 端口号…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...