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)
{