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

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

[复制链接]
switcc 发布时间:2018-3-13 20:03
本帖最后由 Switcc 于 2018-3-14 17:40 编辑
6 a- A. h3 z2 u' G9 d5 R' V) Z* b  C
上上周本人发帖询问stm32H7平台移植DP83848 PHY驱动的帖子,详见
6 Y; \$ o0 O4 vhttps://www.stmcu.org.cn/module/forum/thread-614912-1-1.html- f2 M& K% b9 E) c9 c6 G7 d

2 A* n$ p9 Y# I+ i/ \) j/ A按照回帖建议直接使用cube库里LAN8742里的驱动,然后对照不同PHY芯片寄存器查看,可以读到寄存器数据,但是网络一直没有调通,特别是gratuitous arp设备上线的广播都抓不到,更不谈能PING通设备了。
2 ^! d. W6 t7 ~: J7 V
; j  Y7 V. I/ G7 a经过长达两周的反复测试和问题排查,直接问题出在MPU和CACHE处理上。现分享使能MPU、CACHE和不使能MPU、CACHE两种模式配置说明:" k& W) l% e/ t- M9 C0 R! _8 C
  i( G0 L. {: F
一、使能MPU、CACHE情况$ }& z3 A  E) k: X9 M; \
1、main.c中 HAL_Init()上加上MPU和CACHE配置
! D$ q3 `- A9 l8 B: M- p9 n  /* USER CODE BEGIN 1 */
5 i& O/ q- k' U( h  MPU_Config();7 g1 B  F% q- Y" ]
  CPU_CACHE_Enable();

4 x8 L; p' W- ?2 g0 x  /* USER CODE END 1 */
  J2 h5 e9 F0 i: x
/ N% C& V5 h1 D+ _$ ]* s  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
" Z: s  e( [6 r" ?" `  HAL_Init();
& Z" L  a+ n- @
4 Z, u- x! |$ P* l9 C6 B- O: p
, N+ S7 |/ u5 x) \
/* USER CODE BEGIN 4 */
9 g* U# _) l8 o4 m- x! ]/**
2 G0 o+ [6 L' ~$ h" M. r! Q  * @brief  Configure the MPU attributes : N( Z7 k8 V/ [' ?1 `0 h& u) V3 U
  * @param  None
" Z: r2 k  p, F$ G  * @retval None* {/ ]/ A& I. f- q2 x% b
  */
! E, T/ }6 v$ \- Sstatic void MPU_Config(void)
) z+ x4 I3 A$ O{( C( f. G* m2 |( A8 g
  MPU_Region_InitTypeDef MPU_InitStruct;$ F* @9 D3 c2 _

! R0 N# s4 Z; d0 S; F  /* Disable the MPU */
/ Z/ j9 b$ y8 h1 m1 K5 l  HAL_MPU_Disable();
5 b/ H' s: }. u$ Y0 k% M& `4 v3 ~; ?; J* l6 A# Q7 H  Z, N! Q2 K- g, X
  /* Configure the MPU attributes as Device not cacheable
: i7 U( @9 e- O2 o$ ?     for ETH DMA descriptors */- V& J. j5 s0 `$ D5 J' _! Z
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;0 Q; i# l5 X! y# n
  MPU_InitStruct.BaseAddress = 0x30040000;
* M! {" ~6 a: Y  MPU_InitStruct.Size = MPU_REGION_SIZE_256B;8 o* c1 D% _1 ~( r: u9 E, B! X
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
+ G* y/ O; I! c* M" g' ^: z  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;8 Z  [" r  u) I. K  x5 Q. U. k
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;% X( o  H% ~3 F+ Y6 i! C4 j
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  n6 I+ M$ h+ u( M( H, e( B! r  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
4 L* k0 g) U$ C/ ?  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
' I  \# s7 y$ j1 G! k" c  MPU_InitStruct.SubRegionDisable = 0x00;
0 A) W# G$ d  Q3 Z; {3 T  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;5 I% W$ C! F8 `! E) l% r3 U

$ F% \9 [* Z( z" n3 L' l* q  HAL_MPU_ConfigRegion(&MPU_InitStruct);
, P) \" E/ v9 Z/ R3 e" k# G
7 o  c) V& Y9 r6 u  /* Configure the MPU attributes as Cacheable write through
5 O  B4 j1 q$ f3 x: o9 H3 n     for LwIP RAM heap which contains the Tx buffers */: V* _+ x3 ]- z; `
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;( S$ q" n* h# N
  MPU_InitStruct.BaseAddress = 0x30044000;3 H& t$ _3 e& n$ f" o/ n0 `
  MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;
