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

终于搞定STM32H743网络了,分享调试经验及注意事项  

[复制链接]
switcc 发布时间:2018-3-13 20:03
本帖最后由 Switcc 于 2018-3-14 17:40 编辑 , H6 i1 M- C1 p" x
$ M8 |5 b7 I. ]1 J- A) x: E+ o) `2 {, w
上上周本人发帖询问stm32H7平台移植DP83848 PHY驱动的帖子,详见
, p# a% j/ J3 O  N, xhttps://www.stmcu.org.cn/module/forum/thread-614912-1-1.html,. G( d8 b( z2 i, x8 ~! O

; l2 d3 b8 a* v0 O8 y3 t: W按照回帖建议直接使用cube库里LAN8742里的驱动,然后对照不同PHY芯片寄存器查看,可以读到寄存器数据,但是网络一直没有调通,特别是gratuitous arp设备上线的广播都抓不到,更不谈能PING通设备了。
; U! w/ _4 ?0 X6 m  ^* x& G! z! ]' w  U
经过长达两周的反复测试和问题排查,直接问题出在MPU和CACHE处理上。现分享使能MPU、CACHE和不使能MPU、CACHE两种模式配置说明:* {3 W- g0 `4 W$ K. |
' n$ P( K! l" _' A$ `& c; e' ?
一、使能MPU、CACHE情况
6 k9 N6 R0 O. P2 |& x1 [5 q1、main.c中 HAL_Init()上加上MPU和CACHE配置, t+ d9 _0 b2 V( E1 L& i+ Y
  /* USER CODE BEGIN 1 */
* D5 k7 Z9 ^) `4 R! H7 M# L  MPU_Config();
, r6 ]  i5 F" M  [" ?7 T" K& @  CPU_CACHE_Enable();
, D* y) H# ~- Q
  /* USER CODE END 1 */
2 E' U4 [0 E4 p
: E3 P# ?. Z2 h1 A- F  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */6 R: K: C- G" n7 b1 U
  HAL_Init();8 g, C+ z$ y+ ~: P
' h+ X, {$ K- U

2 |+ y1 Z4 x! y$ ~" d/ ~: K/* USER CODE BEGIN 4 */  ^9 R4 W3 e5 i2 o- Y
/**" B. }1 i; R1 s6 a
  * @brief  Configure the MPU attributes : f% [. N6 z2 L. P7 D) V
  * @param  None
& H- z0 f0 ?9 y1 G3 Z4 Q. d  * @retval None! K2 M& e: A' h( W
  */
