使用STM32CubeMX对STM32F4的CAN1/2/3配置及接收中断开启

news2025/4/7 0:27:51

目录

  • 1. CAN配置
    • 1.1引脚(STM32F413VGT6-LQFP100)
    • 1.2 时钟
    • 1.3 RCC配置
    • 1.4 CAN1配置
    • 1.5 CAN2配置
    • 1.6 CAN3配置
    • 1.7 输出设置
  • 2. CAN代码
    • 2.1 CAN初始化
    • 2.2 CAN滤波器设置
    • 2.3 CAN使能
    • 2.4 激活中断
    • 2.5 CAN发送函数
    • 2.6 CAN回调函数
    • 2.7 main之后的代码

1. CAN配置

1.1引脚(STM32F413VGT6-LQFP100)

在这里插入图片描述

1.2 时钟

外部使用8MHz晶振
开启内部16MHz晶振
使用锁相环
最大100MHz,3路CAN时钟挂载于APB1时钟上,频率50MHz

在这里插入图片描述
.
.

1.3 RCC配置

在这里插入图片描述
.
.

1.4 CAN1配置

波特率计算:
500K = 50MHz / (5+4+1)*10 ;(10、5、4、1在下图中有介绍)。
在这里插入图片描述
.
.
接收中断全部开启:

在这里插入图片描述

1.5 CAN2配置

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

1.6 CAN3配置

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

1.7 输出设置

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

2. CAN代码

2.1 CAN初始化

这里只改了void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)的这个部分

else if(canHandle->Instance==CAN2)
  {
  /* USER CODE BEGIN CAN2_MspInit 0 */

  /* USER CODE END CAN2_MspInit 0 */
    /* CAN2 clock enable */
	__HAL_RCC_CAN1_CLK_ENABLE(); //只增加的部分
    __HAL_RCC_CAN2_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**CAN2 GPIO Configuration
    PB12     ------> CAN2_RX
    PB13     ------> CAN2_TX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF9_CAN2;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    /* CAN2 interrupt Init */
		HAL_NVIC_SetPriority(CAN2_RX0_IRQn, 0, 0);
		
    //HAL_NVIC_SetPriority(CAN2_RX0_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(CAN2_RX0_IRQn);
    HAL_NVIC_SetPriority(CAN2_RX1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(CAN2_RX1_IRQn);
  /* USER CODE BEGIN CAN2_MspInit 1 */

  /* USER CODE END CAN2_MspInit 1 */
  }

.

2.2 CAN滤波器设置

	//
	CAN1_Filter_Config();
	CAN2_Filter_Config();
	CAN3_Filter_Config();
	//CAN1 滤波器设置
	void CAN1_Filter_Config(){
	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 = ENABLE;			//
	sFilterConfig.SlaveStartFilterBank = 14;			//
	
	if(HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
	{
		Error_Handler();
	}
}
//CAN2 滤波器设置
void CAN2_Filter_Config(){
	CAN_FilterTypeDef sFilterConfig;
	
	sFilterConfig.FilterBank = 14;						//滤波器组初始化
	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 = ENABLE;			//
	sFilterConfig.SlaveStartFilterBank = 14;			//从属滤波器组,单路CAN无意义
	
	if(HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig) != HAL_OK)
	{
		Error_Handler();
	}
}
//CAN3设置
void CAN3_Filter_Config(){
	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 = ENABLE;			//
	sFilterConfig.SlaveStartFilterBank = 14;			//
	
	if(HAL_CAN_ConfigFilter(&hcan3, &sFilterConfig) != HAL_OK)
	{
		Error_Handler();
	}
}

.

2.3 CAN使能

	HAL_CAN_Start(&hcan1);
	HAL_CAN_Start(&hcan2);
	HAL_CAN_Start(&hcan3);

.

2.4 激活中断

	HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
	HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING);
	HAL_CAN_ActivateNotification(&hcan3, CAN_IT_RX_FIFO0_MSG_PENDING);

.

2.5 CAN发送函数

// 配置
CAN_TxHeaderTypeDef CAN_TX_T;
uint32_t tx_mailBox;
uint8_t tx_data[4] = {0x55, 0x66, 0x23, 0x58};
CAN_TX_T.StdId = 0x15;
CAN_TX_T.ExtId = 0;
CAN_TX_T.DLC = 4;
// 发送
HAL_CAN_AddTxMessage(&hcan1, &CAN_TX_T, tx_data, &tx_mailBox);

.

2.6 CAN回调函数

