
ETH 2 ? F. u, Y5 Q1 O8 b ![]() ![]() ![]() 9 |/ m) T) e) R9 n2 a 配置EHT_RST引脚 ( q4 k/ C+ U6 s6 |/ M2 q ![]() % ]2 p/ B e- Y2 P% Z LWIP 2 K& O0 u+ z" x* A ![]() 6 H* C7 c- T4 n: V. N( _3 }- `0 F ![]() 注意一定要把LWIP_NETIF_LINK_CALLBACK选上,不然连接状态改变不能进入拔下或者插入网线回调函数,里面做一点自己的事情" X' C! S0 [0 }9 V) k% z. G 9 r' g9 m) F' X ![]() 2 c) {1 n$ p; {, V/ f' F: W8 @7 d) J LAN8742 ![]() # W5 ?8 H9 ~- E3 }! V; L: t4 J MPU Lwip使用DMA传递信息,对应的DMA内存定义在sram中。H7的sram分为好几段,高速段为cpu独享,通俗点说就是这一段允许用户编写的程序使用,但是不允许DMA使用。所以为DMA定义的内存或者数组要避开这一段。另外Lwip使用DMA时存在交互存取问题,避开这一段后,也不能让cpu像使用普通cache那样乱序使用,否则将可能出现严重问题。很多人用F7、H7和Lwip协议栈都出现ping不通的现象,都是内存管理问题。怎样管理??需要使用内存守护单元MPU。 使用CubeMX配置MPU,最多可以管理16段。为lwip配置,管理两段即可。+ Y+ N* P. O$ V' }; s- X) }) C ; }5 w9 B$ l, |, Z! ^9 L ![]() , e! L) W% w) Q& j/ W m# |' D% T ![]() & K+ e5 N0 B0 w K+ w ![]() 1 p' T! [2 ^+ B" M3 y2 O/ `7 ]8 A MPU设定总结(非操作步骤) 总结一下这样做的原因与目的: (1)Lwip不被允许使用cpu专用的高速L1缓存(DTCM),只能用D2 Sram区域;, D9 i6 r( \& V0 N5 Q; Z* b (2)cpu可以无序访问cache,为防止这种情况,Lwip的DMA段必须是device类型或者Strongly-ordered类型,保证有序;* H+ a; e. m. A. n* @4 P (3)通过MPU配置这段cache,其中一段允许share、允许buffer,长度为256Byte,放TXRX交互存取头;另外一段不share,不buffer,不cache;长度32k。4 G" a0 K" W; g" M: w 9 r6 z8 _8 \7 z4 B ![]() MPU选项含义(非操作步骤) cubeMX里面配置TEX、C、B,三者搭配。 6 U! l/ L# t. N0 \, G* G$ z ![]() ! V y7 g/ J+ t R2 X% V' h, S5 |* e. ` Access permission被定义为3,即Full access。 + g% J" u- Y# ^0 t6 T0 Q; s ![]() 经过上面的配置,编译下载,不出意外不用写任何代码就可以ping通了。 $ G) T+ D2 \5 K$ t$ \ 好了,可以进行下一步! ) ]+ B( `8 Y$ J( r+ y Lwip协议栈TCP保活(KeepAlive)设定 E8 x: E: _& [ 万事具备了么?no!7 l. u9 Y+ }0 _9 ?$ m $ Y9 X- }) _3 g6 U$ H/ a! T7 ~ 以上只解决了异常自动重连的问题,并不等于协议栈具备检测异常的能力。即H7必须知道网线是在什么时候被拔掉。 有很多博客都提到KeepAlive的开启方法,但都是详细说明怎样打开,打开了该怎么用就没说。。。 ^' i( d7 M4 ?6 Y" q4 r; c 由于tcp是可靠连接,有数据往来的时候能够检测异常,需要解决的是无数据检测。这就要用到TCP协议的KeepAlive功能,原理就是在空闲的时候,以一定的频率发空数据包给服务器,服务器收到后答复一个数据包,说白了又把空闲段给变成有数据往复状态了。TCP协议栈包含KeepAlive,lwip协议栈这部分也没少,启用几个宏即可自动进行收发。设定方法为:在lwipopts.h后面加入2 }7 _! k2 n* q/ r: Z8 t2 s 4 a; H" k* Z0 D* T( d% P
tcpecho.c中实例化netconn后,为其tcp成员加入SPF_KEEPALIVE属性。
这样就能实时检测连接状态了。使用wireshark抓取数据是下图的样子,里面可以看到空闲时段交互的keepalive数据包。1 \) b* X& ^, b4 {" Q 电脑IP :192.168.0.99$ K/ E2 t0 d8 ^ m9 T: u" G 单片机IP :192.168.0.80 ![]() 自动化流程为: 拔掉网线------进入回调函数销毁tcp资源------主程序while循环连接出错------主程序销毁netconn资源------主程序实例化新的netconn资源------再次连接4 J: w1 r8 n! \; [ 如此往复… & [: a0 c k# i2 A 用STM32CubeMX 生成了一个包含 EHT ,Lwip 的项目,调试一直不正常,经仔细检查存在以下问题:8 K6 p& o0 Z7 J4 L 1.硬件采用了LAN8720A ,但是STM32CubeMX 生成的是LAN8742A的代码,必须根据硬件连接更改地址。 解决办法: 在 …Src ethernetif.c 修改如下:" R4 h) {9 T4 J" o+ c1 y- { 9 }4 e7 d( s$ D: I
2.初始化时必须对LAN8720A 进行硬件复位。 解决办法:% Y t& F8 h, W5 m$ c 分配一个 GPIO 连接LAN8720A的复位端,在 …Src ethernetif.c 修改如下:7 ~1 r' d! T" O' U8 _2 v v* m' ?; n* z: W2 k
" v0 T) E( G. h6 v$ S 4 m2 W' w2 A- B9 Q8 A4 i7 H |
【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解决方案