ETH4 `, D- {( x3 _ d5 f 9 [. t$ L9 x& f3 F ! U& g* p" b3 u3 M- `9 W4 {8 ] 配置EHT_RST引脚. H8 w3 w! _* z4 x) Q% J; p 0 Z! v$ {/ O: P. I3 i # r6 n# o- E/ O- w. P7 T$ _ LWIP* Q6 D6 k+ D) B1 ~1 E# J7 I, L . k3 U5 S# ~3 O( _ 4 ?) G `' A" i7 @7 G5 w# `6 q 注意一定要把LWIP_NETIF_LINK_CALLBACK选上,不然连接状态改变不能进入拔下或者插入网线回调函数,里面做一点自己的事情 8 V* X; m! w5 K Q5 b. w LAN8742 MPU* p6 Y2 M* _! p: ^ Lwip使用DMA传递信息,对应的DMA内存定义在sram中。H7的sram分为好几段,高速段为cpu独享,通俗点说就是这一段允许用户编写的程序使用,但是不允许DMA使用。所以为DMA定义的内存或者数组要避开这一段。另外Lwip使用DMA时存在交互存取问题,避开这一段后,也不能让cpu像使用普通cache那样乱序使用,否则将可能出现严重问题。很多人用F7、H7和Lwip协议栈都出现ping不通的现象,都是内存管理问题。怎样管理??需要使用内存守护单元MPU。 使用CubeMX配置MPU,最多可以管理16段。为lwip配置,管理两段即可。7 {" _; l) W% A- l9 a % F# I; `2 C6 s: N 1 j+ F# g- C0 g; ~: O* L " Q* ?1 N+ V# m* Q" R MPU设定总结(非操作步骤) 总结一下这样做的原因与目的:+ H3 U( C/ Y) }/ Y. R/ t (1)Lwip不被允许使用cpu专用的高速L1缓存(DTCM),只能用D2 Sram区域;& `6 G% C6 T$ G+ i4 O2 u (2)cpu可以无序访问cache,为防止这种情况,Lwip的DMA段必须是device类型或者Strongly-ordered类型,保证有序;" b* _/ W* J. [8 N (3)通过MPU配置这段cache,其中一段允许share、允许buffer,长度为256Byte,放TXRX交互存取头;另外一段不share,不buffer,不cache;长度32k。 6 ~* q! _$ }& x3 h* e. x MPU选项含义(非操作步骤)6 J; ^; s" ~9 c* X cubeMX里面配置TEX、C、B,三者搭配。 / l. B) S, i4 v9 y! j 1 O1 T- c. [. d! o8 r; `% t' B Access permission被定义为3,即Full access。" `2 ^1 M8 ? O# D 3 D8 q# y& T5 K( ]0 H" F 经过上面的配置,编译下载,不出意外不用写任何代码就可以ping通了。0 u0 h5 L$ G8 e; l8 D' [ 7 o; U' g2 X1 R 好了,可以进行下一步! Lwip协议栈TCP保活(KeepAlive)设定9 {) Q1 J% r) M) q, Z2 k+ X" T 万事具备了么?no! 以上只解决了异常自动重连的问题,并不等于协议栈具备检测异常的能力。即H7必须知道网线是在什么时候被拔掉。 $ P1 j/ P1 p7 E4 |5 f3 ? 有很多博客都提到KeepAlive的开启方法,但都是详细说明怎样打开,打开了该怎么用就没说。。。 由于tcp是可靠连接,有数据往来的时候能够检测异常,需要解决的是无数据检测。这就要用到TCP协议的KeepAlive功能,原理就是在空闲的时候,以一定的频率发空数据包给服务器,服务器收到后答复一个数据包,说白了又把空闲段给变成有数据往复状态了。TCP协议栈包含KeepAlive,lwip协议栈这部分也没少,启用几个宏即可自动进行收发。设定方法为:在lwipopts.h后面加入( \- ]' m; N: Q5 b
tcpecho.c中实例化netconn后,为其tcp成员加入SPF_KEEPALIVE属性。
这样就能实时检测连接状态了。使用wireshark抓取数据是下图的样子,里面可以看到空闲时段交互的keepalive数据包。 电脑IP :192.168.0.99( @& X1 l; t$ e5 B( w: t 单片机IP :192.168.0.80* x) n* w3 C" D- t k1 T; G & B) I6 H- J8 m, M. ` ) [( f2 j/ B1 P7 E 自动化流程为:6 [' J6 D6 F! i3 ]" K 拔掉网线------进入回调函数销毁tcp资源------主程序while循环连接出错------主程序销毁netconn资源------主程序实例化新的netconn资源------再次连接 如此往复…, o7 g" i2 a' _2 F j/ j3 b5 V" p& q% b 用STM32CubeMX 生成了一个包含 EHT ,Lwip 的项目,调试一直不正常,经仔细检查存在以下问题: 1.硬件采用了LAN8720A ,但是STM32CubeMX 生成的是LAN8742A的代码,必须根据硬件连接更改地址。+ O! b3 {5 W S; H 解决办法: 在 …Src ethernetif.c 修改如下:- E3 I9 \1 {% h & N! }; m6 l# p
2.初始化时必须对LAN8720A 进行硬件复位。2 y, P& b6 |% S) X3 q% { 解决办法:, Z) _7 f6 f# c6 {6 Q, | 1 T3 ~2 t* m: r( D3 ?" R( R 分配一个 GPIO 连接LAN8720A的复位端,在 …Src ethernetif.c 修改如下:) w6 x6 e: g' Y4 Q- X+ ~0 k / M4 x7 F, j+ t, t9 {+ P
! F8 N* {. p- o' T: ^ |
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
【Wio Lite AI视觉开发套件】+cube.ai与食物识别
【STM32H7S78-DK】汽车仪表系统
【STM32H7S78-DK】基于 rtthread 适配 lcd 驱动移植 lvgl
【STM32H7S78-DK评测】TouchGFX (QR Code)二维码生成器
【STM32H7S78-DK】rtthread 增加 psram 内存管理
【STM32H7S78-DK】开箱与rtthread工程初体验
【STM32H7S78-DK评测】-5 LVGL&DMA2D DEMO测试
【STM32H7S78-DK评测】-4 LTDC&DMA2D 基本测试
【STM32H7S78-DK评测】CoreMark移植和优化--兼记printf重定向实现方法及常见问题