STMCU小助手
发布时间:2022-7-29 16:03
|
前言 3 ^9 Z* \! N m( Q) p 网络中传递着各种各样的数据包,当设备连接到网络后,为了减少对接收到的数据进行处理的负荷,就需要对设备接收到的数据包进行过滤。STM32MCU 的以太网外设提供多种数据包过滤的模式。可以根据以太网帧的目标 MAC 地址,源 MAC 地址进行过滤,STM32H7 系列还提供对 VLAN tag 和 IP 地址,UDP/TCP 端口的过滤。 拿 MAC 地址过滤来说,SM32MCU 支持:单播目标地址过滤,多播目标地址过滤,单播源地址过滤和广播地址过滤。单播目标地址过滤和多播目标地址过滤又分为:Perfect 地址过滤和 Hash 地址过滤。 , V- J8 A! c; {( l2 G0 V perfect 地址过滤就是把接收到的以太网帧中的目标地址与 MAC 地址寄存器中保存的地址进行比较,如果匹配,数据包就被接受,否则就被丢掉。还可以通过设置“反向过滤”,来翻转过滤的结果,接收到的以太网帧中的目标地址与MAC 地址寄存器中保存的地址如果不匹配,数据包就被接收,否则就被丢掉。( [/ r9 n2 W& B Hash 地址过滤不是直接比较 MAC 地址,而是计算目标 MAC 地址的 CRC32 值,取其高 6 位作为索引去查询 Hash 表寄存器中对应的值,来判断是否接收该数据帧。Hash 地址过滤的方法稍微复杂,本文接下来将基于STM32H743Nucleo 板,通过具体的例程介绍如何实现 Hash 地址过滤。' h8 ~0 \+ W/ d 6 W9 T' u& o* B/ |0 E' M MAC 地址 Hash 过滤 , u9 V D4 `0 h6 V$ B- F* q 过滤原理9 n' w( z J, @/ E, U+ y- M 在 Hash 地址过滤模式下,以太网 MAC 通过一张 64 位的 Hash 表来进行过滤。这张表存储在两个 32 位的寄存器中。( L* {7 f# ?8 W7 J2 s 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 过滤模式。0 l, W5 U( D' N8 S/ n . O" f6 {$ |5 O& Y4 U Hash 值的计算方法 Hash 地址过滤模式,最关键的就是如何计算 6 位的 Hash 值。$ J8 i) p G& D) _# m 在 RM0433 中介绍了 Hash 的产生方法,具体如下:" D9 x2 {( Q0 X( L) u& s % t% b( j5 {! d2 c1 L; N# T- @( { 1.计算目标 MAC 地址的 CRC32 值。计算 CRC32 的方法参见 IEEE802.3 的第 3.2.8 章中 FCS 的说明 。根据IEEE802.3 中 CRC 值的计算要求,和以太网帧中 MAC 地址传输的顺序,MAC 地址的 CRC 值计算方法如下: • 第一个 32 位数据进行补码运算 • 输入的数据都进行按位反转顺序 • 进行 CRC32 计算,多项式为 0x4C11DB7 • 对最终输出数据进行补码运算 2. 对第一步的计算值进行按位反转顺序1 v* n' y9 A% f( }6 E, b 3.取第二步计算值的高 6 位 然后就可以根据计算出来的 Hash 值,去设置 ETH_MACHT0R 和 ETH_MACHT1R 寄存器了。 MAC 地址过滤的寄存器配置 目标 MAC 地址过滤的寄存器配置见下表:: a9 T4 g3 L+ A4 o. d: v @5 t I B! D & N7 n- m1 T& Z % t* ~1 _2 M9 B6 L4 x7 N8 O0 ` " a4 W( v& C0 r, K- [4 J
完整版请查看:附件 * ?: @3 F Z. W" Q* [ |
LAT0750_STM32以太网MAC地址Hash过滤.pdf
下载384.66 KB, 下载次数: 7
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
微信公众号
手机版