ST意法半导体
直播中

幽默

10年用户 887经验值
擅长:362163
私信 关注
[问答]

STM32F767 LWIP无法ping通怎么解决?

使用cubeMX基于最新的1.17.2的软件包,产生了nucleo F767的lwip实例工程,根据自己的板子改了外设代码后, 实例工程编译的程序能正常在板子上运行.
但是重新创建一个新的空的工程, 把实例工程的代码全部添加进来, 没有做任何修改. 结果freertos能正常运行, 但是网络一直无法ping通.
有什么建议吗? 还有哪些地方没有检查吗? 谢谢.

回帖(2)

周敏

2025-3-14 15:01:33
参考提醒:


注意堆栈大小的设置;


以太网接收中断的优先级配置要合理。设置为较高优先级,但数值大于
configMAX_SYSCALL_INTERRUPT_PRIORITY。


比方 如果 configMAX_SYSCALL_INTERRUPT_PRIORITY 设置为 5,可以将以太网接收中断优先级设置为 6。
举报

hsdou月半

2025-3-20 18:08:54

针对无法ping通的问题,以下是需要逐步检查和排查的要点:




1. 对比CubeMX配置



  • 确保.ioc文件配置一致:使用Beyond Compare等工具对比示例工程和新工程的.ioc文件,检查以下配置:

    • 时钟树(Clock Configuration):HCLK、PCLK1/2、ETH时钟(需为25/50MHz)。

    • 引脚复用(Pinout):确认RMII接口(REF_CLK、CRS_DV、RXD0/RXD1、TXD0/TXD1)和PHY复位引脚是否正确映射。

    • ETH外设配置

    • PHY地址(例如LAN8742通常为0x00或0x01)。

    • 是否启用Auto Negotiation。

    • DMA描述符数量和缓冲区大小。

    • FreeRTOS配置:任务堆栈大小(尤其是网络相关任务)。





2. 检查时钟配置



  • HSE/LSE时钟源:确认外部晶振频率与硬件一致(如8MHz或25MHz)。

  • ETH时钟:RMII的REF_CLK必须由外部PHY或MCU提供50MHz信号。检查:
    // 在stm32f7xx_hal_conf.h中确认ETH时钟源
    #define ETH_TX_CLK_SOURCE ETH_TX_CLK_SEL_PLL

  • 使用示波器测量REF_CLK引脚是否有50MHz信号。




3. PHY芯片初始化



  • PHY型号与驱动匹配:确认代码中使用的PHY驱动(如LAN8742)与实际硬件一致。

  • PHY复位引脚
    // 示例中可能通过HAL_GPIO_WritePin控制复位
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
    HAL_Delay(100);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);

  • PHY寄存器检测
    // 在ethernetif.c中检查链路状态
    if (HAL_ETH_ReadPHYRegister(&heth, PHY_BSR, ®value) != HAL_OK) { /* Error */ }
    if (regvalue & PHY_LINKED_STATUS) { /* 链路已连接 */ }




4. 内存与堆栈配置



  • Heap/Stack设置

    • 增大FreeRTOS堆大小(configTOTAL_HEAP_SIZE)。

    • 检查lwipopts.h中的内存池配置(如MEMP_NUM_PBUF, PBUF_POOL_SIZE)。


  • 链接脚本(.ld文件):确认RAM区域分配正确,尤其是ETH DMA描述符使用的内存区域(如0x30000000)。




5. 中断与DMA配置



  • ETH中断优先级:确保ETH中断已启用且优先级合理(避免被FreeRTOS任务阻塞)。

  • DMA描述符对齐
    // 在ethernetif.c中,确认描述符地址对齐到32字节
    __ALIGNED(32) ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT];
    __ALIGNED(32) ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT];




6. 调试与日志



  • 启用LWIP调试
    // 在lwipopts.h中启用调试
    #define LWIP_DEBUG 1
    #define ETHARP_DEBUG LWIP_DBG_ON
    #define NETIF_DEBUG LWIP_DBG_ON

  • 打印PHY寄存器:在初始化时读取PHY的ID寄存器(如PHY_ID1/PHY_ID2),确认通信正常。




7. 网络连接状态



  • 物理链路检测

    • 检查网线是否插好,PHY的Link/Act指示灯是否亮起。

    • 在代码中轮询链路状态:
      if (netif_is_link_up(&gnetif)) {
      // 链路已连接
      }





8. 其他潜在问题



  • MAC地址冲突:确保生成的MAC地址唯一。

  • 防火墙/路由器设置:尝试关闭电脑防火墙,或更换路由器测试。

  • 硬件焊接问题:检查RMII相关引脚是否有虚焊或短路。




总结步骤



  1. 对比CubeMX配置:确保所有外设参数一致。

  2. 测量时钟信号:确认REF_CLK和PHY时钟正常。

  3. 检查PHY初始化:通过寄存器读取验证PHY通信。

  4. 启用LWIP调试:定位初始化失败的具体位置。

  5. 验证内存配置:排除堆栈或内存池不足的问题。


通过以上步骤,应能定位到导致无法ping通的根本原因。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分