你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32H7+CUBE+ETH+LWIP配置及设置

[复制链接]
STMCU小助手 发布时间:2021-12-26 14:55
ETH4 `, D- {( x3 _  d5 f

: R! p* ]6 p3 k: ?& r- s
20210402161452602.png

% S  _4 t& v9 V, h: `/ P4 I
0 H0 u, H. Y0 v: U7 m& z, t9 i# O
20210402161514595.png
+ L, e9 N$ Y8 S
9 [. t$ L9 x& f3 F
20210402161532893.png

7 T' r% ^( p! C% l! 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
20210402161604234.png
2 M* f. V$ e$ p7 g1 F& P
# r6 n# o- E/ O- w. P7 T$ _
LWIP* Q6 D6 k+ D) B1 ~1 E# J7 I, L

) q. x& {( D; R0 o
20210402161716753.png
; ~4 y2 A# _9 ]/ v& N( Q
. k3 U5 S# ~3 O( _
20210402161746306.png
5 ]3 z, g9 F5 ?' M" j! j
4 ?) G  `' A" i7 @7 G5 w# `6 q
注意一定要把LWIP_NETIF_LINK_CALLBACK选上,不然连接状态改变不能进入拔下或者插入网线回调函数,里面做一点自己的事情
7 S2 P- Y6 D- ?
6 I5 R& J$ k9 N2 C4 B8 x  c' @1 y
20210402163232833.png

* g5 F0 B- m+ X- Y/ u$ c8 V* X; m! w5 K  Q5 b. w
LAN8742
1 O0 }/ S4 G$ i. N
20210402163258853.png
) L- d9 ?' D5 Z. q2 P6 l; n

