大鱼YY 2025-07-30 14:31 采纳率: 0%
浏览 36

GD32F407VET6平替STM32F407VET6网络不通

GD32f407VET6芯片代替STM32F407VET6实现 LWIP 连接出现无法获取IP的问题,改为静态IP后也无法ping通。

最近手上有个项目使用GD32f407VET6芯片代替STM32F407VET6实现 LWIP 连接以太网。发现原来ST 正常工作,GD 就出现连接phy芯片 SR8201F以太网 出现 网口灯有亮也有闪动, 就是无法获取IP 地址。甚至采用固定IP 地址也无法ping通。 源代码采用STM32Cubemx +ETH+lwip+hal 编写。同样的工程在ST32F407VET6上是没有任何问题的。

  • 写回答

6条回答 默认 最新

  • 檀越@新空间 2025-07-30 14:34
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    在使用 GD32F407VET6 替代 STM32F407VET6 时,遇到 LWIP 网络无法获取 IP 地址静态 IP 也无法 ping 通 的问题,可能是由于以下几个方面的原因导致。以下是对该问题的详细分析和解决方案:


    一、问题原因分析

    1. 硬件差异

    • PHY 芯片兼容性问题:虽然 GD32 和 STM32 都支持 ETH 接口,但 SR8201F 在不同平台上的驱动可能不一致。
    • 时钟配置差异:GD32F407VET6 的时钟系统与 STM32F407VET6 不同,可能导致 ETH 时钟未正确配置
    • GPIO 配置错误:某些引脚(如 MDC、MDIO、RX_CLK 等)在 GD32 中的复用功能可能与 STM32 不同。

    2. 软件配置问题

    • LWIP 配置错误:LWIP 的网络接口配置(如 MAC 地址、IP 地址等)可能未适配 GD32。
    • HAL 库版本不匹配:GD32 的 HAL 库与 STM32 的 HAL 库存在差异,可能导致部分函数调用失败。
    • 中断配置错误:ETH 中断未正确使能或处理,导致数据包无法接收。

    3. 驱动层问题

    • ETH 初始化代码未适配 GD32:例如,某些寄存器地址或位定义在 GD32 中可能不同。
    • DMA 配置问题:GD32 的 DMA 配置方式与 STM32 可能有细微差别。

    二、解决方案

    1. 检查并确认硬件连接

    • 确保 PHY 芯片 SR8201F 正确连接

      • 检查 MDC/MDIO 引脚是否接好。
      • 确保 ETH 时钟(RX_CLK) 正确接入。
      • 检查 电源和复位信号 是否稳定。
    • 检查网口灯状态

      • 如果 LED 亮但不闪烁,可能是 物理层通信异常
      • 如果 LED 闪动但无数据,可能是 MAC 层初始化失败

    重点提示GD32 的 ETH 接口与 STM32 存在一些差异,需仔细核对引脚定义。


    2. 核对并修改 ETH 初始化代码

    (1)检查 ETH 时钟配置

    GD32F407VET6 的 ETH 时钟通常来自 HSEPLL,需要确保其频率为 125MHz(或根据 PHY 要求调整)。

    // 示例:配置 ETH 时钟(需根据实际时钟源修改)
    RCC->CFGR &= ~RCC_CFGR_PLLSRC;
    RCC->CFGR |= RCC_CFGR_PLLSRC_HSE;
    
    // 设置 PLL 倍频(假设 HSE = 8MHz)
    RCC->PLLCFGR = (8 << 0) | (25 << 6) | (2 << 16); // 8*25=200MHz, 分频为 2 → 100MHz
    

    重点提示ETH 时钟必须准确配置,否则无法正常通信。


    (2)检查 ETH GPIO 配置

    GD32 的 ETH 引脚可能与 STM32 不同,需根据 GD32F407VET6 的 datasheet 修改 MX_ETH_Init() 函数中的 GPIO 配置。

    // 示例:GD32 的 ETH GPIO 配置(需根据实际板子修改)
    GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | 
                         GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    

    重点提示确保所有 ETH 相关引脚(MDC, MDIO, RX_CLK, TXD0~TXD3, RXD0~RXD3)都已正确配置。


    3. 检查 LWIP 配置

    (1)设置正确的 MAC 地址

    LWIP 需要一个唯一的 MAC 地址,确保其与 STM32 中的一致或自行定义。

    // 在 lwipopts.h 或 main.c 中设置
    #define LWIP_MACADDR "00:11:22:33:44:55"
    

    (2)启用 DHCP 或静态 IP

    如果使用 DHCP,请确保 DHCP 功能已启用;若使用静态 IP,需确认 IP 地址、子网掩码、网关等参数正确。

    struct ip_addr ipaddr, netmask, gw;
    ipaddr.addr = 0xC0A80102;     // 192.168.1.2
    netmask.addr = 0xFFFFFF00;    // 255.255.255.0
    gw.addr = 0xC0A80101;         // 192.168.1.1
    
    dhcp_start(&gnetif);
    

    重点提示静态 IP 必须与路由器在同一网段,并且没有冲突。


    4. 检查 HAL 库与 LWIP 兼容性

    • 确认使用的是 GD32 的 HAL 库,而不是 STM32 的。
    • 更新 LWIP 到最新版本,以适配 GD32 的 ETH 接口。

    5. 添加调试信息

    在代码中添加打印语句,查看 ETH 是否成功初始化,以及 LWIP 是否获取到 IP 地址。

    printf("ETH Init OK\n");
    printf("IP Address: %s\n", ip4addrtoa(ipaddr));
    

    重点提示通过串口调试输出,可以快速定位问题所在。


    三、推荐的修改步骤(有序列表)

    1. 确认硬件连接正确

      • 检查 ETH 引脚(MDC, MDIO, RX_CLK 等)是否正确连接。
      • 检查 PHY 供电和复位信号是否正常。
    2. 检查 ETH 时钟配置

      • 确保 ETH 时钟频率为 125MHz(或根据 PHY 要求调整)。
      • 使用 RCC 寄存器配置 PLL 和分频。
    3. 修改 ETH GPIO 配置

      • 根据 GD32F407VET6 的 datasheet 修改 MX_ETH_Init() 中的 GPIO 配置。
      • 确保所有 ETH 引脚都正确配置为复用模式。
    4. 设置正确的 MAC 地址

      • lwipopts.hmain.c 中设置唯一 MAC 地址。
    5. 启用 DHCP 或静态 IP

      • 确保 LWIP 配置中启用了 DHCP 或设置了正确的静态 IP。
    6. 添加调试输出

      • 使用串口打印 ETH 初始化状态和 IP 地址,便于排查问题。
    7. 验证 LWIP 版本兼容性

      • 确保使用的 LWIP 版本支持 GD32F407VET6。

    四、示例代码片段(修改后的 ETH 初始化)

    void MX_ETH_Init(void)
    {
        heth.Instance = ETH;
        heth.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE;
        heth.Init.Speed = ETH_SPEED_100M;
        heth.Init.DuplexMode = ETH_FULL_DUPLEX;
        heth.Init.PhyAddress = LAN8720A_PHY_ADDRESS;
    
        // 设置 ETH 时钟
        RCC_ETHCLKConfig(RCC_ETHCLKSource_HSE);
    
        // 配置 ETH 引脚
        GPIO_InitTypeDef GPIO_InitStruct;
        __HAL_RCC_ETH_CLK_ENABLE();
    
        // PA1, PA2, PA3, PA4, PA5, PA6, PA7, PA8 用于 ETH
        GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 |
                             GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
        // 启动 ETH
        if (HAL_ETH_Start(&heth) != HAL_OK)
        {
            Error_Handler();
        }
    }
    

    五、总结

    | 问题点 | 解决方案 | |--------|----------| | ETH 时钟配置错误 | 检查并设置正确的 ETH 时钟(125MHz) | | GPIO 配置错误 | 根据 GD32F407VET6 的手册修改 ETH 引脚配置 | | MAC 地址错误 | 设置唯一的 MAC 地址 | | LWIP 配置错误 | 检查 DHCP 或静态 IP 配置 | | 调试信息缺失 | 添加串口打印,定位问题 |


    如有更多具体错误日志或代码片段,可进一步分析。希望以上内容能帮助你解决问题!

    评论

报告相同问题?

问题事件

  • 创建了问题 7月30日