【STM32】STM32 CANFD外设的几种消息接收过滤模式

这篇具有很好参考价值的文章主要介绍了【STM32】STM32 CANFD外设的几种消息接收过滤模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在控制器区域网络(CAN)系统中,正确配置消息过滤器对于有效管理网络通信至关重要。特别是在使用Flexible Data-rate Controller Area Network(FDCAN)时,选择合适的过滤器类型可以大大提高网络效率和消息处理速度。

STM32G47x芯片的CAN外设有如下几种接收消息过滤方法:

/** @defgroup FDCAN_filter_type FDCAN Filter Type
  * @{
  */
#define FDCAN_FILTER_RANGE         ((uint32_t)0x00000000U) /*!< Range filter from FilterID1 to FilterID2                        */
#define FDCAN_FILTER_DUAL          ((uint32_t)0x00000001U) /*!< Dual ID filter for FilterID1 or FilterID2                       */
#define FDCAN_FILTER_MASK          ((uint32_t)0x00000002U) /*!< Classic filter: FilterID1 = filter, FilterID2 = mask            */
#define FDCAN_FILTER_RANGE_NO_EIDM ((uint32_t)0x00000003U) /*!< Range filter from FilterID1 to FilterID2, EIDM mask not applied */

FDCAN_FILTER_RANGE (0x00000000U):

  • 这是一种范围过滤模式。
  • 在这种模式下,使用两个ID值(FilterID1FilterID2)来定义一个被接受的消息ID范围。
  • 任何在这个范围内(包括边界值)的消息ID都将通过过滤器。
  • 例如:如果 FilterID1 设置为 100FilterID2 设置为 200,那么任何ID在 100 到 200 之间(包括 100 和 200)的消息都会被接受。

FDCAN_FILTER_DUAL (0x00000001U):

  • 这种模式实现了双ID过滤。
  • 它使用两个特定的ID(FilterID1FilterID2),任何与这两个ID中的任何一个匹配的消息都会被接受。
  • 例如:如果 FilterID1 是 123,FilterID2 是 456,那么任何ID为 123 或 456 的消息都将通过过滤器。

FDCAN_FILTER_MASK (0x00000002U):

  • 这是一种经典的过滤方式,称为掩码过滤。
  • 在这种模式下,FilterID1 是过滤ID,FilterID2 是掩码。
  • 控制器使用掩码来确定哪些位在过滤ID中是必须匹配的。
  • 例如:如果 FilterID1 设置为 100,FilterID2(掩码)设置为 0xF0,则只有那些ID的高4位与 100 的高4位匹配的消息才会被接受。
  • 即满足如下条件:
    F i l t e r I D 2 & R e c e i v e M s g I D = = F i l t e r I D 2 & F i l t e r I D 1 FilterID2 \& ReceiveMsgID == FilterID2 \& FilterID1 FilterID2&ReceiveMsgID==FilterID2&FilterID1

FDCAN_FILTER_RANGE_NO_EIDM (0x00000003U):

  • 这也是一种范围过滤模式,但在这种模式下,EIDM(扩展ID掩码)不会被应用。
  • 与标准的范围过滤类似,它接受在 FilterID1FilterID2 之间的所有消息ID。
  • 但与标准范围过滤不同的是,它不使用额外的掩码来进一步限制接受的消息ID。
  • 每种过滤模式都有其特定的用途和应用场景,选择合适的过滤模式取决于CAN网络中的特定需求和消息流量。

每种FDCAN过滤器类型都有其独特的应用场景和优势。在选择合适的过滤策略时,重要的是要考虑您的网络需求和消息流量特点。通过理解这些过滤器类型的工作原理,您可以更有效地配置您的CAN网络,确保数据传输的高效和准确。

关于EIDM

EIDM(Extended Identifier Mask)在FDCAN(Flexible Data-rate Controller Area Network)系统中用于过滤消息时起着重要作用。EIDM主要用于在掩码过滤中细化对扩展标识符(Extended Identifier)的匹配。在CAN通信中,标识符用于区分不同的消息,而扩展标识符允许更多的消息ID。

EIDM的作用是为扩展标识符提供一个额外的掩码层,使得过滤器可以更精确地匹配特定的消息ID。通过EIDM,您可以指定哪些位必须匹配才能让消息通过过滤器,从而提供了更高的灵活性和精确控制。

例子
假设您有一个扩展ID为 0x1F345678 的消息,您希望只接收具有特定模式的ID。您可以使用掩码过滤器和EIDM来实现这一点:

