硬汉嵌入式论坛

 找回密码
 立即注册
查看: 293|回复: 10
收起左侧

[以太网] STM32H723移植LWIP 无法ping通

[复制链接]

4

主题

20

回帖

32

积分

新手上路

积分
32
发表于 2025-4-15 10:27:01 | 显示全部楼层 |阅读模式
本帖最后由 Ainit 于 2025-4-15 10:49 编辑

芯片:STM32H723ZGT6
PHY芯片:LAN8720A
STM32CUBEMX版本: 6. 13.0
固件包版本:STM32CUBE_H7_FW_1.12.1
使用STM32CUBEMX自动生成lwip,测试后发现怎么都无法ping通,配置按照官方提供的例程。基本配置如下所示,测试过程,读取PHY芯片ID能够读到数据,确定PHY芯片驱动是正常的,有懂这方面的,还请不吝赐教。

时钟树配置.png rtos配置.png rcc配置.png MPU.png lwip.png ETH配置.png ETH_GPIO配置.png

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-4-15 11:58:04 | 显示全部楼层
除了ID,上电后,全双工,100M等信息能正常获取不。

这个正常后,就是MPU/Cache的设置排查下。
回复

使用道具 举报

4

主题

20

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 2025-4-15 15:58:59 | 显示全部楼层
eric2013 发表于 2025-4-15 11:58
除了ID,上电后,全双工,100M等信息能正常获取不。

这个正常后,就是MPU/Cache的设置排查下。

你好,初始化上电后,运行读取到PHY芯片ID号,状态信息如下所示。并且按照STM32官方demo配置的lwip和RTOS出现如下的情况,网线一直是接STM32板子和PC端的:
1、初始化完HAL_ETH_Init()后读取PHY芯片ID号和状态值。复位PHY芯片
[C] 纯文本查看 复制代码
  hal_eth_init_status = HAL_ETH_Init(&heth);

  uint32_t reg_id = 0;
  HAL_ETH_ReadPHYRegister(&heth, 0x0, 0x02, &reg_id);
  printf("reg_id = 0x%08x\n", reg_id);
  uint32_t reg_status = 0;
  HAL_ETH_ReadPHYRegister(&heth, 0x0, 0x01, &reg_status);
  printf("reg_status = 0x%08x\n", reg_status);

结果读取:
[C] 纯文本查看 复制代码
reg_id = 0x00000243
reg_status = 0x00007849

2、读取PHY芯片的链接状态:
[C] 纯文本查看 复制代码
 PHYLinkState = LAN8742_GetLinkState(&LAN8742);
    printf("PHYLinkState = %d\n", PHYLinkState);

结果为:
[C] 纯文本查看 复制代码
PHYLinkState = 1

3、最后有一个创建线程出错,无法正常创建以太网连接线程
[C] 纯文本查看 复制代码
 /* Create the Ethernet link handler thread */
  /* USER CODE BEGIN H7_OS_THREAD_DEF_CREATE_CMSIS_RTOS_V1 */
  osThreadDef(EthLink, ethernet_link_thread, osPriorityNormal, 0,
              configMINIMAL_STACK_SIZE * 4);

  osThreadId ethThreadId = osThreadCreate(osThread(EthLink), &gnetif);
  if (ethThreadId == NULL) {
    printf("Thread creation failed! Possible reasons:\n");
    printf("1. Insufficient heap (current heap free: %d bytes)\n",
           xPortGetFreeHeapSize());
    printf("2. Stack too small / priority invalid\n");
    printf("3. RTOS scheduler not running?\n");
  }
  /* USER CODE END H7_OS_THREAD_DEF_CREATE_CMSIS_RTOS_V1 */

