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

STM32G474VET6-CAN FD使用经典模式+过滤报文ID

文章目录

  • CAN协议
  • CUBEMAX生成
  • CAN代码
    • tim.c
    • tim.h
    • fdcan.c
    • fdcan.h
    • main.c
    • 简单描述总结
  • 测试
    • 测试1
    • 测试2
    • 测试3
    • 测试4
    • 测试5
    • 测试6


CAN协议

协议了解即可,主要了解,报文格式(比如标准格式的,数据帧:帧起始+仲裁段+控制段+数据段+CRC段+ACK段+帧结束),还是应用为主。

CUBEMAX生成

功能是:PE7 PE8 借助定时器2和6,分别以100ms和1s间隔闪烁。
接收/发送can报文

首先打开系统串口调试(可以直接将cubemax生成代码到项目工程里,后面直接更新生成即可)

在这里插入图片描述

GPIO配置:

在这里插入图片描述

时钟树配置:

配置主频72MHZ:

在这里插入图片描述
FDCAN时钟选择:

在这里插入图片描述

定时器2配置:
在这里插入图片描述

在这里插入图片描述

定时器6配置:
在这里插入图片描述
在这里插入图片描述

开启中断,以及设置中断抢占优先级为1,2 相应优先级都是默认为0:

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

在这里插入图片描述

定时时间计算:
Time = 72MHZ / ((PSC +1)
(Count Period+1)) = 72MHZ / ((7199+1)*(9999+1)) = 1s
*

CAN FD配置:

在这里插入图片描述

波特率计算:
baud = 72MHZ / ( (Nominal Sync Jump + Seg1+Seg2)
波特率分频系数 )
= 72Mbps/ ((1+9+8)8)
= 500 000bps
= 500kbps

再比如要1MHZ的话 那就是设置 波特率分频系数(Nominal Prescaler)为4,其它不变 就是如图。

这里我在程序中将波特率分频系数(Nominal Prescaler)为8 了 所以使用的是500kbps。

CAN代码

借助STM32CUBEMAX生成+编写接收/发送:

生成的肯定不能直接使用的:比如要自己编写Tim2 Tim6 的定时器中断服务函数,以及开启定时器计数,

tim.c

/* USER CODE BEGIN Header */
/********************************************************************************* @file    tim.c* @brief   This file provides code for the configuration*          of the TIM instances.******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "tim.h"/* USER CODE BEGIN 0 *//* USER CODE END 0 */TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim6;/* TIM2 init function */
void MX_TIM2_Init(void)
{/* USER CODE BEGIN TIM2_Init 0 *//* USER CODE END TIM2_Init 0 */TIM_ClockConfigTypeDef sClockSourceConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};/* USER CODE BEGIN TIM2_Init 1 *//* USER CODE END TIM2_Init 1 */htim2.Instance = TIM2;htim2.Init.Prescaler = 7199;htim2.Init.CounterMode = TIM_COUNTERMODE_UP;htim2.Init.Period = 999;htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(&htim2) != HAL_OK){Error_Handler();}sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK){Error_Handler();}/* USER CODE BEGIN TIM2_Init 2 *//* USER CODE END TIM2_Init 2 */}
/* TIM6 init function */
void MX_TIM6_Init(void)
{/* USER CODE BEGIN TIM6_Init 0 *//* USER CODE END TIM6_Init 0 */TIM_MasterConfigTypeDef sMasterConfig = {0};/* USER CODE BEGIN TIM6_Init 1 *//* USER CODE END TIM6_Init 1 */htim6.Instance = TIM6;htim6.Init.Prescaler = 7199;htim6.Init.CounterMode = TIM_COUNTERMODE_UP;htim6.Init.Period = 9999;htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(&htim6) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK){Error_Handler();}/* USER CODE BEGIN TIM6_Init 2 *//* USER CODE END TIM6_Init 2 */}void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{if(tim_baseHandle->Instance==TIM2){/* USER CODE BEGIN TIM2_MspInit 0 *//* USER CODE END TIM2_MspInit 0 *//* TIM2 clock enable */__HAL_RCC_TIM2_CLK_ENABLE();/* TIM2 interrupt Init */HAL_NVIC_SetPriority(TIM2_IRQn, 1, 0);HAL_NVIC_EnableIRQ(TIM2_IRQn);/* USER CODE BEGIN TIM2_MspInit 1 *//* USER CODE END TIM2_MspInit 1 */}else if(tim_baseHandle->Instance==TIM6){/* USER CODE BEGIN TIM6_MspInit 0 *//* USER CODE END TIM6_MspInit 0 *//* TIM6 clock enable */__HAL_RCC_TIM6_CLK_ENABLE();/* TIM6 interrupt Init */HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 2, 0);HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);/* USER CODE BEGIN TIM6_MspInit 1 *//* USER CODE END TIM6_MspInit 1 */}
}void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{
http://www.xdnf.cn/news/414811.html

相关文章:

  • ESOP系统如何帮助玩具工厂实现生产数据实时展示
  • rufus+Ubuntu 18.04 镜像
  • Promise/A+ 规范中文解读
  • Matlab基于PSO-MVMD粒子群算法优化多元变分模态分解
  • 【C语言指针超详解(五)】--回调函数,qsort函数的理解和使用,qsort函数的模拟实现
  • 类神经网络训练失败怎么办?
  • 中央处理器(CPU)(概述、指令周期)
  • 阿里云服务器核心用途解析:从基础应用到行业创新​
  • c++刷题便捷函数(类似于stoi的小函数)
  • 超越合并速度(merge speed):AI如何重塑开发者协作
  • Hadoop集群的常用命令
  • axi uart 16550 ip core使用流程
  • 一、HAL库的设计理念详解:从架构到实践
  • 274、H指数
  • StringBuilder,StringJoiner,StringBuffer字符串处理类深度解析
  • 从零到精通:GoFrame 的 garray 模块深度解析与实战经验分享
  • Nacos源码—8.Nacos升级gRPC分析五
  • 【K8S学习之生命周期钩子】详细了解 postStart 和 preStop 生命周期钩子
  • 【日撸 Java 三百行】Day 13(链表)
  • 【AIGC梦幻婚纱美学】:白纱与花卉的浪漫算法融合
  • 2025-5-12 底部埋伏记录
  • Matlab 基于GUI的图像去雾技术GlobalHisteq、LocalHisteq和Retinex
  • 基于世界土壤数据库(HWSD)的中国土壤数据集(v1.1)(2009)
  • 大核极坐标码
  • vulhub-Stapler
  • 耀圣-高温釜进料口气动耐磨切断球阀:高粘度、高腐蚀颗粒介质的终极进料解决方案
  • DeepSeek | AI需求分析
  • 手机电池健康提示怎么看?
  • 封装echarts的柱状图+折线图+堆积图
  • 使用 Watt toolkit 加速 git clone