2. STM32以太网外设架构
STM32 的以太网外设并不是一个单一模块,而是由 MAC 控制器、专用 DMA、MII/RMII 介质接口、SMI(站管理接口)以及时钟树共同组成的一条完整数据通路。理解这条通路的边界与分工,是后续做描述符配置、PHY 寄存器读写和吞吐调优的前提。本节以 STM32F4/F7/H7 系列常见的以太网 MAC(如 Synopsys DesignWare 兼容控制器)为对象,逐层拆解其内部结构与配置要点。
一、整体分层:从引脚到内存的四段结构
从物理引脚到应用缓冲区,数据要经过四个层次:PHY 芯片负责模拟侧的编解码与线路驱动;MII/RMII 是 MAC 与 PHY 之间的数字接口;MAC 完成帧的成帧、CRC 校验、地址过滤与流控;DMA 负责在 MAC 与系统 SRAM 之间搬运数据,并通过描述符与 CPU 交互。CPU 不直接读写 MAC 的收发 FIFO,而是通过描述符环间接控制数据流,这是理解整个外设的关键。
二、MAC 控制器:帧处理的核心
MAC 层承担的是以太网数据链路层的下半部分功能。发送方向上,它接收 DMA 送来的帧数据,自动添加前导码(7 字节 0xAA)和帧起始定界符 SFD(0xD5),计算并附加 4 字节 FCS(CRC-32),必要时插入 IFG 帧间隔;接收方向上,它剥离前导码,校验 FCS,根据 MAC 地址寄存器组(MACFFR、MACFRMFILTR 等)决定是否丢弃该帧,并把通过过滤的帧交给 DMA。
MAC 内部还有几个容易被忽略但很关键的寄存器:MACMIIAR 与 MACMIIDR 用于 SMI 读写 PHY;MACCR 控制收发使能、双工模式、速率(10/100 Mbps)和 CRC 剥离策略;MACFCR 配置流控阈值。在 STM32 HAL 中,这些最终由 HAL_ETH_Init() 依据 heth.Init 结构体写入。
三、DMA:描述符驱动的数据搬运
以太网 DMA 使用两个独立的描述符环:发送环和接收环。每个描述符通常占 4 个字(16 字节),包含状态字、控制字、缓冲区地址和下一个描述符地址。CPU 通过设置描述符的 OWN 位把缓冲区所有权交给 DMA,DMA 完成后清除该位并置位相应状态标志,CPU 轮询或中断响应后再回收缓冲区。这种“所有权翻转”机制避免了频繁的寄存器读写。
以接收为例,典型配置是每帧一个描述符、缓冲区 1536 字节(覆盖最大以太网帧 1518 字节加余量)。发送侧则常用“零拷贝”思路:应用直接把待发数据地址写入描述符,DMA 从该地址读取,无需再复制一次。DMA 还支持存储转发(Store-and-Forward)与直通(Cut-Through)两种模式,前者等整帧收完再转发,FCS 错误帧不会进入内存,工程上更稳妥。
四、MII 与 RMII:引脚与时钟的取舍
MII 是标准的 4 位并行接口,收发各需 4 根数据线,加上 TX_CLK、RX_CLK、TX_EN、TX_ER、CRS、COL、RX_DV、RX_ER 等,共约 16 根信号线。RMII 是精简版本,数据线仍为 4 位,但收发共用一根 50 MHz 参考时钟 REF_CLK,信号线减少到约 9 根,代价是时钟必须由外部提供或由 MCU 的 MCO 引脚输出,且对 REF_CLK 的抖动和走线更敏感。
选择依据很直接:引脚紧张、PCB 面积受限时选 RMII;需要 10 Mbps 与 100 Mbps 全双工稳定切换、或对时序余量要求高时选 MII。STM32 通过 SYSCFG_PMC 的 MII_RMII_SEL 位切换,配置错误会导致完全收不到包,这是调试中最常见的“低级错误”之一。
五、SMI:CPU 与 PHY 的慢速管理通道
SMI 由 MDC 时钟线和 MDIO 双向数据线组成,用于读写 PHY 内部寄存器。MDC 由 HCLK 分频得到,分频系数在 MACMIIAR 的 CR 字段中设置,需保证 MDC 不超过 PHY 手册规定的上限(常见 2.5 MHz 或 25 MHz)。一次读操作流程是:写 MACMIIAR 发起读命令,等待 BUSY 位清零,再从 MACMIIDR 取回 16 位数据。PHY 地址(0~31)和寄存器地址(0~31)都在 MACMIIAR 中指定。
上电后典型操作顺序是:先读 PHY 的 BMSR(寄存器 1)确认链路状态,再读 PHYIDR1/PHYIDR2(寄存器 2、3)确认 PHY 型号,然后写 BMCR(寄存器 0)设置自协商或强制模式。若 MDIO 一直读回 0xFFFF 或 0x0000,通常说明 PHY 地址错误、MDC 未输出或硬件未供电。
六、时钟树配置要点
以太网对时钟有硬性要求。RMII 模式下 REF_CLK 必须是 50 MHz,可由外部有源晶振提供,也可由 STM32 的 MCO1/MCO2 从 PLL 分频输出。以 25 MHz HSE 为例,若要让 MCO 输出 50 MHz,需要配置 PLL 使 PLLQ 或相应分频链路得到 50 MHz,再选择 MCO 预分频为 1。MII 模式下 TX_CLK 和 RX_CLK 由 PHY 提供,分别为 25 MHz(100 Mbps)或 2.5 MHz(10 Mbps),MAC 侧需要正确选择时钟源。
此外,MAC 的 TX/RX 时钟域与 AHB 时钟域之间要做跨时钟域处理,DMA 突发长度、FIFO 阈值(如 RFA、RFD、TFA、TFD)需要与 HCLK 频率匹配。HCLK 过低时,100 Mbps 全双工可能因带宽不足而丢包,此时应提高 HCLK 或减小突发长度。配置完成后,可通过读取 MACDBGR 寄存器观察当前收发状态,或借助 HAL_ETH_GetState() 与链路状态回调确认初始化是否成功。