& M+ h( d8 ]5 H' [( ~  ^/ B+ w  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
( J* i! t. z. d7 z- `  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
: v( ~/ i$ h& }+ R( d  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
: i( ]9 a0 G* @& f: q0 c0 U  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
# D& ]- e$ ^$ y( k6 G1 u9 ^  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
1 Q( h- @2 o# P# V  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
9 U/ ]8 k" [8 N8 G% r  MPU_InitStruct.SubRegionDisable = 0x00;
. ]* Q+ @0 D: @; D2 ]  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
1 B  q2 c! _4 h1 z' }, Z0 g+ |( B' ^8 ~0 V, E5 w+ e+ I: t+ M, |( _
  HAL_MPU_ConfigRegion(&MPU_InitStruct);
5 {7 j6 G! H+ {/ p! W4 ?' A0 E; y# H, \( p/ F
  /* Enable the MPU */
2 {" t7 t3 P- O  o/ G, S% u  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
  ^4 O% O5 L  l# ~; g}0 \9 L" n, _4 d; v# [

6 P6 e( p1 i: S2 {/**
/ K6 m8 ]. v/ A% q% j  * @brief  CPU L1-Cache enable.
6 B, V( o+ E! V3 E$ r  * @param  None5 h) [# D+ o2 a9 e% Q: G
  * @retval None5 c1 m" y; L8 }# v+ w* v! J7 Q
  */
- R# N5 L9 p. g" d7 l3 Qstatic void CPU_CACHE_Enable(void)
: N; G) a" @+ c! S# ^7 o- g$ |) ]1 ?{
# `' A8 x6 c- x  /* Enable I-Cache */
+ a; C; I/ F5 Z# T  SCB_EnableICache();& S* y. O% L3 I% o9 i

1 U$ p4 f3 P9 l  /* Enable D-Cache */# p0 i2 K: d" A% O$ q! M- E
  SCB_EnableDCache();& H' u8 l# y: Q, I  G: c
}
) T* I' o5 W$ ]1 ?. n3 H& G
& r/ i) Z4 R% a5 P. |, w
% W+ c7 @6 n' x* o0 P6 x
2、main.c中时钟配置中加上一句 使能SRAM3时钟
& `% F4 ?& `: I0 t          /* Enable D2 domain SRAM3 Clock (0x30040000 AXI)*/
( X" B8 Z+ D0 \' J5 E: Q3 N          __HAL_RCC_D2SRAM3_CLK_ENABLE();$ e4 ~; E! [' L- Q

3 j( V& R3 ~# V( g$ R: C$ d/ C9 m' q1 B3 a7 R6 e

  M! A" t5 @8 r3、ethernetif.c中DMARxDscrTab、DMATxDscrTab地址分配,注意和MPU对比- \# G( O9 ]# G# A$ [7 ^
3 t$ [. w& \( l2 a5 q* I7 [/ k
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
6 R) G8 E* M- i* [+ i% v, }9 e4 y  q" I  Y* p9 a
#pragma location=0x30040000
  N' r% b8 @. Y% QETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */3 v2 l# w1 o7 q+ A
#pragma location=0x30040060. h3 y! H6 ~' g3 d
ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */
0 H  u0 ~0 n/ y0 j#pragma location=0x300402006 i3 x# r+ k& d# p4 g
uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffers */
* A  ]0 }8 c" c( c3 i9 j& m( H! m8 H, B
& A4 n5 R$ e( q1 B#elif defined ( __CC_ARM )  /* MDK ARM Compiler */5 ]1 q% c* j8 O3 {

7 H" p. s  ~1 Y' A1 q__attribute__((at(0x30040000))) ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
1 A, o6 K4 o+ z0 l9 i% a; R__attribute__((at(0x30040060))) ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */
: T* J8 j1 F/ {4 ^4 }__attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */8 r1 d! w) L1 \8 Q
8 }: Y$ ?' c0 ]; R+ v
#elif defined ( __GNUC__ ) /* GNU Compiler */
8 K" h% \5 [7 E8 X( q
+ T! B3 }& Q4 K; f& GETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".RxDecripSection"))); /* Ethernet Rx DMA Descriptors */
2 w+ t! a& D0 _2 vETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".TxDecripSection")));   /* Ethernet Tx DMA Descriptors */
# m8 s. u" _$ x2 Q8 _- |* {5 @8 ouint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE] __attribute__((section(".RxArraySection"))); /* Ethernet Receive Buffers */" b, p( ^$ B( R! T6 ~$ U2 ?1 w2 Z; Y6 V
! h( Q* X" x- u, y. s
#endif
7 j2 a% [/ w% [$ [) C, O
! M! K2 _' u) I. Q' z
2 t( A2 d9 C1 P: |4 {- p) |! e( g
4、low_level_output中
3 Z' y) O7 k1 W3 k0 d) C( [! O" I; Z# M# l- P5 a9 H( l. N0 Z0 l
  SCB_CleanInvalidateDCache();6 X$ I' G- ?! v' s0 t  m  ]
! R& o- W0 c5 v
  HAL_ETH_Transmit(&heth, &TxConfig, 5);
; z0 u5 N' [7 ?' V0 l
( W( z; s1 ?/ W$ X$ ?% x5 U$ M5、low_level_input中
: {4 R; p5 w1 L! P0 V
& l5 a8 @! l0 t: F  F# x" k) `3 t7 ~5 i' k9 F, _
; C2 t& @3 s8 U
    /* Clean and Invalidate data cache */
( K/ z! F# N: S4 |) p* z) \    SCB_CleanInvalidateDCache();
, B# X9 r$ H' P$ e; `8 N; X4 S
! F# k3 u. ], ]+ {/ @) H    HAL_ETH_GetRxDataBuffer(&heth, &RxBuff);
& m# k+ S2 s+ Q4 k; K9 }9 d6 q& d8 I) R    HAL_ETH_GetRxDataLength(&heth, &framelength);
5 K8 {) N. s/ Z$ b# f% ^+ ?                % |, n* e* T- A3 u$ N( g+ f+ _
    SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));: A" j! F: l5 h2 G0 J

1 q- r$ H1 p% i1 o4 }
- L9 ^' L- J& O8 p1 I* n
  t* `0 U; {% p- j4 R2 h9 Q6、lwipopts.h中,注意和MPU对比
2 P) n7 z; \3 s3 V5 J' U: k5 R       /* USER CODE BEGIN 1 */
# N+ {, H4 {8 ]6 Z      #define LWIP_RAM_HEAP_POINTER    (0x30044000)
8 a; {  g  f2 d% X8 F- o, n6 |0 ]" }, H  C# u* L& f6 M* J
8 n8 T% y4 V! s' T) c3 }
7、ETH_RX_BUFFER_SIZE要一致2 o1 Z6 e7 z, B  s. X
! o6 [6 G' E- k; a9 w3 W8 O5 N. @
     heth.Init.RxBuffLen = ETH_RX_BUFFER_SIZE;
- a2 Z3 q0 X& V( `  W$ W     
! P1 V) X# ~: W  F; W" G1 b     __attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */! ?9 n* G- m2 U) g5 R* p) ]
2 o  g# o& o: }: @4 r9 _  L" i
   SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));  h  v" z0 q' p) H2 o9 W
) y& M6 D% i% `; c; e7 ^6 ]" I
    p = pbuf_alloced_custom(PBUF_RAW, framelength, PBUF_POOL, &rx_pbuf[current_pbuf_idx], RxBuff.buffer, ETH_RX_BUFFER_SIZE);
. C+ V2 u% [/ d& B, u& y
5 J; n- s  v) L' D. B+ h

7 O6 @6 @& o! @' D. X8、keil配置RAM如下,勾线IRAM2,不勾选IRAM1
; \6 W; \& ^1 j) S- e+ c. n4 A; H      见附件。
0 y2 _; _6 V$ X& S$ V$ u9 _. J
  I; p" Y, e' j8 l0 B* m, r& @  e% G8 W! Z" L% P- y' D+ i
二、不使能MPU、CACHE情况
# a; {/ z3 h9 X: J, y2 }" s' Q% w! K- G
上述1,4,5,6标红代码全部注释掉。+ s8 H( D6 ~7 l9 ]# h
' B1 t2 J3 A) S. m5 |- j0 E: u1 i
三、注意事项7 D' X! E, `) D3 x1 C- S$ @
1、网络相关管脚配置成高速,cube默认是低速2 T. P  @$ s0 M2 ?. {
2、可以先禁止MPU和cache,屏蔽掉相关代码,待网络测通后再开启MPU和cache,进行对应配置, _4 n, Q( u( W1 m$ S2 ~/ p, J
3、H7目前官方库支持不到位,特别是有些examples完全没有经过验证,需特别注意: E4 y. i3 c+ L
4、使用MPU和cache时,多看看手册,弄懂机制避免入坑4 p/ A, L5 E! B1 V
# M' [1 V; t" \3 B" N# a5 c6 v) F
6 @( _0 [& P  }- K. G
. }( {, C3 r( w: Z5 v
! ]2 u1 Y8 `8 N
: K$ m) s+ E, ?. j4 v3 {% ^* a: [1 _3 j
QQ截图20180313200203.png

评分

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

查看全部评分

1 收藏 16 评论36 发布时间:2018-3-13 20:03

举报

36个回答
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 编辑
8 w8 z: X) i" z- ~" H6 P( h0 }( ~9 N1 W6 [; q& I( m" A5 x* f
之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼主发的注意事项,1个小时就调通了,非常感谢!6 m4 H% z' t# x3 w
我再补充一点,在配置LWIP之前,需要先给PHY芯片一个硬复位,不然配置不成功,H7的RAM起始地址一定要是0x24000000,我用的是IAR,修改RAM起始地址的方法跟KEIL不太一样,ALT+F7打开“option”选项,然后选择“Linker”>"Config">"Edit">"Memory Regions"修改即可;- s, Q7 P6 ?9 R) [  W
# L% s# u- A. a$ M
另外有点注意的就是 使用CubeMX生成的“ethernetif.c”里面,默认的heth.Init.RxBuffLen是1524,但是在"stm32h7xx_hal_eth.h"中,默认的ETH_MAX_PACKET_SIZE 大小是1528,这两个是不一样的,需要手动改成一样的数。8 L7 D9 Q; U$ @& v
QQ图片20180315113746.png
onev 回答时间:2018-3-24 10:59:14
本帖最后由 onev 于 2018-3-24 11:01 编辑
1 x$ O! s8 x7 y2 Q5 v1 r% z( `3 F) H! @
要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。。。不过楼主也是蛮厉害的。不知道楼主有测速没有?我现在遇到的问题是Rx速度不堪入目。2 K5 O0 @  c$ Y
netio:8 J! ~* J3 i8 x: y3 C6 B  R
速度.PNG
5 ]  {+ x8 W2 s, C! q- `# a: F, l% h+ s, {/ b
楼主能加方式交流一下吗?4 L, C4 v  m: Q+ D5 a

$ E* c- a% c! O' l5 ~, t) c$ Z  Q8 A1 \1 c% e. m! X' X. M

: f, b9 e9 {; }( |, q+ S
MrJiu 回答时间:2018-3-13 23:32:52
先加个分,以资鼓励。。。特别是说明哪些需要注意的地方,这点特别重要!!!
switcc 回答时间:2018-3-15 14:19:41
豌豆佛 发表于 2018-3-15 11:31
, n( A0 D* t3 K$ D7 c% F之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...

. x) ?3 \3 p$ t; B# P- D$ _3 E我耽搁了两周啊,后面被搞得没脾气了
wolfgang 回答时间:2018-3-15 15:26:26
H7是有诸多调整。
zero99 回答时间:2018-3-19 09:55:48
感谢分享,已汇总到3月原创$ Q+ v4 K% i9 \" A# g0 K
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
onev 回答时间:2018-3-24 11:23:27
豌豆佛 发表于 2018-3-15 11:315 k/ r+ [5 G$ x$ G. M+ j/ n$ Y1 k7 @
之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...

1 {  a$ u( D7 H% b1 o
3 P: b* Y6 O( H0 J 1528.PNG * K! V) X. y4 S

8 V, G0 y4 q: _$ f6 F9 s7 z
( \( V  ]- _3 g8 \% b* q' e( M你好,你的速度是多少?
& A# ?) r: _  X+ ~1 r
switcc 回答时间:2018-3-24 13:36:17
onev 发表于 2018-3-24 10:59
* A- C0 b3 p" H' y要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。 ...
, M+ f- h5 K- x7 g& Y
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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版