结果为:
[C] 纯文本查看 复制代码
Thread creation failed! Possible reasons:
1. Insufficient heap (current heap free: 6880 bytes)
2. Stack too small / priority invalid
3. RTOS scheduler not running?
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2025-4-15 18:45:52 | 显示全部楼层
我也是无法ping通,会一直进入到HAL_ETH_GetDMAError(handlerEth) & ETH_DMACSR_RBU,不知道什么原因
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2025-4-16 00:46:36 | 显示全部楼层
我的问题已经解决了,用了厂家的库,我看了大体上没什么区别,就是PHY是直接写的LAN8720,我将描述符改成自己的也能ping通,不是MPU等问题,
区别可能就是lwipopts.h里PBUF_POOL_BUFSIZE不是直接写成了1536(比1536少几个没开启的头部),使用了LWIP_PROVIDE_ERRNO,
同时将LWIP_MEMPOOL_DECLARE(RX_POOL, ETH_RX_BUFFER_CNT, sizeof(RxBuff_t), "Zero-copy RX PBUF pool")这段zero-copy的buffer未指定位置,免去了MPU的麻烦,
还有就是LWIP_RAM_HEAP_POINTER没指定,也免去了MPU的麻烦,简单直接的放在了AXI SRAM里(不知道厂家考没考虑过cache的问题)

可能就是LAN8742不能直接用给LAN8720,裸机的时候可能用不到太多PHY的功能?
回复

使用道具 举报

4

主题

20

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 2025-4-16 10:34:31 | 显示全部楼层
chenfs 发表于 2025-4-15 18:45
我也是无法ping通,会一直进入到HAL_ETH_GetDMAError(handlerEth) & ETH_DMACSR_RBU,不知道什么原因

我这边测试可以读取phy芯片的ID,速度,全双工/半双工模式,并且可以通过写寄存器方式修改速度和模式,但是奇怪的地方是依旧无法ping通。
[C] 纯文本查看 复制代码
ethernet_link_thread PHYLinkState = 3
ETH Link UP! Speed: 100M, Duplex: Half
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-4-16 12:08:22 | 显示全部楼层
Ainit 发表于 2025-4-15 15:58
你好,初始化上电后,运行读取到PHY芯片ID号,状态信息如下所示。并且按照STM32官方demo配置的lwip和RTOS ...

这个提示是FreeRTOS的heap大小开小了,加大也不行吗
回复

使用道具 举报

4

主题

20

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 2025-4-16 13:53:26 | 显示全部楼层
eric2013 发表于 2025-4-16 12:08
这个提示是FreeRTOS的heap大小开小了,加大也不行吗

修改了rtos的heap,可以正常工作,目前读取到PHY芯片ID,还有以太网速度,全双工或者半双工模式,并且我使用设置速度和模式,能正常写入寄存器。通过PC端ping还是会有问题。我测试了很多中不同的MPU配置,但是实际上没有明显效果。如下mpu/eth/ld文件配置:
eth配置.png ld配置.png mpu配置.png
回复

使用道具 举报

4

主题

20

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 2025-4-16 15:10:44 | 显示全部楼层
chenfs 发表于 2025-4-16 00:46
我的问题已经解决了,用了厂家的库,我看了大体上没什么区别,就是PHY是直接写的LAN8720,我将描述符改成自 ...

老哥可以发一份你调通的工程让我参考学习一下吗?
回复

使用道具 举报

4

主题

20

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 2025-4-16 17:35:17 | 显示全部楼层
本问题已经解决,使用官方STM32CUBEMX生成的代码,能正常ping通。以下为具体的工程配置详情。具体需要注意的地方如下
1、MPU配置,完全按照STM32H723ZGT6官方demo配置。
2、eth配置:地址也完全跟官方配置一致。
3、lwip配置中LWIP_RAM_HEAP_POINTER 的地址要跟官方demo一致。
4、链接脚本文件,跟官方demo一致,并且我个人建议跟eth配置的地址保持一致。
eth配置.png eth配置1.png ld配置.png lwip配置.png mpu配置.png rtos配置.png 时钟树配置.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-4-17 09:42:31 | 显示全部楼层
Ainit 发表于 2025-4-16 17:35
本问题已经解决,使用官方STM32CUBEMX生成的代码,能正常ping通。以下为具体的工程配置详情。具体需要注意 ...

谢谢告知最终原因
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-26 02:00 , Processed in 0.292104 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表