" L7 t% ^, d% X: Xstatic void MPU_Config(void)/ \9 k( J; L9 x  `" L8 {: V3 c& ~7 T* ~
{
: B6 {7 e" x: [, c. b" s, C  MPU_Region_InitTypeDef MPU_InitStruct;& J! j; S* m! {& B( p: Y" x! x
: k; x7 g) K" H! \
  /* Disable the MPU */
. u. D; M; A! b  HAL_MPU_Disable();6 N! ^" f4 v4 @8 u* d

+ _. w: H1 @- B, b' g3 g  /* Configure the MPU attributes as Device not cacheable
- s  Q3 o. g* b/ ]     for ETH DMA descriptors */
# O8 v. |/ k1 h* o7 o: e  MPU_InitStruct.Enable = MPU_REGION_ENABLE;0 u- C! f5 O' C- w& J
  MPU_InitStruct.BaseAddress = 0x30040000;0 F9 ^' b' r7 z$ r$ \
  MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
4 A( v" D  Z- J% t  S( G( X9 K  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;% |. H6 A8 j' s/ n0 t* @
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;! s, J: E& W6 T4 Z; z
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
! Q( o5 J0 k, ?% ~* C  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
6 A9 y# |0 O; D5 D0 r6 q# D9 r0 o/ A9 c  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
' v: G; e* N8 N) k3 s2 E6 Z7 f  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
1 t3 |# i, j) H5 U1 N; f% t7 G  MPU_InitStruct.SubRegionDisable = 0x00;
# l+ c9 Z% C3 @# a) v' r5 Z! ?# @  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;+ j, u6 E" e& J9 C* T+ u
4 k. M( J% m* |; n5 [8 h- w% O
  HAL_MPU_ConfigRegion(&MPU_InitStruct);) t7 C' T& c' E# Y6 \  r
2 c8 r! a% z5 N: M) @
  /* Configure the MPU attributes as Cacheable write through
# k3 u+ @% f9 D8 d; o2 c5 w$ \5 z8 v     for LwIP RAM heap which contains the Tx buffers */
7 [; ?: o$ R( O  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
* }" r5 P3 ^( ?& ^' s, r5 ?  MPU_InitStruct.BaseAddress = 0x30044000;
$ ?) j& _& R. z5 O  MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;$ X& M% u5 o& |2 S- Y' `
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;/ a8 @+ B+ H0 h3 N( W0 F
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
- l# a1 B( |% W) M3 B1 J  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;6 z& F1 C' g9 x8 e- W& \/ B0 A
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;, J$ x( |9 K2 P/ i3 ^: [  J: Q0 B
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
. e# O( P0 o  I/ ]  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;. c& ~. ?8 ^% n7 M: x
  MPU_InitStruct.SubRegionDisable = 0x00;' t: Y3 c+ C; l2 {( O  y( C  F
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;3 |' z$ Q' O( d% ~; J2 T! I

! C. |- K- O) i' o5 C9 `  HAL_MPU_ConfigRegion(&MPU_InitStruct);+ i: |" h2 V5 ~! }6 j& }
/ l6 d; B( d: L2 A$ y. i
  /* Enable the MPU */
4 R" C1 W. }  e  x) X  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);) i6 b( W& R1 ?, D3 K# v
}
0 {5 P; J) Y# t. b" L8 Q0 v. Q) s0 P9 W4 h* Y% N- C) i3 W
/**
; v- @" V& U1 i% J; R0 q! F/ a, o  }  * @brief  CPU L1-Cache enable.5 X/ Y8 u6 L* ^* \  Q. Y' H
  * @param  None# m! O/ k2 s# @3 w
  * @retval None+ |7 l2 l! h3 |( M1 f4 h
  */
* ]0 O5 {' A9 F( ustatic void CPU_CACHE_Enable(void); h4 ^' q$ J6 |! r3 g6 U
{
1 j9 `& J$ j: U( n- K4 q, t- P  /* Enable I-Cache */
9 r! V. s: E# c, e  SCB_EnableICache();% g& {% q. }; Y% ~! n8 B- l5 X* T

- H$ ^; R9 v4 K; e3 E5 t4 k  /* Enable D-Cache */
4 y5 T& N* n3 n7 j- @; r0 n  SCB_EnableDCache();
) Y* g8 P* [1 B$ w" }}3 G6 C) f& F3 D- ~5 b  z8 E* z9 J

/ ~6 w. b7 b5 ]( A( A: x/ V" n
2 Q5 [* W& m9 K" b& C# J2、main.c中时钟配置中加上一句 使能SRAM3时钟( t5 x& n  |! o: G1 ?
          /* Enable D2 domain SRAM3 Clock (0x30040000 AXI)*/
% L. Q/ k/ a/ n* F9 P          __HAL_RCC_D2SRAM3_CLK_ENABLE();
+ t/ W, i- L) q: G5 N

# P' R8 u6 V7 H5 s5 z' b+ o, K/ u3 X/ A! g

, G1 Y  H# p% n3、ethernetif.c中DMARxDscrTab、DMATxDscrTab地址分配,注意和MPU对比
% d8 Q4 G6 J8 _. t1 [7 m' x: K  }7 i2 B- Z) G
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
" K# D. X/ ?2 \' E0 @4 ]2 o7 r( e$ Y! ~- t0 b0 y* d
#pragma location=0x30040000" O: x7 q' _+ g% \  [, d
ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */0 l6 R+ e; ?  ^2 S. W0 v
#pragma location=0x300400604 D) l% v3 N* m0 Y" L; i
ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */: ], t6 Y, O" f$ j  W; j
#pragma location=0x30040200
( H/ v* v+ _# f2 h3 F# u7 muint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffers */
" Q* a; O. D" e5 f4 T! W; t- m/ i1 I. {9 I# B$ g
#elif defined ( __CC_ARM )  /* MDK ARM Compiler */* x: l0 X% F. t' h/ M

0 D8 q3 T) u) X3 d__attribute__((at(0x30040000))) ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
* V& E; p0 L5 N  F" }. t__attribute__((at(0x30040060))) ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */8 S# `3 S& D5 X
__attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */
- _1 a4 R9 o4 U7 p! O# k% z
; L% u: c6 n+ }$ l( b3 T* |3 y3 d8 w#elif defined ( __GNUC__ ) /* GNU Compiler */ 5 P, N3 x! d$ l3 Z

8 l" \% ?0 \& YETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".RxDecripSection"))); /* Ethernet Rx DMA Descriptors */
, m  q! X$ u( G2 D; D5 u2 yETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".TxDecripSection")));   /* Ethernet Tx DMA Descriptors */
* m. ^0 U8 i3 [# [; euint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE] __attribute__((section(".RxArraySection"))); /* Ethernet Receive Buffers *// W* S3 X0 \+ H9 }8 c* f0 k- j0 M+ T
) l6 N; y3 s% W* S: M7 _+ X+ G
#endif
4 M6 L9 k$ r) J% x

* M, |5 {' R0 w
% v. p  U4 Q) E! D% F7 O7 ]3 Y# s4、low_level_output中
+ h1 `. n5 |$ Y* T+ O
" n; p; l  j" L8 L  SCB_CleanInvalidateDCache();, R+ n& o8 Z* {3 j8 l
5 L: p/ E7 j9 P0 Z& A5 I# \
  HAL_ETH_Transmit(&heth, &TxConfig, 5);
) [7 ~1 T: Q( a! r/ a( |
6 `/ f/ \1 N6 h3 T5、low_level_input中3 e( y) E6 ^! j0 V
1 V4 q' v& H/ y& i+ X# ^
7 Y, ~+ W' T! c# Y# }- z

" Y5 W' M0 a7 G' \6 R# M    /* Clean and Invalidate data cache */
6 p! O: R' `# ]; U0 R! ]! {2 w    SCB_CleanInvalidateDCache();
2 u: f; L! W: o. o
4 k4 \4 t. L# h, x) [    HAL_ETH_GetRxDataBuffer(&heth, &RxBuff);/ I( H- ~% O% u6 W
    HAL_ETH_GetRxDataLength(&heth, &framelength);
1 L% I% U2 m" ~- q                ; t- T+ L7 A) ~* X0 Z& S' S# L
    SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));3 @. y6 g3 S: M$ R0 {

- ?1 g8 c/ ?0 F' L
" o6 j$ o* ?; u' Z9 i+ I2 r% r4 m" r  g0 g2 N6 F8 X! E. B5 L
6、lwipopts.h中,注意和MPU对比' q* D: F4 z* f
       /* USER CODE BEGIN 1 */
: {: \0 _% `# z      #define LWIP_RAM_HEAP_POINTER    (0x30044000)
. O' @% S0 Y, f) s
) ^2 y) i2 p; V* `/ ~
  D! O. N. A& b/ g4 X2 q9 w/ a
7、ETH_RX_BUFFER_SIZE要一致
$ ]! s8 K* u6 P/ u2 X
3 N* e3 j  u+ t# N! b, B* t     heth.Init.RxBuffLen = ETH_RX_BUFFER_SIZE;
- e4 N! p6 i% c8 L     
' ~) ?6 p" S% R2 f$ ?     __attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */( b1 e( X' B5 C
; K  [  G2 N& F' l- }
   SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));/ \8 ]) j3 Z" |

  d# h; b: z# u4 m% |5 F, f! W5 y    p = pbuf_alloced_custom(PBUF_RAW, framelength, PBUF_POOL, &rx_pbuf[current_pbuf_idx], RxBuff.buffer, ETH_RX_BUFFER_SIZE);
, p& x* b3 P) L7 e( r$ V$ m: ], w8 y# @+ p% p6 t  ]1 h