CAN_RxHeaderTypeDef rxHeader;
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
	uint8_t data_ss[8];
	//HAL_UART_Transmit(&huart1, data_s2, 10, 1000);
	if(hcan->Instance == CAN1)
	{
		HAL_UART_Transmit(&huart1, data_s1, 10, 1000);
		
		HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &rxHeader, data_ss);
	}
	if(hcan->Instance == CAN2)
	{
		HAL_UART_Transmit(&huart1, data_s2, 10, 1000);
		
		HAL_CAN_GetRxMessage(&hcan2, CAN_RX_FIFO0, &rxHeader, data_ss);
	}
	if(hcan->Instance == CAN3)
	{
		HAL_UART_Transmit(&huart1, data_s3, 10, 1000);
		
		HAL_CAN_GetRxMessage(&hcan3, CAN_RX_FIFO0, &rxHeader, data_ss);
	}
	
}

2.7 main之后的代码

    MX_CAN1_Init();
    MX_CAN2_Init();
    MX_CAN3_Init();
	
	CAN1_Filter_Config();
	CAN2_Filter_Config();
	CAN3_Filter_Config();
	
	HAL_CAN_Start(&hcan1);
	HAL_CAN_Start(&hcan2);
	HAL_CAN_Start(&hcan3);
	
	HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
	HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING);
	HAL_CAN_ActivateNotification(&hcan3, CAN_IT_RX_FIFO0_MSG_PENDING);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

20232831 袁思承2023-2024-2 《网络攻防实践》第8次作业

目录 20232831 袁思承2023-2024-2 《网络攻防实践》第8次作业1.实验内容2.实验过程一、动手实践任务一二、动手实践任务二:分析Crackme程序①crackme1.exe②crackme2.exe 三、分析实践任务一四、分析实践任务二 3.学习中遇到的问题及解决4.学习感悟、思考等参考资料…

你不需要总是在 React 中使用 useState

在我审查的一个拉取请求中,我注意到在许多拉取请求中看到的一种模式。React 组件具有多个 UI 状态,例如 loading、error 和 success。 作者使用了多个 useState 钩子来管理这些状态,这导致代码难以阅读且容易出错,例如&#xff1a…

ArcGIS Pro3.0软件破解版安装教程

软件名称:ArcGIS Pro 3.0 安装环境:Windows 软件大小:7.3GB 硬件要求:CPU2GHz,内存4G(或更高) 百度云下载链接 : https://pan.baidu.com/s/1CXy1MSwdQXdVnJoV2X422A 提 取 码 :r0w1 教学内…

uniapp 对接facebook第三方登录

1.登录facebook开发者中心,打开我的应用页面在这里插入图片描述 2.创建应用 3.选择类型 4.填写信息 5.添加登录 6.添加平台 安卓密钥生成【需要 Java 环境!!! 和 openssl库】 Google Code Archive 的 Windows 版 openssl-for-windows OpenSSL 库 将openssl下载到…

word 表格 文字 上下居中

问题 word 表格 文字 上下居中 详细问题 笔者进行word 文档编辑,对于表格中的文本内容,如何进行上下居中? 解决方案 步骤1、选中需要进行操作的单元格 步骤2、右键 → \rightarrow →点击表格属性 步骤3、依次点击单元格 → \rightar…

ASP.NET前后端分离,WebApi。Vue3+ElementPlus+Axios+Pinia全流程教程

文章目录 前言1、.net core 执行过程2、中间件的执行过程3、AOP切面编程 Swagger添加Swagger注释 JWT1、解析2、配置JWT 配置SqlSugar0、引入SqlSugarCore包1、编写Context类2、配置实体类3、创建Service服务类进行数据库的CRUD4、配置Controller进行路由 依赖注入与IOCIOC依赖…

将针孔模型相机 应用到3DGS

Motivation 3DGS 的 投影采用的是 CG系的投影矩阵 P P P, 默认相机的 principal point (相机光心) 位于图像的中点处。但是 实际应用的 绝大多数的 相机 并不满足这样一个设定, 因此我们 需要根据 f , c x , c y {f,c_x, c_y} f,cx​,cy​ 这几个参数重新构建3D …

Android权限问题

问题&#xff1a;mate60pro弹出了一个读取已安装应用列表的权限弹框&#xff0c;需确认相关场景 分析&#xff1a; 1.AndroidManifest.xml中声明了权限标签 <uses-permission android:name"android.permission.QUERY_ALL_PACKAGES" /> 它赋予应用查询设备上…

结构方程模型(SEM)时间重复测量数据分析

