STM32H743的FDCAN使用方法(1):STM32CubeMX初始化代码生成

news2025/3/15 17:12:56

0 工具准备

1.STM32CubeMX

1 前言

本文介绍基于STM32CubeMX,使用stm32h743xi的对FDCAN2进行配置的方法。

2 初始化代码生成

2.1 选择FDCAN引脚

本例选择PB5、PB6作为FDCAN2的RX、TX引脚。
在这里插入图片描述
在这里插入图片描述

2.2 选择FDCAN时钟源

本例选择PLL2Q作为FDCAN时钟源,频率设置为100MHz。配置如下:
在这里插入图片描述
在这里插入图片描述

2.3 FDCAN参数设置

这一部分可以在代码里修改,一般设置标准帧过滤器个数、扩展帧过滤器个数、RX FIFO个数、TX FIFO个数、RX FIFIO元素大小、TX FIFO元素大小即可,其余参数在代码里修改。
在这里插入图片描述
本例使用中断接收CAN报文,使能所有FDCAN2相关中断:
在这里插入图片描述
可以在NVIC选项里修改FDCAN2抢占优先级和子优先级为(3,0):
在这里插入图片描述

2.4 初始化代码生成

配置好后,直接点击“生成”按钮生成我们需要的初始化代码:
在这里插入图片描述
生成的初始化相关代码如下:

/**
  * @brief FDCAN2 Initialization Function
  * @param None
  * @retval None
  */
static void MX_FDCAN2_Init(void)
{

  /* USER CODE BEGIN FDCAN2_Init 0 */

  /* USER CODE END FDCAN2_Init 0 */

  /* USER CODE BEGIN FDCAN2_Init 1 */

  /* USER CODE END FDCAN2_Init 1 */
  hfdcan2.Instance = FDCAN2;
  hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
  hfdcan2.Init.Mode = FDCAN_MODE_NORMAL;
  hfdcan2.Init.AutoRetransmission = DISABLE;
  hfdcan2.Init.TransmitPause = DISABLE;
  hfdcan2.Init.ProtocolException = DISABLE;
  hfdcan2.Init.NominalPrescaler = 10;
  hfdcan2.Init.NominalSyncJumpWidth = 1;
  hfdcan2.Init.NominalTimeSeg1 = 17;
  hfdcan2.Init.NominalTimeSeg2 = 2;
  hfdcan2.Init.DataPrescaler = 1;
  hfdcan2.Init.DataSyncJumpWidth = 1;
  hfdcan2.Init.DataTimeSeg1 = 1;
  hfdcan2.Init.DataTimeSeg2 = 1;
  hfdcan2.Init.MessageRAMOffset = 0;
  hfdcan2.Init.StdFiltersNbr = 1;
  hfdcan2.Init.ExtFiltersNbr = 1;
  hfdcan2.Init.RxFifo0ElmtsNbr = 64;
  hfdcan2.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_64;
  hfdcan2.Init.RxFifo1ElmtsNbr = 0;
  hfdcan2.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_64;
  hfdcan2.Init.RxBuffersNbr = 0;
  hfdcan2.Init.RxBufferSize = FDCAN_DATA_BYTES_64;
  hfdcan2.Init.TxEventsNbr = 0;
  hfdcan2.Init.TxBuffersNbr = 0;
  hfdcan2.Init.TxFifoQueueElmtsNbr = 32;
  hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
  hfdcan2.Init.TxElmtSize = FDCAN_DATA_BYTES_64;
  if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN FDCAN2_Init 2 */

  /* USER CODE END FDCAN2_Init 2 */

}

/**
* @brief FDCAN MSP Initialization
* This function configures the hardware resources used in this example
* @param hfdcan: FDCAN handle pointer
* @retval None
*/
void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* hfdcan)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  if(hfdcan->Instance==FDCAN2)
  {
  /* USER CODE BEGIN FDCAN2_MspInit 0 */

  /* USER CODE END FDCAN2_MspInit 0 */

  /** Initializes the peripherals clock
  */
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;
    PeriphClkInitStruct.PLL2.PLL2M = 5;
    PeriphClkInitStruct.PLL2.PLL2N = 80;
    PeriphClkInitStruct.PLL2.PLL2P = 2;
    PeriphClkInitStruct.PLL2.PLL2Q = 4;
    PeriphClkInitStruct.PLL2.PLL2R = 1;
    PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2;
    PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
    PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
    PeriphClkInitStruct.FdcanClockSelection = RCC_FDCANCLKSOURCE_PLL2;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
      Error_Handler();
    }

    /* Peripheral clock enable */
    __HAL_RCC_FDCAN_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**FDCAN2 GPIO Configuration
    PB5     ------> FDCAN2_RX
    PB6     ------> FDCAN2_TX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN2;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    /* FDCAN2 interrupt Init */
    HAL_NVIC_SetPriority(FDCAN2_IT0_IRQn, 3, 0);
    HAL_NVIC_EnableIRQ(FDCAN2_IT0_IRQn);
    HAL_NVIC_SetPriority(FDCAN2_IT1_IRQn, 3, 0);
    HAL_NVIC_EnableIRQ(FDCAN2_IT1_IRQn);
    HAL_NVIC_SetPriority(FDCAN_CAL_IRQn, 3, 0);
    HAL_NVIC_EnableIRQ(FDCAN_CAL_IRQn);
  /* USER CODE BEGIN FDCAN2_MspInit 1 */

  /* USER CODE END FDCAN2_MspInit 1 */
  }

}

