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

目录

  • 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.mfbz.cn/a/580851.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据分析:生存分析原理和应用实例

介绍 生存分析的目的是分析某个时间点的“生存概率”是多少。基于这样的研究目的,需要提供生存数据,它是一种由不同的开始时间和结束时间组成的事件-时间的数据,比如在癌症研究领域,研究手术到死亡的过程、治疗到疾病进展等等。 在开展生存分析前,需要了解什么是删失(c…

二维码门楼牌管理应用平台建设:隐患统计与智能管理

文章目录 前言一、二维码门楼牌管理应用平台概述二、隐患统计功能的重要性三、隐患统计的实现方式四、隐患统计的实践应用五、面临的挑战与未来发展 前言 随着城市管理的不断升级,二维码门楼牌管理应用平台已成为现代城市管理的重要工具。该平台通过集成先进的信息…

WCH RISC CH32V303RCT6 单片机的SDI Printf 虚拟串口功能 类似SEGGER RTT打印功能 简单分析

参考: 有关于 SDI printf 更多的信息和资料吗? 关于 CH32 系列 MCU SDI 虚拟串口功能的使用 【CH32X035 评估板测评】 教你使用 SDI 接口重定向 printf SDI (Serial Data Interface) 是沁恒微电子 RISC-V 内核的私有外设接口,CH32 RISC-V 系列目前提供了…

PDCA循环:持续精进的工具

文章目录 一、什么是PDCA二、PDCA的应用场景三、PDCA在信息系统项目管理中的应用 一、什么是PDCA PDCA循环是由美国质量管理专家沃特阿曼德休哈特(Walter A. Shewhart)在20世纪30年代提出的,最初用于制造业的质量管理。休哈特博士在构想PDCA…

二极管钳位型三电平SVPWM(羊角波)闭环系统simulink建模与仿真

整理了二极管钳位型三电平SVPWM(羊角波)闭环系统simulink建模与仿真模型,附赠参考资料。 在二极管钳位型三电平SVPWM中,通过控制逆变器的开关器件(IGBT)的导通和关断,将输入的直流电压转换为三…

知网怎么查重 知网查重的详细步骤

知网查重八个步骤:1. 访问官网,注册账号。2. 上传待查文档。3. 选择查重规则。4. 选择相似来源库。5. 提交查重任务。6. 等待查重结果。7. 获取查重报告。8. 下载查重报告。 知网查重的详细步骤 第一步:进入知网查重系统 打开浏览器&#x…

怎样将便签软件搬家?便签迁移攻略

便签软件已成为我们日常生活中不可或缺的记录工具。无论是重要的工作内容,还是琐碎的生活事务,我们都会在便签中一一记下。然而,当我们需要更换电脑或其他设备时,如何将这些珍贵的便签内容迁移到新设备上,成为了许多人…

2024全国大学生高新技术竞赛——算法智星挑战赛 解题报告(流水账版) | 珂学家

前言 评价 因为第一届的缘故吧,导致这场比赛异常的简单。所以不太好评价这块。 怎么说呢? 体验有点差 题目难度没有区分度有两题还存在SPJ判定问题,导致赛时没一人过。 题目分布,简单题占大部分,中等级占一小部分&…

Ubuntu查看端口状态

完蛋了,好像动心了,近一周吃啥东西都索然无味,这可如何是好!!!不知道在期待什么,恐惧与窃喜—— 在Ubuntu系统中,查看某个端口是否被放行(即允许流量通过)&am…

【JAVA进阶篇教学】第六篇:Java线程中状态

博主打算从0-1讲解下java进阶篇教学,今天教学第六篇:Java线程中状态。 理解并掌握线程的休眠、停止和挂起等操作是多线程编程中的重要内容。下面我将详细说明这些操作,并提供相应的代码案例。 目录 一、线程休眠(Thread Slee…

一个早安寄语打卡的小程序技术分享

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂 1.早起打卡还能赚钱? 是的,你没有听错,最近发现了个非常有意思的小程序,主要是让用户早起早睡,然后每天进行打卡操作的。 当然&…

【KG+RAG 论文】医学知识图谱检索增强 LLM 的框架 —— KG-RAG

论文:Biomedical knowledge graph-enhanced prompt generation for large language models ⭐⭐⭐ Code:github.com/BaranziniLab/KG_RAG 文章目录 论文速读模型效果总结 论文速读 这篇论文提出了 KG-RAG 的框架,使用医学知识图谱&#xff0…

黑马面试篇

课程地址:新版Java面试专题视频教程,java八股文面试全套真题深度详解(含大厂高频面试真题)_哔哩哔哩_bilibili 课程名称:新版Java面试专题视频教程,java八股文面试全套真题深度详解(含大厂高频…

【Protobuf】protobuf详细介绍

protobuf详细介绍 一、前言二、Protobuf简介2.1、核心思想2.2、Protobuf是如何工作的?2.3、如何使用 Protoc 生成代码?2.4 入门命令 一、前言 在以往的项目中进行网络通信和数据交换的应用场景中,最经常使用的技术便是json或xml。随着JSON的…

用户中心 -- 插件使用 插件使用思路

易错注意点 1 5.1启动类 & 入口类 需保持一致 网址: 第一节课,用户管理--后端初始化,项目调通。二次翻工2-CSDN博客 一、 用户管理 框架 网址: 用户管理 --汇总 -- 明细-CSDN博客 1.2 更改路径,并生效 网址…

盘点那些你不知道的“痛”,柯桥俄语培训

首先我们来看一下болеть的五大含义: ①(чем 及无补语) 生病,患病 例: болеть тифом 害伤寒病 болеть воспалением лёгких 得肺炎 ②[只用第3人称] болит,болят 疼痛 例&am…

CDGA|数据治理新视角:清洗数据,让数据质量飞跃提升

在数据治理的新视角下,数据清洗不再是一个孤立的环节,而是与数据收集、存储、分析和应用紧密相连。它涉及到数据的全生命周期,从源头开始就对数据进行严格的把控。在数据收集阶段,通过设定合理的数据规范和校验机制,确…

DFS时间戳

时间戳 这就是树上查询问题 , 是求两个点有什么关系 让我们来看一下样例解释:注意字母旁边的数字就是时间戳, a在先序遍历(遍历顺序 : 左,右,根)是第一个进, 第十六个出…

#ESP32S3R8N8建立工程(VSCODE)点亮LED

1.参考文档 【立创ESP32S3R8N8】IDF入门手册 - 飞书云文档 (feishu.cn)https://lceda001.feishu.cn/wiki/GOIlwwfbIi1SC3k8594cDeFVn8g 2.建立工程 3.运行效果 4.更改配置 5.插播 之前配置的环境是有问题的,就算有自动检测也要仔细检查,必须严格按照以…

Linux内核广泛采用的侵入式数据结构设计

Linux内核广泛采用的侵入式数据结构设计恐怕很难应用到一般程序开发中。基本上是个高维十字链表,一个节点(struct)可以同时位于多个hash/list/tree中。我分享下我的经历,我刚入行时遇到一个好公司和师父,给了我机会,一年时间从3k薪…
最新文章