
前言 网络中传递着各种各样的数据包,当设备连接到网络后,为了减少对接收到的数据进行处理的负荷,就需要对设备接收到的数据包进行过滤。STM32MCU 的以太网外设提供多种数据包过滤的模式。可以根据以太网帧的目标 MAC 地址,源 MAC 地址进行过滤,STM32H7 系列还提供对 VLAN tag 和 IP 地址,UDP/TCP 端口的过滤。 拿 MAC 地址过滤来说,SM32MCU 支持:单播目标地址过滤,多播目标地址过滤,单播源地址过滤和广播地址过滤。单播目标地址过滤和多播目标地址过滤又分为:Perfect 地址过滤和 Hash 地址过滤。 perfect 地址过滤就是把接收到的以太网帧中的目标地址与 MAC 地址寄存器中保存的地址进行比较,如果匹配,数据包就被接受,否则就被丢掉。还可以通过设置“反向过滤”,来翻转过滤的结果,接收到的以太网帧中的目标地址与MAC 地址寄存器中保存的地址如果不匹配,数据包就被接收,否则就被丢掉。 Hash 地址过滤不是直接比较 MAC 地址,而是计算目标 MAC 地址的 CRC32 值,取其高 6 位作为索引去查询 Hash 表寄存器中对应的值,来判断是否接收该数据帧。Hash 地址过滤的方法稍微复杂,本文接下来将基于STM32H743Nucleo 板,通过具体的例程介绍如何实现 Hash 地址过滤。 MAC 地址 Hash 过滤 过滤原理 在 Hash 地址过滤模式下,以太网 MAC 通过一张 64 位的 Hash 表来进行过滤。这张表存储在两个 32 位的寄存器中。 STM32H743 的寄存器 ETH_MACHT0R 保存着 Hash 表的前 32 位,ETH_MACHT1R 中保存着 Hash 表的后 32 位值。 MAC 接收到以太网帧后,会自动计算目标 MAC 地址的 CRC 值,然后用该 CRC 值的高 6 位,作为索引号去前面提到的 Hash 表寄存器中查找对应位,如果该位的值是 1,则收到的以太网帧通过。否则就丢掉。例如,计算出的 CRC 高 6 位是 0,则对应 ETH_MACHT0R 的 bit0,如果该位是 1,则通过。 在初始化的时候,应该根据想要接收的目标 MAC 地址,先设置好 ETH_MACHT0R 和 ETH_MACHT1R 寄存器的值。 Hash 地址过滤将 48 位的 MAC 地址,对应到 6 位的 Hash 值,肯定会出现多个 MAC 地址对应到一个 6 位Hash 值的情况,所以这种过滤方式也被称作 imperfect 过滤模式。 Hash 值的计算方法 Hash 地址过滤模式,最关键的就是如何计算 6 位的 Hash 值。 在 RM0433 中介绍了 Hash 的产生方法,具体如下: 1.计算目标 MAC 地址的 CRC32 值。计算 CRC32 的方法参见 IEEE802.3 的第 3.2.8 章中 FCS 的说明 。根据IEEE802.3 中 CRC 值的计算要求,和以太网帧中 MAC 地址传输的顺序,MAC 地址的 CRC 值计算方法如下: • 第一个 32 位数据进行补码运算 • 输入的数据都进行按位反转顺序 • 进行 CRC32 计算,多项式为 0x4C11DB7 • 对最终输出数据进行补码运算 2. 对第一步的计算值进行按位反转顺序 3.取第二步计算值的高 6 位 然后就可以根据计算出来的 Hash 值,去设置 ETH_MACHT0R 和 ETH_MACHT1R 寄存器了。 MAC 地址过滤的寄存器配置 目标 MAC 地址过滤的寄存器配置见下表: ![]() 完整版请查看:附件 |
LAT0750_STM32以太网MAC地址Hash过滤.pdf
下载384.66 KB, 下载次数: 6
STM32 GUI LTDC 最大像素时钟评估方法
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南