8 C2 U& K' ?4 F' D( D7 CMPU* p6 Y2 M* _! p: ^
Lwip使用DMA传递信息,对应的DMA内存定义在sram中。H7的sram分为好几段,高速段为cpu独享,通俗点说就是这一段允许用户编写的程序使用,但是不允许DMA使用。所以为DMA定义的内存或者数组要避开这一段。另外Lwip使用DMA时存在交互存取问题,避开这一段后,也不能让cpu像使用普通cache那样乱序使用,否则将可能出现严重问题。很多人用F7、H7和Lwip协议栈都出现ping不通的现象,都是内存管理问题。怎样管理??需要使用内存守护单元MPU。
% ?' l: [7 R! k  _! P
+ N0 e# l1 j: G使用CubeMX配置MPU,最多可以管理16段。为lwip配置,管理两段即可。7 {" _; l) W% A- l9 a
% F# I; `2 C6 s: N
2021040216385026.png

3 I0 P, p6 ?! G4 n3 n( U1 j+ F# g- C0 g; ~: O* L
20210402164922519.png

+ x6 q" [, Y  }' }9 _8 U
  ^( |3 i* K4 W0 n: E- W9 M. A
20210402163942899.png

4 S4 P' t! Y3 I9 L+ e5 ]
  ~7 G  A# Z3 e4 P' X  H" Q* ?1 N+ V# m* Q" R
MPU设定总结(非操作步骤)
1 i. C. ?# }5 b& @7 H% V5 T* c总结一下这样做的原因与目的:+ 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。
' Q9 ^6 U) p3 X6 ~* q! _$ }& x3 h* e. x
20210402165153856.png
( C3 ]& I% M$ C- m% V

' V' p3 u* d6 s5 p- O" ]& YMPU选项含义(非操作步骤)6 J; ^; s" ~9 c* X
cubeMX里面配置TEX、C、B,三者搭配。
  c! c) K2 H) ~" N' W/ l. B) S, i4 v9 y! j
20210402165235835.png
! D: S4 _+ o1 N. Y( A0 q

% G; g. ]4 D& G* I1 O1 T- c. [. d! o8 r; `% t' B
Access permission被定义为3,即Full access。" `2 ^1 M8 ?  O# D

( r& _; B6 M& n$ ]; Q. [
20210402165246437.png
/ K4 `/ X9 @2 r
3 D8 q# y& T5 K( ]0 H" F
经过上面的配置,编译下载,不出意外不用写任何代码就可以ping通了。0 u0 h5 L$ G8 e; l8 D' [
7 o; U' g2 X1 R
好了,可以进行下一步!
. [! u3 Z$ H1 Z$ J# g: g% \
8 R: K2 A: G* K/ ]Lwip协议栈TCP保活(KeepAlive)设定
9 {) Q1 J% r) M) q, Z2 k+ X" T
万事具备了么?no!
& t& \' Q. T& H8 @* C
$ P, l5 t4 }+ g7 G& {2 x以上只解决了异常自动重连的问题,并不等于协议栈具备检测异常的能力。即H7必须知道网线是在什么时候被拔掉。
2 Q/ u! `& b  H8 x5 l" ~$ P1 j/ P1 p7 E4 |5 f3 ?
有很多博客都提到KeepAlive的开启方法,但都是详细说明怎样打开,打开了该怎么用就没说。。。
  h7 Y# L9 O% z& ^' _; B0 |
2 h' A# e; J4 d+ z) ]6 Q4 `6 V; C由于tcp是可靠连接,有数据往来的时候能够检测异常,需要解决的是无数据检测。这就要用到TCP协议的KeepAlive功能,原理就是在空闲的时候,以一定的频率发空数据包给服务器,服务器收到后答复一个数据包,说白了又把空闲段给变成有数据往复状态了。TCP协议栈包含KeepAlive,lwip协议栈这部分也没少,启用几个宏即可自动进行收发。设定方法为:在lwipopts.h后面加入( \- ]' m; N: Q5 b

) J/ [, x7 ]1 A) u- W
  1. #define  LWIP_TCP_KEEPALIVE       1             //激活keepalive
    % W& e" c+ J- p; B
  2. #define  TCP_KEEPIDLE_DEFAULT     2000UL        //2秒内连接双方都无数据,则发起保活探测
    - k( @  s( B. U! b$ A) \0 {
  3. #define  TCP_KEEPINTVL_DEFAULT    1000UL        //1秒发送一次保活探测
    $ J. y( ], l5 ^" Q
  4. #define  TCP_KEEPCNT_DEFAULT      3UL           //3次保活探测无数据则进入错误回调函数
复制代码

. J1 Q5 X$ r* d8 d; utcpecho.c中实例化netconn后,为其tcp成员加入SPF_KEEPALIVE属性。
  1. xNetConn->pcb.tcp->so_options |= SOF_KEEPALIVE; //保活设定,实际上是tcp的一个属性选项
复制代码
3 {. ~) Q$ {) g
这样就能实时检测连接状态了。使用wireshark抓取数据是下图的样子,里面可以看到空闲时段交互的keepalive数据包。
6 c9 O3 D- }# ^# z2 N电脑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. `
20210402165445842.png

6 N# T  b. P: A6 i; n* _3 ^) [( f2 j/ B1 P7 E
自动化流程为:6 [' J6 D6 F! i3 ]" K
拔掉网线------进入回调函数销毁tcp资源------主程序while循环连接出错------主程序销毁netconn资源------主程序实例化新的netconn资源------再次连接
' t* }9 f4 C: _" A0 v" R- o7 W: O/ R# y如此往复…, o7 g" i2 a' _2 F
  j/ j3 b5 V" p& q% b
用STM32CubeMX 生成了一个包含 EHT ,Lwip 的项目,调试一直不正常,经仔细检查存在以下问题:
0 b! ?" i3 o3 [1.硬件采用了LAN8720A ,但是STM32CubeMX 生成的是LAN8742A的代码,必须根据硬件连接更改地址。+ O! b3 {5 W  S; H
解决办法: 在 …Src ethernetif.c 修改如下:- E3 I9 \1 {% h
& N! }; m6 l# p
  1. heth.Instance = ETH;, |7 e. v. U& @$ o  I1 [

  2. 6 t! [% a7 V- `# S$ ~' _8 \
  3. heth.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE;
    , n6 v: W. w  }9 y  h) ~- e

  4. . R* M9 S6 K* I& [
  5. // heth.Init.PhyAddress = LAN8742A_PHY_ADDRESS;4 [& k$ I9 c) Q1 E, C8 K
  6. 3 X0 A( v, m7 {# m' x0 w
  7. heth.Init.PhyAddress = LAN8720A_PHY_ADDRESS; //modify by kmsmg,LAN8720A_PHY_ADDRESS=0,LAN8742A_PHY_ADDRESS=16 e- x# @/ z+ R2 F" h
复制代码
  ]! l5 `0 s2 ?: r
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
  1. heth.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE;! I6 h& U3 g! v1 A! J1 |  R- T

  2. ! s2 {, F* }3 ?  v
  3. heth.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII;+ Z/ ^9 L8 R! g5 F) ]1 k: g$ ?3 d
  4. ( ?/ I& w: c5 d) X) T' X% r' X( W
  5. /* USER CODE BEGIN MACADDRESS */
    8 h4 d$ \8 F7 e

  6. * K, S% N# @2 Z( Q
  7. /* USER CODE END MACADDRESS */
    ! Z; F) c. }* x% l3 {& {: W0 `

  8. # m/ Q2 G' N% H4 Y/ [( \" r; s5 p: T. H
  9. LAN8720_RESET();// modify by kmsmg; C% o" x3 v, s

  10. ! B8 X8 C: j# G! x0 C
  11. hal_eth_init_status = HAL_ETH_Init(&heth);
    / G3 a' e8 ?& _2 i6 T- L

  12. ) v1 H8 f4 T. [, w9 N5 ~
  13. ............, C7 [- f3 v9 o" p7 X

  14. & L' e; A/ w/ D2 X
  15. //------------------------------------------------ T- R2 U1 B) Q3 i. N5 T) U; r
  16. / _- @. W. D& ]% w& J
  17. void LAN8720_RESET(void)- t' x5 A, e) l3 s  t

  18. * p2 n4 r* j) F+ W
  19. {+ Z. }5 o0 O0 }" M. c
  20. HAL_GPIO_WritePin(GPIOD, GP_EHT_REST_Pin, GPIO_PIN_RESET);  R: u! W1 {' L1 W

  21. . }8 `1 [3 K  F6 g1 e4 R4 p
  22. HAL_Delay(55);; ?3 X& K, _( |4 F

  23. + z% v- b5 [$ g4 P. X6 y! I
  24. HAL_GPIO_WritePin(GPIOD, GP_EHT_REST_Pin, GPIO_PIN_SET);) j6 j7 l* U; o5 U" j- Q6 K/ l1 m
  25. - k+ B, |( i1 X( M0 a
  26. }) C; z5 `/ f3 U
  27. . p2 J3 H8 a. Y( f6 Q* }7 F
复制代码
3 W1 e7 ^# f: r: d  a: d$ C

% N0 T# ~0 B6 d9 J0 I0 D! F8 N* {. p- o' T: ^
收藏 评论0 发布时间:2021-12-26 14:55

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版