STM32G431收发CAN

1.硬件连接

PB8作为CAN_RX,PB9作为CAN_TX,连接一个CAN收发器TJA1051T/3
在这里插入图片描述

2. CubeMX里配置CAN

在这里插入图片描述
在这里插入图片描述
设置连接FDCAN1的参数,使用1个标准过滤器,波特率位500K
在这里插入图片描述
使能FDCAN1的中断

3 自动生成代码

3.1 初始化

static void MX_FDCAN1_Init(void)
{/* USER CODE BEGIN FDCAN1_Init 0 */__HAL_RCC_FDCAN_CLK_ENABLE();/* USER CODE END FDCAN1_Init 0 *//* USER CODE BEGIN FDCAN1_Init 1 *//* USER CODE END FDCAN1_Init 1 */hfdcan1.Instance = FDCAN1;hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV2;hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;hfdcan1.Init.AutoRetransmission = DISABLE;hfdcan1.Init.TransmitPause = DISABLE;hfdcan1.Init.ProtocolException = DISABLE;hfdcan1.Init.NominalPrescaler = 2;hfdcan1.Init.NominalSyncJumpWidth = 1;hfdcan1.Init.NominalTimeSeg1 = 14;hfdcan1.Init.NominalTimeSeg2 = 3;hfdcan1.Init.DataPrescaler = 1;hfdcan1.Init.DataSyncJumpWidth = 1;hfdcan1.Init.DataTimeSeg1 = 1;hfdcan1.Init.DataTimeSeg2 = 1;hfdcan1.Init.StdFiltersNbr = 1;hfdcan1.Init.ExtFiltersNbr = 0;hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN FDCAN1_Init 2 */CAN_SetFilter();HAL_FDCAN_Start(&hfdcan1);// Activate notificationsHAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_FIFO_EMPTY,0);HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);/* USER CODE END FDCAN1_Init 2 */}

手工增加:

  • FDCAN时钟使能 __HAL_RCC_FDCAN_CLK_ENABLE();
  • 过滤器设置 CAN_SetFilter();
  • 激活中断信号,发送完成和FIFO0收到新消息
  • 启动 HAL_FDCAN_Start(&hfdcan1);

3.2 过滤器设置

/* USER CODE BEGIN 4 */
void CAN_SetFilter()
{FDCAN_FilterTypeDef sFilterConfig;// 初始化过滤器配置结构sFilterConfig.IdType=FDCAN_STANDARD_ID;sFilterConfig.FilterIndex=0;sFilterConfig.FilterType=FDCAN_FILTER_DUAL;sFilterConfig.FilterConfig=FDCAN_FILTER_TO_RXFIFO0;sFilterConfig.FilterID1=0x11;sFilterConfig.FilterID2=0x22;if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK){// 处理错误Error_Handler();}//全局过滤器设置,如果包含上述条件的帧则通过HAL_FDCAN_ConfigGlobalFilter(&hfdcan1,FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE);
}
  • 采用一个标准过滤器,过滤器号:0, 过滤类型FDCAN_FILTER_DUAL,就是把FilterID1和FilterID2当成2个CAN ID,过滤器配置为FDCAN_FILTER_TO_RXFIFO0,即把那两个CANID的消息存入RX FIFO0
  • 记得进行全局过滤设置,其函数原型如下:
  • 在这里插入图片描述
    本例中拒绝不匹配的标准帧,拒绝不匹配的扩展帧,接收过滤后的标准远程帧,接收过滤后的扩展远程帧。

3.3 中断处理

void FDCAN1_IT0_IRQHandler(void)
{/* USER CODE BEGIN FDCAN1_IT0_IRQn 0 */CAN_Rcv_IR();/* USER CODE END FDCAN1_IT0_IRQn 0 */HAL_FDCAN_IRQHandler(&hfdcan1);/* USER CODE BEGIN FDCAN1_IT0_IRQn 1 *//* USER CODE END FDCAN1_IT0_IRQn 1 */
}

加入接收中断处理函数:CAN_Rcv_IR();

void CAN_Rcv_IR()
{if (__HAL_FDCAN_GET_FLAG(&hfdcan1, FDCAN_FLAG_RX_FIFO0_NEW_MESSAGE)){	       FDCAN_RxHeaderTypeDef pHeader;uint8_t pData[64];// 循环处理新消息while (HAL_FDCAN_GetRxFifoFillLevel(&hfdcan1,FDCAN_RX_FIFO0 ) > 0){// 从Rx FIFO 0中读取消�?if(HAL_FDCAN_GetRxMessage(&hfdcan1,FDCAN_RX_FIFO0 ,&pHeader,pData)== HAL_OK){TxData[4]=pHeader.RxTimestamp & 0xFF;TxData[5]=pHeader.DataLength & 0xFF;TxData[6]=pHeader.Identifier & 0xFF;TxData[7]=pData[0];counter++;CAN_Send();}else{// 处理读取消息时的错误Error_Handler();}}// 清除Rx FIFO 0新消息标志__HAL_FDCAN_CLEAR_FLAG(&hfdcan1, FDCAN_FLAG_RX_FIFO0_NEW_MESSAGE);}
}

如果检测到FIFO0新消息标志:FDCAN_FLAG_RX_FIFO0_NEW_MESSAGE
则循环处理FIFO0中的消息

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计心得——流程图和数据流图绘制

一、流程图和数据流图 在软件开发中,画流程图和数据流图可以说是几乎每个人都会遇到。 1、数据流(程)图 Data Flow Diagram,DFG。它可以称为数据流图或数据流程图。其主要用来描述系统中数据流程的一种图形工具,可以将…

普及组集训数据结构--并查集

P1551 亲戚 - 洛谷 | 计算机科学教育新生态 并查集就是把所有相关联的量串成一串珠子,抽象来说就是: 把此类相关联的量当作节点,两个节点之间连接一条无向边,所形成的图 例题算法流程: 在此定义“族长”就是一个树的…

路由基本配置实验

路由器用于实现不同类型网络之间的互联。 路由器转发ip分组的基础是路由表。 路由表中的路由项分为直连路由项、静态路由项和动态路由项。 通过配置路由器接口的ip地址和子网掩码自动生成直连路由项。 通过手工配置创建静态路由项。 热备份路由器协议允许将由多个路由器组…

17爬虫:关于DrissionPage相关内容的学习01

概述 前面我们已经大致了解了selenium的用法,DerssionPage同selenium一样,也是一个基于Python的网页自动化工具。 DrissionPage既可以实现网页的自动化操作,也能够实现收发数据包,也可以把两者的功能合二为一。 DressionPage的…

计算机网络•自顶向下方法:网络层介绍、路由器的组成

网络层介绍 网络层服务:网络层为传输层提供主机到主机的通信服务 每一台主机和路由器都运行网络层协议 发送终端:将传输层报文段封装到网络层分组中,发送给边缘路由器路由器:将分组从输入链路转发到输出链路接收终端&#xff1…

下载linux aarch64版本的htop

htop代码网站似乎没有编译好的各平台的包,而自己编译需要下载一些工具,比较麻烦。这里找到了快速下载和使用的方法,记录一下。 先在linux电脑上执行: mkdir htop_exe cd htop_exe apt download htop:arm64 # 会直接下载到当前目…

呼叫中心中间件实现IVR进入排队,判断排队超时播放提示音

文章目录 [TOC](文章目录) 前言需求排队结束原因 联系我们实现步骤1. 调用http接口返回动作2. 启用拨号方案 前言 需求 呼叫中心需要实现调用IVR接口进入排队,如果是因为等待超时导致退出排队的,那就播放一段提示音再挂断通话;其他的情况就…

如何二次封装组件(vue3版本)

在开发 Vue 项目中我们一般使用第三方组件库进行开发,如 Element-Plus, 但是这些组件库提供的组件并不一定满足我们的需求,这时我们可以通过对组件库的组件进行二次封装,来满足我们特殊的需求。 对于封装组件有一个大原则就是我们应该尽量保…

【74HC192减法24/20/72进制】2022-5-17

缘由用74ls192设计一个72进制的减法计数器,需要有逻辑电路图-硬件开发-CSDN问答

Fastapi项目通过Jenkins2.4.91自动化构建部署到Nginx1.20进行访问详细方法(完全自动化部署亲测可用)

这篇技术文章需要结合我写的前两篇文章来一起看Gitlab17.7Jenkins2.4.91实现Fastapi/Django项目持续发布版本详细操作(亲测可用) 和 Pycharm2024.3Gitlab.17.7本地化部署和自动提交代码使用方法(亲测可用),总体来说是三部曲。这篇文章详细解读…

iOS 11 中的 HEIF 图像格式 - 您需要了解的内容

HEIF,也称为高效图像格式,是iOS 11 之后发布的新图像格式,以能够在不压缩图像质量的情况下以较小尺寸保存照片而闻名。换句话说,HEIF 图像格式可以具有相同或更好的照片质量,同时比 JPEG、PNG、GIF、TIFF 占用更少的设…

DATACOM-DHCP-复习-实验

DHCP 概述工作原理DHCP分配机制 配置配置基于全局地址池的DHCP服务器配置DHCP Relay中继验证 实验配置DHCP中继 参考 概述 动态主机配置协议DHCP(Dynamic Host Configuration Protocol)是一种网络管理协议,用于集中对用户IP地址进行动态管理和…

深入浅出 Beam Search:自然语言处理中的高效搜索利器

Beam Search 技术详解 搜索系列相关文章(置顶) 1.原始信息再加工:一文读懂倒排索引 2.慧眼识词:解析TF-IDF工作原理 3.超越TF-IDF:信息检索之BM25 4.深入浅出 Beam Search:自然语言处理中的高效搜索利器 1…

二、CSS基础

一、选择器(1) 大白话:我们人为认为的解析方式是,从左往右查找,对于浏览器来说,是从右往左查找,解析速度更高。 注: 伪类选择器 - 作用于实际存在的元素,用于描述元素的某种特定状态或关系&…

从摩托罗拉手机打印短信的简单方法

昨天我试图从摩托罗拉智能手机上打印短信,但当我通过USB将手机连接到电脑时,我在电脑上找不到它们。由于我的手机内存已达到限制,并且我想保留短信的纸质版本,您能帮我将短信从摩托罗拉手机导出到计算机吗? 如您所知&…

Linux终端输入删除键backspace显示^H,输入上下左右键显示^A^B^C^D原理以及详细解决办法!

当我们装完Linux系统之后,我们可能会碰到按下删除键后出现^H这种情况。 同样,输入上下左右键显示^A^B^C^D这种情况。 这是为什么呢? 别急,后面我会说具体解决办法,先来看看这是为什么? 一、终端程序架构 首先,我们需要了解终端程序架构。 终端程序架构分为三层,分别…

ESP32 I2S音频总线学习笔记(一):初识I2S通信与配置基础

文章目录 简介为什么需要I2S?关于音频信号采样率分辨率音频声道 怎样使用I2S传输音频?位时钟BCLK字时钟WS串行数据SD I2S传输模型I2S通信格式I2S格式左对齐格式右对齐格式 i2s基本配置i2s 底层API加载I2S驱动设置I2S使用的引脚I2S读取数据I2S发送数据卸载…

JAVA:利用 Redis 实现每周热评的技术指南

1、简述 在现代应用中,尤其是社交媒体和内容平台,展示热门评论是常见的功能。我们可以通过 Redis 的高性能和丰富的数据结构,轻松实现每周热评功能。本文将详细介绍如何利用 Redis 实现每周热评,并列出完整的实现代码。 2、需求分…

vscode代码AI插件Continue 安装与使用

“Continue” 是一款强大的插件,它主要用于在开发过程中提供智能的代码延续功能。例如,当你在编写代码并且需要进行下一步操作或者完成一个代码块时,它能够根据代码的上下文、语法规则以及相关的库和框架知识,为你提供可能的代码续…

kafka开机自启失败问题处理

前言:在当今大数据处理领域,Kafka 作为一款高性能、分布式的消息队列系统,发挥着举足轻重的作用。无论是海量数据的实时传输,还是复杂系统间的解耦通信,Kafka 都能轻松应对。然而,在实际部署和运维 Kafka 的…