设置过滤ID:假设您设置过滤ID为 0x1F345678
应用EIDM:您可以设置EIDM0xFFF00000。这个掩码指定了只有ID的高12位需要匹配,而低20位可以是任何值。
在这种情况下,任何高12位与 0x1F3 匹配的扩展ID都会通过过滤器。这意味着ID如 0x1F300000、0x1F3FFFFF 等都会被接受,因为它们在掩码指定的位上与过滤ID匹配。

  • 即满足如下条件:
    E I D M & R e c e i v e M s g I D = = E I D M & S e t I D EIDM \& ReceiveMsgID == EIDM \&SetID EIDM&ReceiveMsgID==EIDM&SetID

EIDM在需要对大量消息进行精确控制时非常有用,尤其是在复杂的CAN网络环境中,例如汽车或工业自动化系统,这种精确的消息过滤能够确保只有相关和必要的信息被处理。

FDCAN_RxHeaderTypeDef RxHeader;
uint8_t RxData[8];
void FDCAN1_Config(void)
{
  FDCAN_FilterTypeDef sFilterConfig;
  /* Configure Rx filter */
  sFilterConfig1.IdType = FDCAN_EXTENDED_ID;             /* 设置标准ID或者扩展ID */
  sFilterConfig1.FilterIndex = 0;                        /* 用于过滤索引,如果是标准ID,范围0到127。如果是扩展ID,范围0到64。这个的数量在配置CAN过滤器外设的时候配置了。 */
  sFilterConfig1.FilterType = FDCAN_FILTER_MASK;         /* 过滤器采样屏蔽位模式 */
  sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; /* 如果过滤匹配,将数据保存到Rx FIFO 0 */
  sFilterConfig1.FilterID1 = 0x111;                      /* 屏蔽位模式下,FilterID1是消息ID */
  sFilterConfig1.FilterID2 = 0x7FF;                      /* 屏蔽位模式下,FilterID2是消息屏蔽位 */

  if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1) != HAL_OK) /* 配置过滤器 */
  {
    Error_Handler();
  }


  /* Configure global filter:
     Filter all remote frames with STD and EXT ID
     Reject non matching frames with STD ID and EXT ID */
  if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
  {
    Error_Handler();
  }

  if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
  {
    Error_Handler();
  }

  /* Start the FDCAN module */
  if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
  {
    Error_Handler();
  }
}

void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
  if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)
  {
    /* Retrieve Rx messages from RX FIFO0 */
    if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
    {
      Error_Handler();
    }
  }
}

HAL_FDCAN_ConfigGlobalFilter
@brief 配置FDCAN全局过滤器。
@param hfdcan 指向包含指定FDCAN配置信息的FDCAN_HandleTypeDef结构体的指针。
@param NonMatchingStd 定义了如何处理接收到的具有11位ID且不匹配过滤器列表中任何元素的消息。
此参数可以取值 @arg FDCAN_Non_Matching_Frames。
@param NonMatchingExt 定义了如何处理接收到的具有29位ID且不匹配过滤器列表中任何元素的消息。
此参数可以取值 @arg FDCAN_Non_Matching_Frames。
@param RejectRemoteStd 过滤或拒绝所有远程11位ID帧。
此参数可以取值 @arg FDCAN_Reject_Remote_Frames。
@param RejectRemoteExt 过滤或拒绝所有远程29位ID帧。
此参数可以取值 @arg FDCAN_Reject_Remote_Frames。
@retval HAL状态

/** @defgroup FDCAN_Non_Matching_Frames FDCAN non-matching frames

  • @{
    /
    #define FDCAN_ACCEPT_IN_RX_FIFO0 ((uint32_t)0x00000000U) /
    !< Accept in Rx FIFO 0 /
    #define FDCAN_ACCEPT_IN_RX_FIFO1 ((uint32_t)0x00000001U) /
    !< Accept in Rx FIFO 1 /
    #define FDCAN_REJECT ((uint32_t)0x00000002U) /
    !< Reject /
    /
    *
  • @}
    */

/** @defgroup FDCAN_Reject_Remote_Frames FDCAN reject remote frames文章来源地址https://www.toymoban.com/news/detail-800780.html

  • @{
    /
    #define FDCAN_FILTER_REMOTE ((uint32_t)0x00000000U) /
    !< Filter remote frames /
    #define FDCAN_REJECT_REMOTE ((uint32_t)0x00000001U) /
    !< Reject all remote frames */