/**
* @brief FDCAN MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param hfdcan: FDCAN handle pointer
* @retval None
*/
void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* hfdcan)
{
  if(hfdcan->Instance==FDCAN2)
  {
  /* USER CODE BEGIN FDCAN2_MspDeInit 0 */

  /* USER CODE END FDCAN2_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_FDCAN_CLK_DISABLE();

    /**FDCAN2 GPIO Configuration
    PB5     ------> FDCAN2_RX
    PB6     ------> FDCAN2_TX
    */
    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_5|GPIO_PIN_6);

    /* FDCAN2 interrupt DeInit */
    HAL_NVIC_DisableIRQ(FDCAN2_IT0_IRQn);
    HAL_NVIC_DisableIRQ(FDCAN2_IT1_IRQn);
    HAL_NVIC_DisableIRQ(FDCAN_CAL_IRQn);
  /* USER CODE BEGIN FDCAN2_MspDeInit 1 */

  /* USER CODE END FDCAN2_MspDeInit 1 */
  }

}
/**
  * @brief This function handles FDCAN2 interrupt 0.
  */
void FDCAN2_IT0_IRQHandler(void)
{
  /* USER CODE BEGIN FDCAN2_IT0_IRQn 0 */

  /* USER CODE END FDCAN2_IT0_IRQn 0 */
  HAL_FDCAN_IRQHandler(&hfdcan2);
  /* USER CODE BEGIN FDCAN2_IT0_IRQn 1 */

  /* USER CODE END FDCAN2_IT0_IRQn 1 */
}

/**
  * @brief This function handles FDCAN2 interrupt 1.
  */
void FDCAN2_IT1_IRQHandler(void)
{
  /* USER CODE BEGIN FDCAN2_IT1_IRQn 0 */

  /* USER CODE END FDCAN2_IT1_IRQn 0 */
  HAL_FDCAN_IRQHandler(&hfdcan2);
  /* USER CODE BEGIN FDCAN2_IT1_IRQn 1 */

  /* USER CODE END FDCAN2_IT1_IRQn 1 */
}
/**
  * @brief This function handles FDCAN calibration unit interrupt.
  */
void FDCAN_CAL_IRQHandler(void)
{
  /* USER CODE BEGIN FDCAN_CAL_IRQn 0 */

  /* USER CODE END FDCAN_CAL_IRQn 0 */
  HAL_FDCAN_IRQHandler(&hfdcan2);
  /* USER CODE BEGIN FDCAN_CAL_IRQn 1 */

  /* USER CODE END FDCAN_CAL_IRQn 1 */
}

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

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

相关文章

Redis(1)-Jedis连接配置

