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

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

[复制链接]
STMCU小助手 发布时间:2021-12-26 14:55
ETH
* H6 U8 l2 u" U0 t. o# n
# d$ y; u# X0 u- Q) u
20210402161452602.png
/ I0 G' r$ i/ s6 R

6 G) T8 A9 ^3 u/ [7 {3 s
20210402161514595.png
% \/ j; l2 O4 u6 G1 X
( i8 z. d; v; M( F, s
20210402161532893.png

! j% w5 g' o* @- S# o/ O4 a- z7 Q2 G6 N
配置EHT_RST引脚
0 c" [6 G/ E, B: R! ^$ f* T2 ^8 u8 z, ]9 P) C+ P5 y% t
20210402161604234.png

: o6 ~) L- c/ t8 G. }' ^/ A7 i$ |  Q( A+ E, j5 \' U6 u. q
LWIP
. V1 ^) d) I! e0 M6 P9 [- O: P* j9 X- }# [: U& K% p$ I
20210402161716753.png

+ P$ ^0 V9 [4 }: c. Z- R$ y( k
" D7 ?" s) d$ a% g0 p% h% U
20210402161746306.png

( P2 [* v1 x8 F5 g. t& x+ n0 I0 }9 c; n
注意一定要把LWIP_NETIF_LINK_CALLBACK选上,不然连接状态改变不能进入拔下或者插入网线回调函数,里面做一点自己的事情0 h' ^* I  Y8 t2 D- w+ d2 ~

! I2 a+ G0 r" t8 c0 O
20210402163232833.png
4 ?, _3 s! _" I8 H
7 w- o# z; T7 h
LAN8742
9 K7 @  u+ Q2 {2 u
20210402163258853.png

9 S7 w1 T1 f* H1 U2 J! |. d, ?+ y  @
+ _5 B0 E2 M4 ^  {9 o$ `MPU
& ^* o( D/ E( Y6 b0 }6 n8 u. JLwip使用DMA传递信息,对应的DMA内存定义在sram中。H7的sram分为好几段,高速段为cpu独享,通俗点说就是这一段允许用户编写的程序使用,但是不允许DMA使用。所以为DMA定义的内存或者数组要避开这一段。另外Lwip使用DMA时存在交互存取问题,避开这一段后,也不能让cpu像使用普通cache那样乱序使用,否则将可能出现严重问题。很多人用F7、H7和Lwip协议栈都出现ping不通的现象,都是内存管理问题。怎样管理??需要使用内存守护单元MPU。, c4 b* f$ U0 \3 ~! f) B5 d

  `4 V5 k* \" n& i5 X使用CubeMX配置MPU,最多可以管理16段。为lwip配置,管理两段即可。
( P' ]2 ]7 S% }
. Z& x* r0 g  t- o1 b6 |6 O
2021040216385026.png
8 n, O; D1 {. i. a) \+ V
4 M9 S7 q4 Y/ l# z0 R5 z+ V: `
20210402164922519.png
* W/ q9 V3 J9 `- k% x  \+ w
5 a! M; `! K, Z3 W" U
20210402163942899.png

. T' A0 o/ u) |$ S* D) a4 ?, I/ v2 Z! l
7 J3 R3 r8 d& U7 m
MPU设定总结(非操作步骤)
5 O# m. h0 J. v# N. ]2 P" I7 S$ G总结一下这样做的原因与目的:$ N: D6 p. s' R$ j# O3 H1 o
(1)Lwip不被允许使用cpu专用的高速L1缓存(DTCM),只能用D2 Sram区域;. Q# R1 M/ Y  O4 q. J
(2)cpu可以无序访问cache,为防止这种情况,Lwip的DMA段必须是device类型或者Strongly-ordered类型,保证有序;
; v% ?: ~# W7 n8 J( l3 f(3)通过MPU配置这段cache,其中一段允许share、允许buffer,长度为256Byte,放TXRX交互存取头;另外一段不share,不buffer,不cache;长度32k。
% z# m) o7 Y$ M6 y6 S- d/ n8 d* g/ S1 ~
20210402165153856.png

* @7 b8 a. W1 O; S0 s+ b( D
4 {6 G: T% F; U1 x( BMPU选项含义(非操作步骤)
# Z* Z  ]2 ~! I% icubeMX里面配置TEX、C、B,三者搭配。
0 D1 t* y6 c  j/ J
4 q7 w# M3 X+ a# p8 p& t
20210402165235835.png

& t; x; H  a( ~6 c: s" B, f; Q5 V0 e% R

6 j  x# K% ?- q: ?! ^2 S1 OAccess permission被定义为3,即Full access。( F3 L9 k5 n) z) l% ^. x: X5 q; B0 j
4 q" n# J8 L& M  e$ g
20210402165246437.png
4 o6 A# m" i8 R, t: O, k" H' L

% Z# o- {8 ^9 f+ B( G9 E# e经过上面的配置,编译下载,不出意外不用写任何代码就可以ping通了。2 g* d# L9 n& y" B7 D
# n& @# f' E' ]9 T, u* l" G# n, |
好了,可以进行下一步!( A! {& j# O8 O& y0 ~( z. {

: z, D6 X3 Y# n& j3 n1 kLwip协议栈TCP保活(KeepAlive)设定

: e# Q  E4 b" L5 l万事具备了么?no!
' Q1 i, n: ]7 b1 g) t: F9 C4 Q% Q  S( H
以上只解决了异常自动重连的问题,并不等于协议栈具备检测异常的能力。即H7必须知道网线是在什么时候被拔掉。* c) y$ {- x' y% Z; `% x: O6 k

+ s8 Q2 g$ y2 U有很多博客都提到KeepAlive的开启方法,但都是详细说明怎样打开,打开了该怎么用就没说。。。
% s% g/ R" C; G- g, a/ m( B* C4 a5 C# d, q3 T  N3 p
由于tcp是可靠连接,有数据往来的时候能够检测异常,需要解决的是无数据检测。这就要用到TCP协议的KeepAlive功能,原理就是在空闲的时候,以一定的频率发空数据包给服务器,服务器收到后答复一个数据包,说白了又把空闲段给变成有数据往复状态了。TCP协议栈包含KeepAlive,lwip协议栈这部分也没少,启用几个宏即可自动进行收发。设定方法为:在lwipopts.h后面加入
# p5 N/ O! t& Z' m6 S
, q/ Q4 h6 _2 v. a8 R7 e
  1. #define  LWIP_TCP_KEEPALIVE       1             //激活keepalive3 O. X' q1 a1 D3 [5 H- G. l
  2. #define  TCP_KEEPIDLE_DEFAULT     2000UL        //2秒内连接双方都无数据,则发起保活探测% @* o% C  Q; h% ]) C
  3. #define  TCP_KEEPINTVL_DEFAULT    1000UL        //1秒发送一次保活探测
    5 r% I! h( C* ^2 _2 R" l" T
  4. #define  TCP_KEEPCNT_DEFAULT      3UL           //3次保活探测无数据则进入错误回调函数
复制代码
& S9 m( I* B) K3 b* n
tcpecho.c中实例化netconn后,为其tcp成员加入SPF_KEEPALIVE属性。
  1. xNetConn->pcb.tcp->so_options |= SOF_KEEPALIVE; //保活设定,实际上是tcp的一个属性选项
复制代码

; V- L0 O; ], j( O9 H) c2 C* C; e这样就能实时检测连接状态了。使用wireshark抓取数据是下图的样子,里面可以看到空闲时段交互的keepalive数据包。
& t  G0 S; G9 w) S. `( }! t电脑IP :192.168.0.991 ]# o3 S1 \9 q. o( ?& Q  h
单片机IP :192.168.0.80, w% l9 C% ]$ j9 V

$ @( }' K: V8 t: @. T
20210402165445842.png
3 z7 ?6 X4 R1 c* e1 z- I
( G3 Q& _  o  X3 C) U  l
自动化流程为:1 I$ j& v2 W' z+ L1 ]; r; m
拔掉网线------进入回调函数销毁tcp资源------主程序while循环连接出错------主程序销毁netconn资源------主程序实例化新的netconn资源------再次连接% f6 [5 l' J! Y; M, O, C: {1 U  D/ B
如此往复…3 K$ n4 ?$ ~; f3 Y

8 Y: \6 k1 x( S1 z! M用STM32CubeMX 生成了一个包含 EHT ,Lwip 的项目,调试一直不正常,经仔细检查存在以下问题:
4 X$ i9 I; i) E0 Y  R1.硬件采用了LAN8720A ,但是STM32CubeMX 生成的是LAN8742A的代码,必须根据硬件连接更改地址。
4 R% Y* j  J# Y- h解决办法: 在 …Src ethernetif.c 修改如下:
7 o' ?( `( z- g8 C& e
* O; Q, m% n0 f' n4 m* c* @0 P0 A
  1. heth.Instance = ETH;
    3 S. t$ w' b3 T

  2. . e6 u: q% ^4 O- f% F& G' V
  3. heth.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE;
    & X5 R1 T9 e' k' M/ O
  4. + [1 t$ j/ c  j: c6 G
  5. // heth.Init.PhyAddress = LAN8742A_PHY_ADDRESS;! }, k6 x# q8 [& L" p  A3 h2 ]
  6. / v" {& l9 u% \3 |' {. h% ~
  7. heth.Init.PhyAddress = LAN8720A_PHY_ADDRESS; //modify by kmsmg,LAN8720A_PHY_ADDRESS=0,LAN8742A_PHY_ADDRESS=1
    , M+ j- i8 Q+ k9 Y: A% J
复制代码
7 l3 ?% y" h: Z/ r' v* ^
2.初始化时必须对LAN8720A 进行硬件复位。
( ?. h7 x& ]  `解决办法:
, s; w( I, `" i$ ~4 m
$ A: r) J/ A3 v1 E& Y分配一个 GPIO 连接LAN8720A的复位端,在 …Src ethernetif.c 修改如下:
( w1 ]" p3 _1 _9 x4 f" t; A) U5 p4 m/ ^( }  w# z
  1. heth.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE;
    $ V8 m6 `$ k2 {% ]8 u& ?& z2 Q

  2. 2 w# R! d  d8 o- |1 p- I6 {' X
  3. heth.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII;
    ' _' s; }3 J  Z  B! q

  4. ' H  ^8 A* |0 f4 `' }
  5. /* USER CODE BEGIN MACADDRESS */
    . `, {7 i$ r) O  u6 h/ O  Y5 H) M
  6. ! s9 n% \/ Q8 {/ O: _/ c& L( T, c
  7. /* USER CODE END MACADDRESS */3 Q2 c, l2 _0 p7 C0 L4 F5 O9 Z

  8. 7 R, x1 l. ?" J# f8 z
  9. LAN8720_RESET();// modify by kmsmg
    - t' x) M3 N/ k/ T
  10. ( I. V9 ^+ i7 g- p
  11. hal_eth_init_status = HAL_ETH_Init(&heth);
    5 \4 D' V- v6 \# P7 P+ O4 x# N' T
  12. 6 E: c7 y  n# p3 t0 w6 {8 G5 }
  13. ............
    8 M' m; w7 }3 _5 n" |

  14. & _$ W4 R+ A3 \/ R, b
  15. //-----------------------------------------------0 {! b+ s% f$ h

  16. ' z% d% X7 K% g( ^* ?/ `# d% a
  17. void LAN8720_RESET(void)% F) v( O# V; D$ o! X
  18. 7 k) y  {0 w. ?  H
  19. {; k% `3 D/ o) ?% a' m
  20. HAL_GPIO_WritePin(GPIOD, GP_EHT_REST_Pin, GPIO_PIN_RESET);
    & m9 p+ D$ @9 N* J' q" n5 D
  21. 3 |" `- B4 E# N8 V2 R
  22. HAL_Delay(55);+ P$ P9 S/ B( _0 X
  23. 0 O" R; n) @0 O7 S9 e  \
  24. HAL_GPIO_WritePin(GPIOD, GP_EHT_REST_Pin, GPIO_PIN_SET);' [! z1 L5 F& X3 \, J6 L
  25. " z" L! W4 h! }& Y
  26. }5 e' \! @: |  N$ `. J* w/ q
  27. % h. Z. W* \$ P( {" `% J
复制代码

, G9 A/ R' K0 z4 h7 Y- p
% [" ~6 q: V$ ?& _
* j+ d- o4 B$ i' j
收藏 评论0 发布时间:2021-12-26 14:55

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版