ETH 配置EHT_RST引脚 ( i$ j) j! C+ {. j% g LWIP + X- ]! d/ g* K* `& F% N 注意一定要把LWIP_NETIF_LINK_CALLBACK选上,不然连接状态改变不能进入拔下或者插入网线回调函数,里面做一点自己的事情 : E, @4 `! \& c( r6 m/ i LAN8742 MPU# ?4 [) ^/ E- g+ y$ u" |- V Lwip使用DMA传递信息,对应的DMA内存定义在sram中。H7的sram分为好几段,高速段为cpu独享,通俗点说就是这一段允许用户编写的程序使用,但是不允许DMA使用。所以为DMA定义的内存或者数组要避开这一段。另外Lwip使用DMA时存在交互存取问题,避开这一段后,也不能让cpu像使用普通cache那样乱序使用,否则将可能出现严重问题。很多人用F7、H7和Lwip协议栈都出现ping不通的现象,都是内存管理问题。怎样管理??需要使用内存守护单元MPU。7 _% E3 m. L6 k/ @: y) D/ ]. P 使用CubeMX配置MPU,最多可以管理16段。为lwip配置,管理两段即可。0 l' _" E2 }9 D7 R * j: ]% v, d6 `* T& x, h1 U" \4 w j * |2 A0 V$ Z! O MPU设定总结(非操作步骤) 总结一下这样做的原因与目的:) F2 `! I! s5 ]. z8 ` (1)Lwip不被允许使用cpu专用的高速L1缓存(DTCM),只能用D2 Sram区域;" b$ H- `$ p1 d0 r! x/ Q( x (2)cpu可以无序访问cache,为防止这种情况,Lwip的DMA段必须是device类型或者Strongly-ordered类型,保证有序; (3)通过MPU配置这段cache,其中一段允许share、允许buffer,长度为256Byte,放TXRX交互存取头;另外一段不share,不buffer,不cache;长度32k。" K& |! a* M' @' R5 \$ [ 9 |+ W* O; W; r MPU选项含义(非操作步骤) cubeMX里面配置TEX、C、B,三者搭配。( z X4 w3 Y; y$ O6 u) i 4 o: U- g0 n+ y$ P' h, W7 P3 `7 E3 B . w( ^: f2 g. n3 M% x: f8 X# v 6 ?: N5 F9 y( D6 K Access permission被定义为3,即Full access。& T& C; P6 I! s) m/ @0 m- h0 {% u 9 P+ M. _8 i( P* | 经过上面的配置,编译下载,不出意外不用写任何代码就可以ping通了。 6 E7 u% \ ?4 P 好了,可以进行下一步! @2 y4 L) e* n $ d8 O* D8 c* p; w3 }/ J" X7 x Lwip协议栈TCP保活(KeepAlive)设定# l B& u9 v3 A/ v 万事具备了么?no!+ v& n9 l- o# U1 o: Z6 } 以上只解决了异常自动重连的问题,并不等于协议栈具备检测异常的能力。即H7必须知道网线是在什么时候被拔掉。2 H# R- e) a8 E # F& x v& E0 M% ]# o4 y9 C 有很多博客都提到KeepAlive的开启方法,但都是详细说明怎样打开,打开了该怎么用就没说。。。+ c9 T) @: D! @+ _4 X9 p7 Z * z6 i5 g* i; {7 \' P/ N2 b; W+ a 由于tcp是可靠连接,有数据往来的时候能够检测异常,需要解决的是无数据检测。这就要用到TCP协议的KeepAlive功能,原理就是在空闲的时候,以一定的频率发空数据包给服务器,服务器收到后答复一个数据包,说白了又把空闲段给变成有数据往复状态了。TCP协议栈包含KeepAlive,lwip协议栈这部分也没少,启用几个宏即可自动进行收发。设定方法为:在lwipopts.h后面加入( o/ v- { j9 j U% t) f, O( j" s1 M
tcpecho.c中实例化netconn后,为其tcp成员加入SPF_KEEPALIVE属性。
这样就能实时检测连接状态了。使用wireshark抓取数据是下图的样子,里面可以看到空闲时段交互的keepalive数据包。( m2 g6 i1 `( Q0 E 电脑IP :192.168.0.99+ X6 Y' w6 s! T8 d' T 单片机IP :192.168.0.805 \: z) H5 `) c" D |! r# o 自动化流程为:/ I( f1 b! _2 t: z$ | 拔掉网线------进入回调函数销毁tcp资源------主程序while循环连接出错------主程序销毁netconn资源------主程序实例化新的netconn资源------再次连接6 [3 a2 k4 M1 i% a 如此往复… $ I8 K; J' e0 z, H/ E 用STM32CubeMX 生成了一个包含 EHT ,Lwip 的项目,调试一直不正常,经仔细检查存在以下问题:; r, ^2 V$ q7 o7 u 1.硬件采用了LAN8720A ,但是STM32CubeMX 生成的是LAN8742A的代码,必须根据硬件连接更改地址。 解决办法: 在 …Src ethernetif.c 修改如下:+ I7 V9 M! A! E" B : K0 v6 L# j3 ~! r( y8 D
2.初始化时必须对LAN8720A 进行硬件复位。. D, s+ ^$ p7 A' d, ` 解决办法:9 Z4 K, |2 X4 `" p1 b 0 y. _' Q7 l3 R- Z7 ^+ e, k/ Y* H 分配一个 GPIO 连接LAN8720A的复位端,在 …Src ethernetif.c 修改如下: , [; F9 c1 V7 u) K! t2 f
2 ^; B; I( X6 F$ [% Z& H$ m 8 T" E1 T1 L; R/ s; X |
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重定向实现方法及常见问题