STM32F746ZG NUCLEO+Lwip+FREERTOS在不插网线无法完成网络初始化
如题:STM32F746ZG NUCLEO+Lwip+FREERTOS在不插网线无法完成网络初始化,主要表现在不插网线等待很长时间然后再插入网线硬件灯有反应但是网络无法ping通,或网络ping延迟很大无法使用
使用官网例程测试~~~~
中断有反应,请教用轮询的方式如何重新初始化ETH(DMA&MAC)? 你是使用DHCP的方法吧,如果使用固定IP的方法,无论什么时候插网线都可以的。
如果使用DHCP,中断有反应,就添加一个有网络数据的标志,
然后在轮询时,重新初始化一下DHCP(注意DHCP是要适当延时的。) 重新按照官方已知步骤检测,可能是被协议智能禁止了,去看看STM32F746网络初始化资料 预设配置可否用那 127.0.0.1 的 localhost(IANA) 保留回环 IP 地址来替代呢?
需要在程序中添加中断代码,当检测到网线连接状态的变化后,重新进行网络配置和PHY的配置。
方法:
网线连接的状态发生变化
查询的方式
应用程序周期性地去读取PHY的状态寄存器
中断的方式
PHY检测到连接状态发生变化后会产生中断;
应用程序接受到中断后,再去读PHY的状态寄存器确认状态
其他的原因引起的网络连接断开(比如程序跑飞…)
心跳包
处理方式:
网线断开
应用层的处理(释放内存,关闭连接)
关闭MAC, DMA
调用netif_set_down()
如果需要的话关闭DHCP
如果需要的话对PHY进行配置
网线重新连接
重新进行PHY自动协商
重新配置并启动MAC
重新配置网络(IP地址,DHCP…)
调用netif_set_up()
移植步骤
1. 将F756-EVALdemo中和TCP-echo Client相关的文件拷贝过来,添加到新工程中
app_ethernet.c,ethernetif.c,tcp_echoclient.c
app_ethernet.h、ethernetif.h,lwipopts.h,tcp_echoclient.h
添加LwIP协议栈文件到工程中(为节省时间已经先添加好),并修改编译配置,增 加两个寻找路径(LWIP的)
添加stm32f7xx_hal_eth.c文件到工程中
2. 在Main函数中添加:
lwip_init(),Netif_Config(), tcp_echoserver_init()
在while(1)中添加ethernetif_input(),sys_check_timeouts()
3. 在main.c中添加include,相关变量定义( gnetif;), Netif_Config的定义和声明
4. 在main.h中添加静态IP地址等的定义
5. 在stm32f7xx_hal_conf.h中uncomment:
#define HAL_ETH_MODULE_ENABLED
6. 在HAL_ETH_MspInit()中修改pin脚的定义
7.low_level_init()中修改EthHandle初始化参数,MII改为RMII
8.stm32f7xx_hal_conf.h中PHY的地址改为0,并修改EthHandle初始化参数中的PHY地址赋值
9. 修改stm32f7xx_hal_conf.h 中PHY的寄存器地址和mask
10. 删除
low_level_init中设置PHY中断的部分,因为没有用到
netif_config()函数中的netif_set_link_callback()
ethernetif_set_link()和ethernetif_update_config()函数的定义
你找一下以太网进阶培训_Part3 更换以太网PHY.pptx,然后第三十一页就是了 PING 的前提是同一子网,问题的关键还在于是否启用了DHCP客户端/服务器,这块LwIP里面的实现流程不一样,需要注意,看看这部分DHCP的实现机制,可以优化协商等待时间的。
某些等待流程是正常的。 帮7楼补充文档下载链接 :lol
https://www.stmcu.org.cn/document/detail/index/id-218811
页:
[1]