STMCU小助手
发布时间:2021-12-26 14:55
ETH
' c. e# D1 L3 D* G0 |
配置EHT_RST引脚 " q n0 i( ^ m& `# K. ?& {% I
$ Y' o+ i- s9 M3 {) V; R: r$ ?( L LWIP
! q# a1 c7 t6 U. b9 s1 v 注意一定要把LWIP_NETIF_LINK_CALLBACK选上,不然连接状态改变不能进入拔下或者插入网线回调函数,里面做一点自己的事情! B: N8 |2 b: K- ^ , Z: v( ?/ T' C( R; Y
* }0 G0 |1 t' ^# @ LAN8742
MPU Lwip使用DMA传递信息,对应的DMA内存定义在sram中。H7的sram分为好几段,高速段为cpu独享,通俗点说就是这一段允许用户编写的程序使用,但是不允许DMA使用。所以为DMA定义的内存或者数组要避开这一段。另外Lwip使用DMA时存在交互存取问题,避开这一段后,也不能让cpu像使用普通cache那样乱序使用,否则将可能出现严重问题。很多人用F7、H7和Lwip协议栈都出现ping不通的现象,都是内存管理问题。怎样管理??需要使用内存守护单元MPU。 使用CubeMX配置MPU,最多可以管理16段。为lwip配置,管理两段即可。2 R4 b3 h. C* \% Y( m3 x& Q) @& R
7 R" F" _( O; {+ J/ f$ |; i( U
/ s' N1 y2 [* y1 F
2 F3 J5 o+ D8 O9 ~. l MPU设定总结(非操作步骤)/ _! c7 X) C$ F' {/ d0 w 总结一下这样做的原因与目的:# E) D( ~ |8 `/ M (1)Lwip不被允许使用cpu专用的高速L1缓存(DTCM),只能用D2 Sram区域; (2)cpu可以无序访问cache,为防止这种情况,Lwip的DMA段必须是device类型或者Strongly-ordered类型,保证有序;4 L7 j; X6 u7 M8 U) c0 Y (3)通过MPU配置这段cache,其中一段允许share、允许buffer,长度为256Byte,放TXRX交互存取头;另外一段不share,不buffer,不cache;长度32k。 ' T- a8 |. E" n& S1 m) \
MPU选项含义(非操作步骤) cubeMX里面配置TEX、C、B,三者搭配。
, O3 s3 j$ k& ^4 a: f Access permission被定义为3,即Full access。* A: P) c$ C/ T6 L, p/ N3 f ' `8 b, Z3 ]3 {
经过上面的配置,编译下载,不出意外不用写任何代码就可以ping通了。 - J" F6 _# i4 l* N0 ]( P- ]+ n 好了,可以进行下一步! % |/ e) E# ~" I6 p0 Z. x2 D! d X Lwip协议栈TCP保活(KeepAlive)设定6 ~( d( v6 \3 M3 }6 [: ]1 t% E 万事具备了么?no! : L, B4 p$ J i$ W. a5 _ 以上只解决了异常自动重连的问题,并不等于协议栈具备检测异常的能力。即H7必须知道网线是在什么时候被拔掉。 1 j" W g1 A) ~! \+ T 有很多博客都提到KeepAlive的开启方法,但都是详细说明怎样打开,打开了该怎么用就没说。。。. H! q p. ?7 W5 |" o* J+ G ; F) ]' G3 A) k8 p 由于tcp是可靠连接,有数据往来的时候能够检测异常,需要解决的是无数据检测。这就要用到TCP协议的KeepAlive功能,原理就是在空闲的时候,以一定的频率发空数据包给服务器,服务器收到后答复一个数据包,说白了又把空闲段给变成有数据往复状态了。TCP协议栈包含KeepAlive,lwip协议栈这部分也没少,启用几个宏即可自动进行收发。设定方法为:在lwipopts.h后面加入
tcpecho.c中实例化netconn后,为其tcp成员加入SPF_KEEPALIVE属性。
这样就能实时检测连接状态了。使用wireshark抓取数据是下图的样子,里面可以看到空闲时段交互的keepalive数据包。 电脑IP :192.168.0.99 单片机IP :192.168.0.80( x6 ]" z) f5 m3 @6 P* \3 x! i) u \ 8 [( C( v$ Y' \0 e1 A
2 v+ c1 N1 h! D2 ^% X. u 自动化流程为: 拔掉网线------进入回调函数销毁tcp资源------主程序while循环连接出错------主程序销毁netconn资源------主程序实例化新的netconn资源------再次连接 如此往复…( O9 _; I& p$ X( l9 E8 ~( x 用STM32CubeMX 生成了一个包含 EHT ,Lwip 的项目,调试一直不正常,经仔细检查存在以下问题:/ K0 Q5 v' I7 }$ G+ t4 E 1.硬件采用了LAN8720A ,但是STM32CubeMX 生成的是LAN8742A的代码,必须根据硬件连接更改地址。. F* q% U. Q- P 解决办法: 在 …Src ethernetif.c 修改如下: : o& x+ G* k$ x' T; n
2.初始化时必须对LAN8720A 进行硬件复位。- B& ~ u& @, R, x& v2 ^ 解决办法: 分配一个 GPIO 连接LAN8720A的复位端,在 …Src ethernetif.c 修改如下:
$ r1 d ~. l; S! @: t: @/ |' N |
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
【福利三:逢7发帖赢大礼】使用MPU6050模块、img_dsc、img_btn机制实现一些简单有趣的动画效果
【福利三:逢7发帖赢大礼】使用arc弧形拉条控件控制PWM舵机及使用SPI3接口操作NRF24L01模块进行无线通信
【福利三:逢7发帖赢大礼】调试nucleo-WBA65RI工程测试样板的一些心得
【福利三:逢7发帖赢大礼】lv_timer和BME680实现温度、湿度、气压数据读取
【福利三:逢7发帖赢大礼】成功利用STM32H743VI片内SRAM12和DTCM空间(完全胜利)
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
【福利三:逢7发帖赢大礼】使用惠勤致远STM32H743VI开发板+ST7796并口彩屏移植LVGL9.5并分享一些额外内容
【 逢7发帖赢大礼】7、TouchGFX中实现云彩流动效果
微信公众号
手机版