
ETH8 D( s! W0 z; b 6 j( S8 _. u& ^ ![]() ) _! I8 H+ ~) D4 u: `( U+ I ![]() , j. h$ \+ q3 [* S1 s+ e3 \ | ![]() 配置EHT_RST引脚' a) o- O1 E( E" G ![]() 6 n+ s( t% x+ p1 T) } LWIP3 ]# X) ?' K% r g! f * v8 N1 s+ x$ w/ Z m* w ![]() m' g6 H/ a1 O! {1 ~$ b ![]() # {* l! `1 [5 R6 ? 注意一定要把LWIP_NETIF_LINK_CALLBACK选上,不然连接状态改变不能进入拔下或者插入网线回调函数,里面做一点自己的事情 ![]() LAN8742 ![]() , n6 D @7 U% a1 b$ b7 I0 C MPU+ O A+ I$ T8 s0 d" k; m Lwip使用DMA传递信息,对应的DMA内存定义在sram中。H7的sram分为好几段,高速段为cpu独享,通俗点说就是这一段允许用户编写的程序使用,但是不允许DMA使用。所以为DMA定义的内存或者数组要避开这一段。另外Lwip使用DMA时存在交互存取问题,避开这一段后,也不能让cpu像使用普通cache那样乱序使用,否则将可能出现严重问题。很多人用F7、H7和Lwip协议栈都出现ping不通的现象,都是内存管理问题。怎样管理??需要使用内存守护单元MPU。- Y" N6 b$ l- H0 _5 J& R2 M/ a 使用CubeMX配置MPU,最多可以管理16段。为lwip配置,管理两段即可。, {4 e$ B: C9 M1 S/ Y/ a/ k# c ![]() ![]() % P( [' W9 @6 ]* Z) G$ P9 Q" Z; A ![]() * e# O# p1 N% E: m/ T* t, v/ T P - ?4 p, r6 n0 [/ j' e- [; @ MPU设定总结(非操作步骤)) M- Y+ ^4 C7 r! k2 F5 ` 总结一下这样做的原因与目的: (1)Lwip不被允许使用cpu专用的高速L1缓存(DTCM),只能用D2 Sram区域;" }( G8 Q$ e( J" [ (2)cpu可以无序访问cache,为防止这种情况,Lwip的DMA段必须是device类型或者Strongly-ordered类型,保证有序; (3)通过MPU配置这段cache,其中一段允许share、允许buffer,长度为256Byte,放TXRX交互存取头;另外一段不share,不buffer,不cache;长度32k。 w0 I6 N+ ]+ ?. k8 g# F ![]() + h5 C1 |4 b+ K MPU选项含义(非操作步骤) f) R. }# E9 J9 U& A cubeMX里面配置TEX、C、B,三者搭配。 E: X, W3 x+ I/ ~+ o& {' a3 | C d0 O7 S1 M! J6 f: A ![]() ! R; t/ i- \2 j/ Z' i2 T; |- s4 [, | 4 ?) o- T( [7 O; o Access permission被定义为3,即Full access。+ |+ \& _" j! F5 a5 }& r $ _! Z. P1 T5 x5 [/ _% c* V+ k ![]() 经过上面的配置,编译下载,不出意外不用写任何代码就可以ping通了。3 t% R* i8 j d; s/ `. d 3 @' s" M0 m$ W w: N8 s$ m' ^# Y- | 好了,可以进行下一步!- E2 L8 h, f( `3 ^) d3 c Lwip协议栈TCP保活(KeepAlive)设定 万事具备了么?no!2 r4 I! [" C+ W 以上只解决了异常自动重连的问题,并不等于协议栈具备检测异常的能力。即H7必须知道网线是在什么时候被拔掉。- i4 j- ?* J5 E/ j+ h s " |- o" v' u* _8 E5 I& S 有很多博客都提到KeepAlive的开启方法,但都是详细说明怎样打开,打开了该怎么用就没说。。。 " H- B2 g) L. h7 o- q9 |* h 由于tcp是可靠连接,有数据往来的时候能够检测异常,需要解决的是无数据检测。这就要用到TCP协议的KeepAlive功能,原理就是在空闲的时候,以一定的频率发空数据包给服务器,服务器收到后答复一个数据包,说白了又把空闲段给变成有数据往复状态了。TCP协议栈包含KeepAlive,lwip协议栈这部分也没少,启用几个宏即可自动进行收发。设定方法为:在lwipopts.h后面加入( u! Z- ~0 ~1 p; u 1 _6 j6 n5 n; X
tcpecho.c中实例化netconn后,为其tcp成员加入SPF_KEEPALIVE属性。
这样就能实时检测连接状态了。使用wireshark抓取数据是下图的样子,里面可以看到空闲时段交互的keepalive数据包。 电脑IP :192.168.0.99 单片机IP :192.168.0.80; W! v& v4 x. S- ?& Z0 B - q" O6 k; X; P8 F' j7 N' x! B6 | ![]() & c- e; @$ ^! w4 C 自动化流程为:# D' h/ p% G6 A3 f- w 拔掉网线------进入回调函数销毁tcp资源------主程序while循环连接出错------主程序销毁netconn资源------主程序实例化新的netconn资源------再次连接 如此往复… ) z8 u9 M0 K; \ 用STM32CubeMX 生成了一个包含 EHT ,Lwip 的项目,调试一直不正常,经仔细检查存在以下问题:: B. l- p- f5 R% l; \: _$ s 1.硬件采用了LAN8720A ,但是STM32CubeMX 生成的是LAN8742A的代码,必须根据硬件连接更改地址。 解决办法: 在 …Src ethernetif.c 修改如下:$ ?; F+ Z' |) E$ ~* A7 N
2.初始化时必须对LAN8720A 进行硬件复位。5 y, x0 U( Y4 S0 ~+ ] 解决办法:0 q+ S R; x' ^# m6 b % k4 n* b2 T) L& T 分配一个 GPIO 连接LAN8720A的复位端,在 …Src ethernetif.c 修改如下: & W+ U- \4 J" Q' @: z
" d2 L3 O; ^/ q4 [. ^* n |
【Wio Lite AI视觉开发套件】+移植TensorFlow Lite
STM32H745I-DISCO脉冲宽度调制(PWM)
STM32H745I-DISCO串口通信,输入输出
拷打cubemx【002】——自定义还需基于芯片的工程
STM32硬件结构学习
STM32中BOOT的作用
STM32H7的TCM,SRAM等五块内存基础知识
STM32H7的TCM,SRAM等五块内存基础知识
简单了解一下STM32H7的BDMA
有奖预约 | STM32H7R7基于RT-Thread RTOS的智能终端GUI解决方案