stm32利用lwip实现以太网热插拔

在使用lwip时,关于以太网热插拔问题可以归类为一下几种问题:
(1):单片机启动前未插网线,启动后死活连不上。
(2):在使用过程中拔掉网线后,不复位或者重启的话,ping不通并且调试软件连不上。

原因:由于未检测到网络,导致自动协商、连接状态等超时后,执行语句return ETH_ERROR;从而导致程序后半部分的初始化程序未执行,例如MAC的配置语句未执行。
简而言之就是初始化未完成。

有一个简单粗暴,比较快的,一劳永逸的办法(虽然感觉不是特别好,但是真的很粗暴很快乐!):
将stm324x7_eth.c文件的ETH_Init()函数中的return ETH_ERROR;给屏蔽掉。
例如

// do
    {
      timeout++;
    } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO));  

    /* Return ERROR in case of timeout */
    if(timeout == PHY_READ_TO)
    {
      //return ETH_ERROR;/*****自动协商超时**************/
    }

将return ETH_ERROR()屏蔽即可,屏蔽掉并不会影响程序的执行和初始化。

同时也不要把main()函数中的lwip_comm_init(和tcp_server_init()放在while 中,会导致因为有返回值一直初始化。
stm32利用lwip实现以太网热插拔_第1张图片
因为修改的是底层文件,所以无论有无操作系统,都是比较方便的方法,虽然不是特别好的方法。

你可能感兴趣的:(lwip,单片机)