3 d. @2 ~& D& M! }9 i# Q8、keil配置RAM如下,勾线IRAM2,不勾选IRAM1( `: O7 [& }" `# T5 w: p
      见附件。- b+ D. R; u( v* x( |! `

1 ~; A8 H4 U$ w2 ^4 ]
" V" ]$ [  d4 j! a1 w二、不使能MPU、CACHE情况
! W3 h* ]; \8 u# ]5 o  L& r1 E, M3 v6 j6 d; k& ~
上述1,4,5,6标红代码全部注释掉。  [0 H  d0 i$ A% B" n& o

7 T& P  N. T6 {1 b, j: S# w2 |6 z三、注意事项; `, M) v6 S) i; T
1、网络相关管脚配置成高速,cube默认是低速
3 o  H6 H' x. G0 V5 U2、可以先禁止MPU和cache,屏蔽掉相关代码,待网络测通后再开启MPU和cache,进行对应配置9 `' [8 l8 _5 R
3、H7目前官方库支持不到位,特别是有些examples完全没有经过验证,需特别注意
& u3 S7 l& k2 b/ ?' p4、使用MPU和cache时,多看看手册,弄懂机制避免入坑
8 z1 _- V: d6 T
# |$ L4 ^0 D( z) b3 r
' t4 D  z/ b) T3 ]6 r
# }2 O& s3 u! r! |+ f0 Y5 }! S
- v4 @2 u4 Y' w0 V9 C7 c
' _. {9 i2 F, z# g
QQ截图20180313200203.png

评分

参与人数 3 ST金币 +13 收起 理由
wolfgang2015 + 6 赞一个!
豌豆佛 + 1 赞一个!
MrJiu + 6 很给力!

查看全部评分

赞 1 收藏 18 评论37 发布时间:2018-3-13 20:03

举报

37个回答
HankZhang528 回答时间:2022-3-24 17:09:44

在大数据量通信交互时,会造成TCP链接中断,抓包显示服务器端有RST,ACK异常,同时ping大包ping不通。经过调试分析,原因是定义的DMA描述定义和RX_buff不够,同时ETHIN的优先级较低导致Lwip内存访问异常。

修改方法:

1.ETH_RX_DESC_CNT 和 ETH_TX_DESC_CNT默认个数是4,根据通信负荷需要扩大,我这里分别扩大到16;

2.修改ETH_DMADescTypeDef

RX:0x30040000

TX:0x30040180

Rx_buff:0x30040400

3.修改MPU的配置

 MPU_InitStruct.Enable = MPU_REGION_ENABLE;

  MPU_InitStruct.BaseAddress = 0x30040000;

  MPU_InitStruct.Size = MPU_REGION_SIZE_256B; //从256B 修改为 1K

  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;

  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;

  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;

  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;

  MPU_InitStruct.Number = MPU_REGION_NUMBER0;

  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;

  MPU_InitStruct.SubRegionDisable = 0x00;

  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;

4.串口打印可能有影响,视情况关闭;

5.将ETHIN 和 Lwip的任务优先级提高

豌豆佛 回答时间:2018-3-15 11:31:21
本帖最后由 豌豆佛 于 2018-3-15 11:43 编辑
& w0 {8 g. q" ]6 m
  w1 b. `: @9 J5 ?之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼主发的注意事项,1个小时就调通了,非常感谢!
. y# N& `+ v! r4 |我再补充一点,在配置LWIP之前,需要先给PHY芯片一个硬复位,不然配置不成功,H7的RAM起始地址一定要是0x24000000,我用的是IAR,修改RAM起始地址的方法跟KEIL不太一样,ALT+F7打开“option”选项,然后选择“Linker”>"Config">"Edit">"Memory Regions"修改即可;' h. q6 S; ~+ K' _8 ~
7 K5 g. Z; X/ J# Y9 J% E
另外有点注意的就是 使用CubeMX生成的“ethernetif.c”里面,默认的heth.Init.RxBuffLen是1524,但是在"stm32h7xx_hal_eth.h"中,默认的ETH_MAX_PACKET_SIZE 大小是1528,这两个是不一样的,需要手动改成一样的数。8 ]' v" M5 `! S6 }; `- e( y7 x# T
QQ图片20180315113746.png
onev 回答时间:2018-3-24 10:59:14
本帖最后由 onev 于 2018-3-24 11:01 编辑 1 _; e  P0 |2 ^6 `! u
4 F* L) W1 s6 B, ?
要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。。。不过楼主也是蛮厉害的。不知道楼主有测速没有?我现在遇到的问题是Rx速度不堪入目。
6 U% ^. v9 I$ C* g$ knetio:
3 T0 f- P$ S6 ^: b1 h7 S 速度.PNG
5 H: j* J; }" p3 k: |
$ A8 R9 F% a; H* B9 {+ U4 i楼主能加方式交流一下吗?
& p! E- P! e0 B$ o! u% {4 R* C$ B
( P- m4 p' v3 X1 k" S4 k6 l9 J  K; l$ Y* k
' e, O4 x: C( [- H4 {  Z3 k
MrJiu 回答时间:2018-3-13 23:32:52
先加个分,以资鼓励。。。特别是说明哪些需要注意的地方,这点特别重要!!!
switcc 回答时间:2018-3-15 14:19:41
豌豆佛 发表于 2018-3-15 11:31, k' ?: w8 A7 \4 k, Q0 s; F
之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...

, ^- m0 \& n, G/ K. ?5 N我耽搁了两周啊,后面被搞得没脾气了
wolfgang 回答时间:2018-3-15 15:26:26
H7是有诸多调整。
zero99 回答时间:2018-3-19 09:55:48
感谢分享,已汇总到3月原创8 E0 Y' n% d% I, u3 F
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
onev 回答时间:2018-3-24 11:23:27
豌豆佛 发表于 2018-3-15 11:31
4 O/ F. Y9 Q7 i8 x7 ^之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...
: [$ v; F3 V+ [2 z) m* q

7 n+ y9 p- c# y# L* T2 ]$ ^ 1528.PNG 4 j& J: R5 S; M& Y
1 q5 K3 f$ h9 u: }
4 S9 L# F$ j/ f% p; ~$ k+ T
你好,你的速度是多少?$ o2 o% P, \! p9 V2 i+ {
switcc 回答时间:2018-3-24 13:36:17
onev 发表于 2018-3-24 10:59
, \0 R/ e+ _  [6 P; g要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。 ...

2 }5 {$ Q' S: {5 |815201002
shih-min 回答时间:2018-3-29 11:34:51
謝謝!
ztin0501 回答时间:2018-3-29 13:54:27
感謝分享~~
stary666 回答时间:2018-9-18 19:36:48
我也刚拿到快743,还没开始玩
qianshishangdi 回答时间:2018-11-17 08:30:42
楼主,可以发一下代码吗?这两天调这个被卡住了
qianshishangdi 回答时间:2018-11-17 08:32:14
我用的原子哥h7iit的lan8720的例子改的,他代码里好像已经注意到mpu和cache的问题了,不过我调了半天,时钟信号都没有
人之颠 回答时间:2018-11-17 11:54:24
很好的帖子,顶一个
123下一页

所属标签

相似技术帖

官网相关资源

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