到了这里,关于【STM32】STM32 CANFD外设的几种消息接收过滤模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言-单片机:STM32程序烧录的几种方法

    STM32微控制器提供了多种程序烧录(也称为编程或固件更新)方式,这些方法允许用户将编译后的程序代码(通常为HEX或BIN格式)下载到MCU的闪存中。以下是几种常见的STM32程序烧录方式: ST-LINK : ST-LINK/V2 : 这是最常用的官方开发工具之一,可以直接通过USB接口与PC连接。S

    2024年04月26日
    浏览(46)
  • [FOC-Stm32]设置PWM占空比(比较值)的几种方法

    近期博主在阅读一些基于STM32的FOC代码中,对PWM占空比的设置问题很感兴趣,于是找了分别拿出来做了一下对比,来看看都是怎么来调整PWM输出的。 下图给出了PWM占空比调整的原理,在定时器循环中,有两个量:ARR 重装载值和 CCR 比较值。定时器内的计数器从0到ARR循环记录数

    2024年02月15日
    浏览(46)
  • STM32:串口轮询模式、中断模式、DMA模式和接收不定长数据

           在STM32每个串口的内部都有两个寄存器:发送数据寄存器(TDR)/发送移位寄存器,当我们调用HAL_UART_Transmit 把数据发送出去时,CPU会将数据依次将数据发送到数据寄存器中,移位寄存器中的数据会根据我们设置的比特率传化成高低电平从TX引脚输出。待发送移位寄存器中发

    2024年02月07日
    浏览(57)
  • STM32 CAN/CANFD软件快速配置(HAL库版本)

    控制器局域网总线(CAN,Controller Area Network)是一种用于实时应用的串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一。CAN协议用于汽车中各种不同元件之间的通信,以此取代昂贵而笨重的配电线束。该协议的健壮性使其用途延伸到其他

    2024年02月09日
    浏览(40)
  • springboot接收参数的几种方式

    传参格式:?号传参,在地址栏上加参数 传参格式:请求体传参 form-data的请求是在body中,为key=value格式,同时可以传文件,Content-Type为multipart/form-data,后端可以用@RequestParam接收。 json传参也是在body当中,只不过json是一种数据格式,后端可以用@RequestBody接收。 地址栏传参,

    2024年02月10日
    浏览(60)
  • JavaScript中数据过滤的几种方法

    JavaScript是一种广泛使用的编程语言,它提供了多种方法来对数据进行过滤。在本文中,我们将介绍JavaScript中常见的几种数据过滤方法,并提供相应的示例。 filter()方法是JavaScript数组对象的一个内置方法,它创建一个新数组,其中包含符合指定条件的所有元素。该方法接受一

    2024年02月04日
    浏览(63)
  • springboot接收前端参数的几种方式

    目录 第一种:直接在方法中指定参数 第二种:使用@requesrParam注解 第三种方法:基于@pathVariable  第四种方法:基于@ResquestBody 在开始之前,我们需要一下准备工作,创建数据库,springboot工程,添加依赖,配置文件,使用的技术有mybatisplus,springboot,maven,mysql。 首先,数据库

    2024年02月07日
    浏览(47)
  • 【SpringBoot系列】接收前端参数的几种方式

    前言 在现代Web开发中,前后端分离的架构已经成为主流。前端负责展示页面和用户交互,而后端则负责处理业务逻辑和数据存储。在这种架构下,前端需要将用户输入的数据发送给后端进行处理。而Spring Boot作为一种快速开发框架,提供了多种方式来接收前端数据。 本文将介

    2024年02月05日
    浏览(47)
  • SpringBoot中接收POST参数的几种方式

    今天在做一个vue前后端分离项目的过程中,踩了一个坑,记录一下 前端如下: 用户名字段: username 密码字段: password 提交后,发现后端怎么也收不到参数,总结如下: 常见的接收post参数,有三种 额外参数: 使用 required = false 标注参数是非必须的。 使用 defaultValue 给参数

    2024年02月15日
    浏览(60)
  • STM32 CAN通讯滤波器几种模式的设置

    1. 32位过滤器-标识符屏蔽模式(一组筛选ID)  2. 32位过滤器-标识符列表模式(2个筛选ID)  3. 16位过滤器-标识符屏蔽模式(2组筛选ID)  4. 16位过滤器-标识符列表模式(4个筛选ID)  1. 32位过滤器-标识符屏蔽模式(一组筛选ID) 2. 32位过滤器-标识符列表模式(2个筛选ID)  

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包