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

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

[复制链接]
switcc 发布时间:2018-3-13 20:03
本帖最后由 Switcc 于 2018-3-14 17:40 编辑
* t/ \2 A6 `: Y% i, \. F3 d8 V. E, h3 `0 c! Y4 o! @
上上周本人发帖询问stm32H7平台移植DP83848 PHY驱动的帖子,详见( o. H  n# L) |$ ^: _) H' j9 u2 J
https://www.stmcu.org.cn/module/forum/thread-614912-1-1.html3 m- `. W* d% v; {' X# p

) Y; y. @$ o$ {- P& Y& n$ [按照回帖建议直接使用cube库里LAN8742里的驱动,然后对照不同PHY芯片寄存器查看,可以读到寄存器数据,但是网络一直没有调通,特别是gratuitous arp设备上线的广播都抓不到,更不谈能PING通设备了。
6 T+ Z& f$ D8 R- g$ S/ p+ b+ E# J) E! ?: o/ C7 M0 b
经过长达两周的反复测试和问题排查,直接问题出在MPU和CACHE处理上。现分享使能MPU、CACHE和不使能MPU、CACHE两种模式配置说明:7 o( w2 U( |. n: o  k
. r, N9 Z7 Z$ _! [
一、使能MPU、CACHE情况* b" `' P. B2 w
1、main.c中 HAL_Init()上加上MPU和CACHE配置
( W5 S" }' E$ w0 a: j  /* USER CODE BEGIN 1 */
5 |6 B7 T4 ~% c' W4 E) d4 M  MPU_Config();6 e$ }+ o4 C8 x' v1 ~6 }
  CPU_CACHE_Enable();
% w  E9 k, J. n3 Y0 L% F1 [
  /* USER CODE END 1 */" C/ v' J) G' F) u* p% m
6 r. I9 A6 \  G0 l3 B
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */# _! _3 y' p8 a: q- \
  HAL_Init();
+ d0 @6 n2 e: d  W

+ F' _! b" V, n, I. M0 a
! ?8 z$ z+ v; I6 I/* USER CODE BEGIN 4 */
* h  R: w) Y+ O2 E% j: s9 ^, ^8 ]/**& l- A/ m* \: b( \' ]' V. `
  * @brief  Configure the MPU attributes
: {5 C, l& q: v1 X0 J$ Q" D/ a  * @param  None
+ k/ P) e' p% V  * @retval None& a* K% F; y# W9 s3 f+ C
  */
0 w- _$ P7 }9 N" i% A3 L; Q. Astatic void MPU_Config(void)
! e# {! q, `/ v  C/ x{) \3 A5 \( q( O/ x% u, F0 x
  MPU_Region_InitTypeDef MPU_InitStruct;
2 M' E4 _( m$ A& q7 g' T
: @, J' s1 T% z0 \$ o  /* Disable the MPU */
6 h' [0 K8 {4 X" d5 N( K  HAL_MPU_Disable();
0 O7 e+ E0 h+ J' k# g# a" N. Z, [7 x2 K+ @0 s- |
  /* Configure the MPU attributes as Device not cacheable 2 ~% i( T+ j+ G
     for ETH DMA descriptors */& h. U: o- j- w+ @
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
% u" m2 {2 ^' ]! T  MPU_InitStruct.BaseAddress = 0x30040000;
, ^0 u3 z) t( x- p" [& U9 s  T  MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
: x; b' z( ], C9 E4 g% h  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;% T7 E; L/ q( |; r$ e/ Y  N8 u0 H
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
: C9 w/ d' a' q8 e% i* r  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;8 [( H5 e9 V- ?% i
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;4 I. n8 F9 L4 o7 Q' g
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;! W& v" O& p. r& {: n
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
( z" ]/ ^' y" _7 i  MPU_InitStruct.SubRegionDisable = 0x00;7 Y, _; {6 h" |& T- N1 `$ o8 j) z
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;$ V6 W% p  N6 @0 D0 l
* B: {. D6 h1 F' ^/ t* A
  HAL_MPU_ConfigRegion(&MPU_InitStruct);5 l1 x0 Y9 L, I, \) ~7 G% w

- k, s  @2 w3 l  /* Configure the MPU attributes as Cacheable write through
' f  Z% H. Q! r' Y% f! N     for LwIP RAM heap which contains the Tx buffers */( p1 A1 k" U- n7 m0 r0 B& S- i* N/ B
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
' r* j/ M; L! O4 y+ q. m  f  MPU_InitStruct.BaseAddress = 0x30044000;
2 }2 b( M" I3 z! F, ~- j/ r9 T; s  MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;5 h) C2 k/ X3 \$ D
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
+ k3 y' B2 ^& |  r! P$ e  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;( i! g% U$ [  i
  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;# b" d8 P' h0 C% @" x6 [
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
4 K; ~$ y7 k3 Y2 W4 f  b- b; x  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
7 l( `; h6 n9 w- A  {$ g8 d  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;9 ?' ]6 Y! K7 h" ?
  MPU_InitStruct.SubRegionDisable = 0x00;
/ q/ B4 _2 e5 U7 k, m  N7 {6 E1 j$ v+ S7 o  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
: O: p" i' P4 _' z# B+ q) @# j: z
& H5 O5 t$ _0 w5 }  HAL_MPU_ConfigRegion(&MPU_InitStruct);
5 i; v4 r9 G! M, R2 Y" z5 _/ d+ P; X! s( b6 {# i* l7 k
  /* Enable the MPU */2 I+ C8 H3 u  S
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);& s' T8 m# T' [3 x1 O" l* g
}
3 V" ?; }/ _3 \' G1 ~7 _9 y% {, X
- j3 n: S& r- S! }  V  h/**2 q8 m; A5 l2 O  Q( e5 C$ T
  * @brief  CPU L1-Cache enable.8 ^  I0 {" U, W0 r7 r, H' F
  * @param  None
* P9 |7 C! \# A# }% {, v. J  * @retval None/ b9 K. e% _& I3 Z% L$ C0 Q
  */
0 c. H  W7 Y( r1 C2 O( J6 istatic void CPU_CACHE_Enable(void)
+ |7 U9 f; Z8 G{
9 D9 z2 w, V4 z& l( J& ~% B( y2 e8 ^  /* Enable I-Cache */; J" K" ?& \9 w. d+ ?( |
  SCB_EnableICache();2 R. Y  e. H' K: W$ M

/ u) C  j+ {7 M$ t2 h* {  /* Enable D-Cache */& d8 ^5 q' W( @* R/ p
  SCB_EnableDCache();9 f8 ^/ f# p4 z) v3 O# G% k$ k
}2 n; p8 B) m+ z' Z0 {) g5 t

* ?$ _8 q1 M% t  Y4 C1 E. W& \, w$ l0 n2 C/ O
2、main.c中时钟配置中加上一句 使能SRAM3时钟, H2 U; Z& R: z+ ]3 ]
          /* Enable D2 domain SRAM3 Clock (0x30040000 AXI)*/
" B: m. ]( e1 L; |- F          __HAL_RCC_D2SRAM3_CLK_ENABLE();
+ [  C7 U3 E* E. G3 G
) \  f* q0 i  U6 }; m6 A1 z

8 f1 S7 M0 X8 l" P% A, |: C, Z5 h, U) t7 h/ K; W' H% r$ ?
3、ethernetif.c中DMARxDscrTab、DMATxDscrTab地址分配,注意和MPU对比9 F( V% I! x' S+ d
3 O' t: y8 c, C1 ]
#if defined ( __ICCARM__ ) /*!< IAR Compiler */" v: N% x' H, d/ X# N* ?8 r! \
9 V. J" h. M- f7 r: R
#pragma location=0x300400002 N  d' s; |/ R, T, L- E+ }8 a
ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
: }% O6 n2 c) v' L#pragma location=0x30040060: c( u; ^  o5 X2 j( U* L
ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */
9 G$ X: L) }) B9 |" a#pragma location=0x30040200
2 K3 |0 G$ t7 S$ kuint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffers */
3 U1 I) W; e  f. d5 ^& |
2 {  f* G3 J- b4 O2 D' h#elif defined ( __CC_ARM )  /* MDK ARM Compiler */
' d; H  g: ?! W- a) B7 q4 A
! b* r5 q* P9 Y; }__attribute__((at(0x30040000))) ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
" S! j1 Y% P6 u6 g* Z' z7 P  h5 a6 `__attribute__((at(0x30040060))) ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */$ V5 f) }4 [8 y2 B! ?; ]4 ?1 O( `# H
__attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer *// ]0 W3 h2 ~% c

6 t3 W/ Z' h4 u' a* J& d#elif defined ( __GNUC__ ) /* GNU Compiler */ ! h, s6 c4 |& `( B

7 l. Q4 s6 _5 {3 f& _. w+ x$ bETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".RxDecripSection"))); /* Ethernet Rx DMA Descriptors *// X8 Q/ k, \0 T0 Q- L/ N/ M
ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".TxDecripSection")));   /* Ethernet Tx DMA Descriptors */
3 f; A. ~0 s5 X3 N4 q% _* puint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE] __attribute__((section(".RxArraySection"))); /* Ethernet Receive Buffers */
# ?( P' y: ^: b: _) W- N
- k9 E( r. F* W5 ]+ }9 F#endif( H' V  M9 y$ |1 [  i9 N" p5 {9 g
+ c! S. Z) F4 e8 }7 k5 P
1 Z( o! @- }) v' }0 G1 y
4、low_level_output中: G( i0 B: _, V% A; h
6 ~& o% @& W# M1 o8 x8 a
  SCB_CleanInvalidateDCache();
" R6 Y2 f, x. A' T+ N1 p+ T  H. ^4 r! P
  HAL_ETH_Transmit(&heth, &TxConfig, 5);" y/ {9 m3 k8 `- ~* W7 p- h

3 s7 O, h6 k+ L& D. j2 l5、low_level_input中
( g  p- Z, H% U' `+ a" N- |. t' p$ M/ s) ~

) a' w$ T+ t3 ~6 u" k
) _5 Z! e# H3 z6 X6 N
    /* Clean and Invalidate data cache */+ q$ b/ g# t: c# K6 s8 R
    SCB_CleanInvalidateDCache();
