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

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

[复制链接]
STMCU小助手 发布时间:2021-12-26 14:55
ETH
  q; l- [6 K# ^& I. g( Z" S& z' d' A9 @; T, y) R9 R
20210402161452602.png
# A7 c; J' t( Y3 J! @6 l0 R, |& x
- ^( F$ w0 \3 J9 G
20210402161514595.png
/ P9 ]$ {' F/ z2 d6 a  W
9 X  K$ G6 Q$ k$ j, w
20210402161532893.png

+ z. O( V; @. m4 h4 l; b
1 [4 Q: {8 T0 J+ U* ^) E配置EHT_RST引脚
& |' P; G; e) U* f; v8 U- t; U9 p/ c/ x$ Y+ b. M
20210402161604234.png

2 y- v1 U+ {1 p9 C) `, A$ i( q
8 r2 O6 C: E: h3 ]0 gLWIP
7 w* Z- P  u+ \: W: q/ y- T+ W: g- K/ V- B
20210402161716753.png
0 e% q) J; w7 R

* ]. Z1 n: H; o0 k5 |4 p4 G
20210402161746306.png

+ D* R1 y4 w5 }$ e$ \1 ?$ Z, ~1 Q6 H1 ~5 a- O- P8 f2 P
注意一定要把LWIP_NETIF_LINK_CALLBACK选上,不然连接状态改变不能进入拔下或者插入网线回调函数,里面做一点自己的事情
4 |. @0 y' X: R9 m6 j! ^' Z  E  _2 p; _- I2 q9 P: ^8 P3 M
20210402163232833.png

/ B8 k+ P8 H' F) P7 U: D4 X5 w+ U* @: x2 F# ]4 R" I$ v1 h
LAN8742
5 q2 J. H6 @1 C
20210402163258853.png
! M* i3 G- M1 k9 b0 A
# k4 E5 O: w! d( x# u
MPU% c, N' Z5 q5 c. j, y
Lwip使用DMA传递信息,对应的DMA内存定义在sram中。H7的sram分为好几段,高速段为cpu独享,通俗点说就是这一段允许用户编写的程序使用,但是不允许DMA使用。所以为DMA定义的内存或者数组要避开这一段。另外Lwip使用DMA时存在交互存取问题,避开这一段后,也不能让cpu像使用普通cache那样乱序使用,否则将可能出现严重问题。很多人用F7、H7和Lwip协议栈都出现ping不通的现象,都是内存管理问题。怎样管理??需要使用内存守护单元MPU。
: T$ L+ ~* {! f- H
( y# s& L# `( P" t) B使用CubeMX配置MPU,最多可以管理16段。为lwip配置,管理两段即可。& E) V' M: X" C# H+ x

3 r8 h* A3 e. \; Z- O# b
2021040216385026.png
% X2 |; B4 |& {5 A; D2 t

! e& q! o6 _* z6 ?6 [, _8 J
20210402164922519.png
' f8 f) K+ l1 \* v) i; E
; X3 N) h8 G2 c8 J4 y& n" ~
20210402163942899.png
  m2 W4 C* z1 S( E# G& j6 x. F* I
8 a1 @) [* t3 l9 L! S/ ^; u
( V' h! M5 v$ P9 _# j) _8 [
MPU设定总结(非操作步骤)7 o! j3 x  _4 y# [: J6 D4 y+ m
总结一下这样做的原因与目的:5 t2 g/ j0 j% u- D8 Y* q! {3 f
(1)Lwip不被允许使用cpu专用的高速L1缓存(DTCM),只能用D2 Sram区域;
  d9 c- f' r& x# o: ?' @(2)cpu可以无序访问cache,为防止这种情况,Lwip的DMA段必须是device类型或者Strongly-ordered类型,保证有序;; c+ i, j9 u3 O4 @
(3)通过MPU配置这段cache,其中一段允许share、允许buffer,长度为256Byte,放TXRX交互存取头;另外一段不share,不buffer,不cache;长度32k。! v$ P( H* V8 f8 `
5 G4 ~# S/ S* i
20210402165153856.png
1 O% e" m0 w/ g! B; `* ?

7 C5 N5 v: w! C/ U3 n' pMPU选项含义(非操作步骤)
5 y0 M6 y: c5 p5 Q# TcubeMX里面配置TEX、C、B,三者搭配。
9 T& S6 [: `) }, Q" d' {
" l) b( b, [9 ^+ f. x+ f$ d
20210402165235835.png
# f7 [! B6 S! ~

# k, i! n* o  h% i% V$ x/ ]' Z( |) a9 w* ]0 g
Access permission被定义为3,即Full access。
1 ^$ Q# @2 k8 s: V: U
, F/ Y: y6 O! l
20210402165246437.png
6 m, w: t& G* ~  z  e2 L' Q! O. x

6 u1 e2 {4 V% _: t2 ?7 K经过上面的配置,编译下载,不出意外不用写任何代码就可以ping通了。. L7 W& C) @: E4 S7 {8 m! p& L

6 a& t6 k8 Y$ S3 M! m% O好了,可以进行下一步!3 m* L" ^' b' D

" y- R/ O4 Y# H) ZLwip协议栈TCP保活(KeepAlive)设定
/ I) e+ I; T- W, \8 u! \
万事具备了么?no!
; u# m' A5 @6 L1 E8 W" X* K* V: S  z2 r' n
以上只解决了异常自动重连的问题,并不等于协议栈具备检测异常的能力。即H7必须知道网线是在什么时候被拔掉。5 i; ~- K5 b4 {  Q

) {7 {- S: k0 Z) |7 s有很多博客都提到KeepAlive的开启方法,但都是详细说明怎样打开,打开了该怎么用就没说。。。
9 n  E9 A; e. v  B) D0 j; _: V- l( T# B4 u
由于tcp是可靠连接,有数据往来的时候能够检测异常,需要解决的是无数据检测。这就要用到TCP协议的KeepAlive功能,原理就是在空闲的时候,以一定的频率发空数据包给服务器,服务器收到后答复一个数据包,说白了又把空闲段给变成有数据往复状态了。TCP协议栈包含KeepAlive,lwip协议栈这部分也没少,启用几个宏即可自动进行收发。设定方法为:在lwipopts.h后面加入* x' u" S$ h  K( Y8 A

) U, \8 w! H5 A  W" o
  1. #define  LWIP_TCP_KEEPALIVE       1             //激活keepalive
    ! H/ n0 V3 r& L
  2. #define  TCP_KEEPIDLE_DEFAULT     2000UL        //2秒内连接双方都无数据,则发起保活探测: H6 B) K# ~. N6 M6 h4 M
  3. #define  TCP_KEEPINTVL_DEFAULT    1000UL        //1秒发送一次保活探测; w( v& G" ]# H* d* `( X3 d. s
  4. #define  TCP_KEEPCNT_DEFAULT      3UL           //3次保活探测无数据则进入错误回调函数
复制代码
+ X+ Y7 I4 ]0 Q0 U) v
tcpecho.c中实例化netconn后,为其tcp成员加入SPF_KEEPALIVE属性。
  1. xNetConn->pcb.tcp->so_options |= SOF_KEEPALIVE; //保活设定,实际上是tcp的一个属性选项
复制代码

( Q* h( {5 ~6 i, D, j& J! S# j这样就能实时检测连接状态了。使用wireshark抓取数据是下图的样子,里面可以看到空闲时段交互的keepalive数据包。
$ d+ E% W& W) R' \" K电脑IP :192.168.0.99
' E& a: Q/ l1 M) _- Z2 J3 K单片机IP :192.168.0.802 d! l7 u/ {# G: {- r% x
3 O# o  z. T  o1 q- t) ]
20210402165445842.png

. E# M' F+ U" @  Q8 D5 ~6 w( M4 D- H8 f; i% `
自动化流程为:6 D8 V2 u% }" d5 T9 L2 B% e2 J0 [' f5 ?
拔掉网线------进入回调函数销毁tcp资源------主程序while循环连接出错------主程序销毁netconn资源------主程序实例化新的netconn资源------再次连接
# O' Q. q) ]% ]& Q/ n7 ^如此往复…
. a  g) a% z* i% |  J2 X5 m% A1 }3 d
" B$ ^2 J4 L& O1 O+ ^8 X用STM32CubeMX 生成了一个包含 EHT ,Lwip 的项目,调试一直不正常,经仔细检查存在以下问题:
. c* z7 ]( G; v8 A; k# v1.硬件采用了LAN8720A ,但是STM32CubeMX 生成的是LAN8742A的代码,必须根据硬件连接更改地址。' M+ t/ J& t. U  `$ V7 j4 a
解决办法: 在 …Src ethernetif.c 修改如下:$ |  \5 G* [+ I% Q" _3 g
& Y2 Z  p1 y; T* k
  1. heth.Instance = ETH;
    7 s, D/ a, G8 U, [- g$ F- j% U
  2. * v6 r  I$ ]% Y* Y/ T
  3. heth.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE;
    + z* f: E. {( z: I$ X" u9 ~

  4. 3 J3 q4 A; u4 h; z5 C
  5. // heth.Init.PhyAddress = LAN8742A_PHY_ADDRESS;
    $ x! E! q4 B9 z  C3 {
  6. 3 f$ V# M  O: D; C
  7. heth.Init.PhyAddress = LAN8720A_PHY_ADDRESS; //modify by kmsmg,LAN8720A_PHY_ADDRESS=0,LAN8742A_PHY_ADDRESS=18 Y( j6 n6 M: v/ b/ ~, ]8 z( Q( X
复制代码

( s+ a9 @/ L+ U& Z2.初始化时必须对LAN8720A 进行硬件复位。
" Z& t4 `( ]4 _解决办法:
5 G5 E: c4 h4 K3 C$ M5 ]. H. ^# W5 n
分配一个 GPIO 连接LAN8720A的复位端,在 …Src ethernetif.c 修改如下:
* W8 t: |! f6 T
6 d2 C+ A. D# o- a( y! @
  1. heth.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE;) z& |+ n- D; r# W) \
  2. . B& ]& ^4 j/ N
  3. heth.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII;6 S7 s- b7 h+ n  Z4 t

  4. 2 V8 K. ^2 h" L7 {
  5. /* USER CODE BEGIN MACADDRESS */! L7 B# f  c$ h  o# Z
  6. 3 y+ C  U% |( B$ C. i) T
  7. /* USER CODE END MACADDRESS */1 a: N' ~/ k+ k$ d. U0 p; @

  8. 6 |4 a6 {, n- ?# L$ X
  9. LAN8720_RESET();// modify by kmsmg  }! W  h4 T* R7 d0 Y

  10. / ?% u. I1 o" l, Q4 d1 Y2 y& C
  11. hal_eth_init_status = HAL_ETH_Init(&heth);
    9 X) u4 b3 U0 u! R' E

  12. - p* V0 }/ i: O6 T0 Y
  13. ............
    9 @" W& c+ n. v  j' }) I9 o! a/ }+ p

  14. 2 W3 s! m1 Y  _, e- g
  15. //-----------------------------------------------
    " k1 z" H+ t+ W# J- i
  16. $ V8 L2 v! |  `# S7 m3 e# `. S) S
  17. void LAN8720_RESET(void)/ t+ b3 Q- Q4 K. J! E
  18. * p  [; N7 t0 y* A0 E
  19. {: r! c# `  u; ]6 w3 z7 w- g% b, F
  20. HAL_GPIO_WritePin(GPIOD, GP_EHT_REST_Pin, GPIO_PIN_RESET);
    * k" @5 O2 Z0 @
  21. : j" U7 F. T( b* N
  22. HAL_Delay(55);
    + A# M5 j8 c! Y8 T0 l' L
  23. 2 U+ z. U" S# X- }$ e- `
  24. HAL_GPIO_WritePin(GPIOD, GP_EHT_REST_Pin, GPIO_PIN_SET);
    5 g( K' t$ V: c0 K0 `

  25. 3 K0 b) p4 R7 K  Q
  26. }. K  \6 H0 C  e+ K1 J5 S
  27. % ~8 M; _9 u5 y, [
复制代码

  s+ X+ |$ J" _
/ N1 z! }3 W+ i3 g4 [% U5 @
3 M( ~7 d$ \4 j" |+ \6 f
收藏 评论0 发布时间:2021-12-26 14:55

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版