张老师&#xff08;研究员&#xff09;&#xff0c;长期从事R语言结构方程模型、群落生态学、保护生物学、景观生态学和生态模型方面的研究和教学工作&#xff0c;已发表了多篇论文&#xff0c;拥有丰富的科研及实践经验。 很多研究需要进行多个时间点&#xff08;如天/月/年&…

java实现模板填充word,word转pdf,pdf转图片

Java实现Word转PDF及PDF转图片 在日常开发中&#xff0c;我们经常需要将文件操作&#xff0c;比如&#xff1a; 根据模板填充wordword文档中插入图片Word文档转换为PDF格式将PDF文件转换为图片。 这些转换可以帮助我们在不同的场景下展示或处理文档内容。下面&#xff0c;我将…

OpenHarmony实战开发-动画效果、如何实现阴影效果

阴影接口shadow可以为当前组件添加阴影效果&#xff0c;该接口支持两种类型参数&#xff0c;开发者可配置ShadowOptions自定义阴影效果。ShadowOptions模式下&#xff0c;当radius 0 或者 color 的透明度为0时&#xff0c;无阴影效果。 Entry Component struct ShadowOptionD…

MybatisPlus 页数page过大数据溢出问题

最近在修改公司代码时前端报了个奇怪的bug&#xff0c;即某个分页接口明明数据量只有42条&#xff0c;但是使用page 500 size 10 的配置时仍然可以查出数据 如下图所示 可见 total 属性只有 42条数据&#xff0c;页数都到500了但是很夸张的还是查出来10条数据 查询后端…

从阿里云崩溃看IT系统非功能能力验证

昨天下午6点左右学员群里有人说阿里云又出问题了&#xff0c;并且还挺长时间没有恢复了。 我也登录了一下&#xff0c;结果登录直接不停地302。如下所示&#xff1a; 做为阿里云重要的基础设施&#xff0c;这一故障影响了。如官方通告的处理时间线&#xff1a; 17:44起&#…

【笔试训练】day12

1.牛牛冲砖五 思路&#xff1a; 看懂样例即可。 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std;int main() {int t;cin >> t;string str;while (t--) {int n, k;cin >> n >> k >> str;int an…

鸿蒙OpenHarmony【小型系统 烧录】(基于Hi3516开发板)

烧录 针对Hi3516DV300开发板&#xff0c;除了DevEco Device Tool&#xff08;操作方法请参考烧录)&#xff09;外&#xff0c;还可以使用HiTool进行烧录。 前提条件 开发板相关源码已编译完成&#xff0c;已形成烧录文件。客户端&#xff08;操作平台&#xff0c;例如Window…

微软开源了 MS-DOS 4.00

DOS的历史源远流长&#xff0c;很多现在的年轻人不知道DOS了。其实早期的windows可以看做是基于DOS的窗口界面的模拟器&#xff0c;系统的本质其实是DOS。后来DOS的漏洞还是太多了&#xff0c;微软重新写了windows的底层内核。DOS只是一个辅助终端的形式予以保留了。 微软是在…

FTP 文件传输协议

FTP 文件传输协议 作用 用来传输文件的 FTP协议采用的是TCP作为传输协议&#xff0c; 21号端口用来传输FTP控制命令的&#xff0c; 20号端口用来传输文件数据的 FTP传输模式&#xff1a; 主动模式&#xff1a; FTP服务端接收下载控制命令后&#xff0c;会主动从tcp/20号端口…

pyaibote--安卓自动化环境配置与基础的使用方法

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 pyaibote介绍 pyaibote是一个全新&#xff0c;强大的办公自动化库。 支持找图&#xff0c;识别像素等操作。 比appium快十倍。 文章介绍 有大佬给我提到这个库后&#xff0c;我来查看。然后发现这个库太新了&am…

自然语言处理 (NLP) 中的迁移学习

--懂王 在大数据高速发展的时代&#xff0c;AI的发展日新月异&#xff0c;充满挑战的迎接未来。 自然语言处理 (NLP) 中的迁移学习: 迁移学习在 NLP 中越来越受欢迎&#xff0c;特别是在数据稀缺的情况下。如何有效地利用预训练的语言模型&#xff0c;并将其迁移到新的任务和领…

windows驱动开发-中断(一)

中断是windows中最难的一部分&#xff0c;这是因为中断本身属于操作系统的一部分&#xff0c;理解了中断和内存&#xff0c;对整个系统也就了解了。 中断部分会先从中断优先级、中断处理、中断服务例程入手&#xff0c;大概讲述一下中断的概念&#xff1b;接着从中断的一般实现…