5 O, }9 h6 Y1 U* s) \+ W& t- U3 n  i: B* ^  _- n5 M$ {
    HAL_ETH_GetRxDataBuffer(&heth, &RxBuff);
) X4 w$ z2 W6 l  u- i    HAL_ETH_GetRxDataLength(&heth, &framelength);
3 P" J. L+ c- E" g: s1 C               
. G* `( E  C9 _' X* u/ O, {    SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));  W( T; ~. m, {7 q1 q/ L& A6 o

% h( D! Q+ I& _5 K4 Y. t5 A* R& I4 q- C
6 A5 X6 z5 i( ^' O2 _, B
6、lwipopts.h中,注意和MPU对比
7 {8 C  P" Y7 i5 p* D, T! O       /* USER CODE BEGIN 1 */
7 n9 @+ ^- s4 y$ }0 N      #define LWIP_RAM_HEAP_POINTER    (0x30044000)0 }2 x, f! @% @' Q

) ^1 h2 ?) M7 Y2 X8 j8 L% E
8 O! g4 R6 m  i8 \" o$ S
7、ETH_RX_BUFFER_SIZE要一致  D0 ]: X) z1 Y. J9 q

( W" B( d+ [! b# \" W' V     heth.Init.RxBuffLen = ETH_RX_BUFFER_SIZE;" b+ L4 j- S: E# A7 b
     / |. T1 l2 c, L# ~8 w0 }
     __attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */
! S0 R  z0 W7 j  `$ F, e$ `$ v% W) k+ k/ R
   SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));% ^& u5 d: {4 k# ~

0 ^+ I0 n* m, r; K; P: T7 o; K    p = pbuf_alloced_custom(PBUF_RAW, framelength, PBUF_POOL, &rx_pbuf[current_pbuf_idx], RxBuff.buffer, ETH_RX_BUFFER_SIZE);
7 }+ g, f; M5 C6 p! a4 e- z# C2 ]& |, x! J- u* E
" `1 H9 G  z+ v6 T1 w7 p, N% @
8、keil配置RAM如下,勾线IRAM2,不勾选IRAM10 d7 j+ w3 U! E$ C* J
      见附件。3 {/ P! o, H. {' A

/ H3 w- M  y% H6 B5 h
0 m7 |; m/ y+ B6 R二、不使能MPU、CACHE情况
3 r" g, q5 Y5 T7 ^8 Y) f) L5 O/ Y3 U
# y+ D2 Y" m* z- X上述1,4,5,6标红代码全部注释掉。
  r1 L( W" b/ j- m! r

$ d& y6 z& Q/ |  l6 o! a+ ?三、注意事项; I% e0 r$ \& @- k
1、网络相关管脚配置成高速,cube默认是低速
1 i8 @0 ?$ N) y1 o0 j4 j6 E9 |4 ]2、可以先禁止MPU和cache,屏蔽掉相关代码,待网络测通后再开启MPU和cache,进行对应配置
. n, S5 u, \6 I3、H7目前官方库支持不到位,特别是有些examples完全没有经过验证,需特别注意
& @* R, j4 ^9 Q, E- [4、使用MPU和cache时,多看看手册,弄懂机制避免入坑
9 Z9 c- n& G9 H% l9 u7 p& g* Z4 D* s) f3 o' M
$ v% i, _& n% p9 c3 X, ]) P' T8 i