问题 阿里云安装并启用Redis后,尝试在本地用Jedis调用,发现报错 public class Jedis01 {Testpublic void connect(){Jedis jedis new Jedis("101.37.31.211", 6379); // 公网ipjedis.auth("123"); // 密码String ping jedis.pin…

可转债日内自动T+0交易,行情推送+策略触发+交易接口

说明 目前这个项目已编译打包,下载即可测试,直接生成多平台可执行文件,详见运行方法。行情部分与策略弱相关,拆分解耦单独作为一个项目。行情项目请移步GitHub - freevolunteer/hangqing: A股行情订阅工具,支持股票/可转债level2/level2数据&…

Golang实现递归复制文件夹

代码 package zdpgo_fileimport ("errors""os""path/filepath""strings" )// CopyDir 复制文件夹 // param srcPath 源文件夹 // param desPath 目标文件夹 // return error 错误信息 func CopyDir(srcPath, desPath string) error {…

机器学习第十次课

前言 因为考了一次试,所以没讲太多新东西,唯一的问题是有的知识刚讲完就考了,导致我爆了...... 正文 主要讲的就是一个贝叶斯分类模型,这是属于生成式的分类器了 Bayesian decision theory 我的理解是贝叶斯公式则是利用条件概率和全概率公式计算后验概率,就这么简单 但是…

智慧农业可视化大屏,当个农民是不是小伙伴的梦想。

智慧农业可视化大屏是指通过数据可视化技术,将农业生产过程中的各种数据、指标和信息以图表、图像等形式展示在大屏上,以便农业从业者能够直观地了解农田、作物、气象、设备等方面的情况,从而进行农业生产的监控、管理和决策。以下是智慧农业…

怎么快速批量导出文本二维码?文件批量生码的方法和步骤

随着互联网的快速发展,二维码的应用也越来越广泛,现在很多二维码会用来展示物品信息,将编辑好的文字内容生成二维码之后,让其他人通过扫码的方式来获取相关内容。那么当有多条信息时,有什么方法能够一次批量生成二维码…

PHP质量工具系列之php_CodeSniffer

PHP_CodeSniffer 是一组两个 PHP 脚本:主脚本 phpcs 对 PHP、JavaScript 和 CSS 文件进行标记,以检测是否违反定义的编码标准;第二个脚本 phpcbf 自动纠正违反编码标准的行为。PHP_CodeSniffer 是一个重要的开发工具,可以确保你的…

04Django项目基本运行逻辑及模板资源套用

对应视频链接点击直达 Django项目用户管理及模板资源 对应视频链接点击直达1.基本运行逻辑Django的基本运行路线:视图views.py中的 纯操作、数据返回、页面渲染 2.模版套用1.寻找一个好的模版2.模板部署--修改适配联动 OVER,不会有人不会吧不会的加Q1394…

AI大模型到底能帮我干什么?

这周百度文心一言大模型正式发布了,不少网民拿着各种段子搞笑和玩梗。我在的其中某个微信群里,一位老兄针对当下的大模型,发出来如下的问题: 大家这么玩梗真没意思 我一直没弄明白这些大模型怎么帮助我工作 这个问题有一定的代表性…

关于sklearn决策树手动指定节点进行剪枝调整的实现

一、决策树剪枝 决策树的剪枝方式有两种,预剪枝和后剪枝,后剪枝在python的sklearn方法中提供了CCP代价复杂度剪枝法(Cost Complexity Pruning)具体实现代码如下: # -*- coding: utf-8 -*- from sklearn.datasets imp…

Java入门基础学习笔记44——String

为什么要学习String的处理呢? 开发中,对字符串的处理是非常常见的。 String是什么?可以做什么? java.lang.String 代表字符串。可以用来创建对象封装字符串数据,并对其进行处理。 1、创建对象 2、封装字符串数据 3…

超过GPT4.0?Claude3官网及国内镜像站,国内使用克劳德3的方法

近期又有一个大模型横空出世,这就是由Anthropic公司推出的Claude 3(克劳德3),在多项基准测试中得分超越了GPT-4,那么他到底是什么情况呐?其实大家在国内也是可以使用上的! 克劳德Claude3 关于…

Python 闭包的高级用法详解

所谓闭包,就是指内函数使用了外函数的局部变量,并且外函数把内函数返回出来的过程,这个内函数称之为闭包函数。可以理解为是函数式编程中的封装。 内部函数可以使用外部函数定义的属性:外部函数调用后,返回内部函数的地…

Java入门基础学习笔记36——面向对象基础

面向对象编程快速入门: 计算机是用来处理数据的。 单个变量 数组变量 对象数据 Student类: package cn.ensource.object;public class Student {String name;double chinese_score;double math_score;public void printTotalScore() {System.out.pr…

AUTOMATIC1111/stable-diffusion-webui/stable-diffusion-webui-v1.9.3

配置环境介绍 目前平台集成了 Stable Diffusion WebUI 的官方镜像,该镜像中整合如下资源: GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 Stable Diffusion WebUI版本:v1.9.3 Python版本:3.10.…

HCIE是什么证书?为什么要考?

每当我发一些关于HCIE的话题时,总有小伙伴过来问“啥是HCIE啊?”今天就一起来了解下,到底什么是HCIE?为什么这么多人都要考HCIE? HCIE是华为认证ICT专家的缩写,它是华为认证体系中最高级别的ICT技术认证。HCIE全称为H…

windows 设置系统字体 (win11 win10)

由于微软的字体是有版权的,所以我打算替换掉 1.下载替换工具 github的项目,看起来很多人对微软默认字体带版权深恶痛绝。 项目地址:nomeiryoUi地址 这里选取最新的版本即可 2.打开软件 这里显示标题栏不能改,确认,其…

使用Systemd 设置Python程序开机启动

在 Linux 系统中设置Python 脚本开机启动,通常可以通过以下几种方式实现: 1. 使用 systemd(推荐方式) systemd 是大多数现代 Linux 发行版使用的初始化系统和服务管理器。你可以为Python 脚本创建一个 systemd 服务文件&#xf…

鸿蒙ArkUI-X平台差异化:【运行态差异化(@ohos.deviceInfo)】

平台差异化 简介 跨平台使用场景是一套ArkTS代码运行在多个终端设备上,如Android、iOS、OpenHarmony(含基于OpenHarmony发行的商业版,如HarmonyOS Next)。当不同平台业务逻辑不同,或使用了不支持跨平台的API&#xf…

Android开发-Android开发中的TCP与UDP通信策略的实现

Android 开发中的 TCP 与 UDP 通信策略的实现 1. 前言2. 准备工作3. Kotlin 中 TCP 通信实现客户端代码示例:服务器代码示例: 4. Kotlin 中 UDP 通信实现客户端代码示例:服务器代码示例: 5. TCP 与 UDP 应用场景分析TCP 实现可靠传…