. U9 v+ d' L$ A5 u+ P
1 h1 E( b6 l$ m9 y8 ~
2 h7 _) c* U6 f+ }9 v4 H7 r0 \1 T
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 编辑 : p# |* p: T. f( Y0 j" A. y
% ]4 c" L6 O6 e( T2 P; I
之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼主发的注意事项,1个小时就调通了,非常感谢!
3 K- W' h% _& A5 u# {$ E3 b6 @我再补充一点,在配置LWIP之前,需要先给PHY芯片一个硬复位,不然配置不成功,H7的RAM起始地址一定要是0x24000000,我用的是IAR,修改RAM起始地址的方法跟KEIL不太一样,ALT+F7打开“option”选项,然后选择“Linker”>"Config">"Edit">"Memory Regions"修改即可;
. _5 \  R9 \$ V( {% J5 c; t. v3 r# l* Y; i) I7 J0 G/ C1 @
另外有点注意的就是 使用CubeMX生成的“ethernetif.c”里面,默认的heth.Init.RxBuffLen是1524,但是在"stm32h7xx_hal_eth.h"中,默认的ETH_MAX_PACKET_SIZE 大小是1528,这两个是不一样的,需要手动改成一样的数。3 z5 V0 R- R/ B( Z  A
QQ图片20180315113746.png
onev 回答时间:2018-3-24 10:59:14
本帖最后由 onev 于 2018-3-24 11:01 编辑
5 p7 L6 C# m" Q2 h9 v0 [" m( v& k9 o
要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。。。不过楼主也是蛮厉害的。不知道楼主有测速没有?我现在遇到的问题是Rx速度不堪入目。
8 t: S4 K9 R3 p. q4 a+ ^- P$ ]- Xnetio:. }+ h' v: ~# J' Q+ G; ]7 v
速度.PNG : i8 _- j/ P1 D2 ~- y

% w$ E0 e9 k; V楼主能加方式交流一下吗?
( K. o( D  k! k0 `9 u( \# k! Y
; n- S8 D+ Z( d! K  L- `5 s& m" Z9 l5 Y: u

# y8 G/ l5 P" A& u/ f' Z1 z! S! h% Q
MrJiu 回答时间:2018-3-13 23:32:52
先加个分,以资鼓励。。。特别是说明哪些需要注意的地方,这点特别重要!!!
switcc 回答时间:2018-3-15 14:19:41
豌豆佛 发表于 2018-3-15 11:31
- V8 G; H  p" S! T; ^之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...

; L3 `& [" g8 Y我耽搁了两周啊,后面被搞得没脾气了
wolfgang 回答时间:2018-3-15 15:26:26
H7是有诸多调整。
zero99 回答时间:2018-3-19 09:55:48
感谢分享,已汇总到3月原创
9 F' n3 A% d: W7 z- i! {: y8 D' mhttps://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
onev 回答时间:2018-3-24 11:23:27
豌豆佛 发表于 2018-3-15 11:31
2 F) V" O) ]0 x1 e) l之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...

- n( e8 i0 ]" s% a' ]3 ]+ d9 t7 w' a; e, Y0 p6 ?
1528.PNG ( b. d# P1 [3 ^- j

5 b; Z/ {5 ^& }& d
) s* j& s8 d+ o9 u( z你好,你的速度是多少?
/ w8 f4 ]; C% q( t3 G
switcc 回答时间:2018-3-24 13:36:17
onev 发表于 2018-3-24 10:596 S- n* e" [2 g0 n
要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。 ...
' G) j+ A4 U$ t9 S" u4 X2 {
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 手机版