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

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

[复制链接]
switcc 发布时间:2018-3-13 20:03
本帖最后由 Switcc 于 2018-3-14 17:40 编辑
+ u. V! n8 E$ }6 w
  j7 V% y' ~8 i* G6 [上上周本人发帖询问stm32H7平台移植DP83848 PHY驱动的帖子,详见
* t+ B1 M" S$ H* W3 uhttps://www.stmcu.org.cn/module/forum/thread-614912-1-1.html,
& b+ n) r0 W5 `5 D, Y1 R9 X! D! U, z& A' b7 p/ s# y9 ~: v
按照回帖建议直接使用cube库里LAN8742里的驱动,然后对照不同PHY芯片寄存器查看,可以读到寄存器数据,但是网络一直没有调通,特别是gratuitous arp设备上线的广播都抓不到,更不谈能PING通设备了。( G* G$ ?( G! d- \3 D
2 y$ ^, S9 D, ~3 s& n9 ^
经过长达两周的反复测试和问题排查,直接问题出在MPU和CACHE处理上。现分享使能MPU、CACHE和不使能MPU、CACHE两种模式配置说明:
7 d+ ~1 c; e" J9 n( K. s  N, {. a) k% E" F3 e! q: K: l% o1 |1 S
一、使能MPU、CACHE情况( ?2 \# B% ~% k2 l
1、main.c中 HAL_Init()上加上MPU和CACHE配置
8 I6 m1 }1 w$ M4 z  /* USER CODE BEGIN 1 */: s1 O0 e6 n% a8 [. R( Y
  MPU_Config();' M9 K$ J* \# u" h3 B
  CPU_CACHE_Enable();

. L# [6 U. y8 f! F1 o$ I; k  /* USER CODE END 1 */7 n$ O, }3 ]1 m+ b0 Y7 R* w  F
4 X. X/ Z# ^2 J$ u2 \0 p
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
2 _: L( l+ g" u0 H7 ^$ i  HAL_Init();; C, V& ~& i: \
1 w1 R6 U$ l0 t8 c5 [- }) R) G

( O) u$ z3 M+ {/ L# N* j0 O/* USER CODE BEGIN 4 */
% y9 x, `6 i3 ^* F& v3 @# V/**0 L) Y( u$ [% O# D+ W" D! r" X5 ]
  * @brief  Configure the MPU attributes + i$ B4 l8 v' ?, b6 _( p
  * @param  None% L) Q8 M/ V) f% R
  * @retval None
1 e  j/ o4 ~; z0 Y) u7 A6 S1 W  */
4 {: Q9 F2 X+ L% Astatic void MPU_Config(void)! o' @2 d) i, H% h: v4 B- Q
{
. K8 r& J4 g5 t7 ?0 D& I$ \  MPU_Region_InitTypeDef MPU_InitStruct;
- Y8 c' u+ K( Q! g) y4 L. q& H* A# \1 m3 d  R
  /* Disable the MPU */
1 C% h# m0 F* L- V( B' x2 y  HAL_MPU_Disable();
! `8 m$ W2 F2 k" o; C7 C+ o9 t/ C% `9 V, @1 b  D4 p8 U; V3 O; v
  /* Configure the MPU attributes as Device not cacheable * c8 B2 ^4 N1 ~# h1 h+ G! U
     for ETH DMA descriptors */
( i. B* E" S8 V% U7 H5 U! {  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
$ C3 ]& H- ~" N. E) t# H2 E  MPU_InitStruct.BaseAddress = 0x30040000;0 P# E8 J* u' |, S
  MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
( g/ N/ U4 t8 K8 |+ Y( i  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;" [9 p0 [  `. `8 Y0 A* h3 F
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
& a" X" c- \) n( `, B  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;6 `  M% u1 B+ C
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
% ]' v, s1 [4 f: r8 Q% t  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
, h" P! O* C$ @# p1 X  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
1 R. u5 A+ N2 f( u, i  MPU_InitStruct.SubRegionDisable = 0x00;- Z9 ^1 r& U1 g; e' Y' f# i% V# W2 c  K
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
, ^0 U) z! z7 F" y
1 |1 Z8 J8 G  m. ~9 h  HAL_MPU_ConfigRegion(&MPU_InitStruct);
' K, _6 I3 b' H8 |# X; v0 I5 x/ m2 Y5 Q4 G9 u4 O6 Q1 T* y+ ^
  /* Configure the MPU attributes as Cacheable write through
4 k! l6 c( M& g- l' {+ Z     for LwIP RAM heap which contains the Tx buffers */
6 s: W& Z4 a6 p, v  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
/ R. J6 W' H) k; W) o  MPU_InitStruct.BaseAddress = 0x30044000;
. B8 ]! R" X5 i2 E% |! Y  MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;4 O: t& l8 k4 K* p
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
: E& n1 m3 [5 o1 g6 x2 {0 d* y  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
. f+ \1 G4 `2 S  I* j0 Y  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
' V& C; J$ o5 A, Q7 V8 }) b1 u! d  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;2 q" d1 ~8 r- P6 Z& h  X  y
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;! N# [1 |  ]1 a8 \. E" f8 \
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
1 ?* C4 Z# H5 N9 @' M8 O  MPU_InitStruct.SubRegionDisable = 0x00;1 X6 @( L& [: K, w0 l. ~+ H" Z! b
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
' s; f$ C7 M6 y: J; ]$ D* D6 j  K; i2 w3 q, H
  HAL_MPU_ConfigRegion(&MPU_InitStruct);' I, S5 a9 o" z3 d8 h( W- m3 k
6 e- a1 D7 K: v' C0 j
  /* Enable the MPU */, ]1 Q/ j5 b" A& ]
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
! g* @. V: h! w9 S; c) U- S8 E}- z1 k# c2 e5 U6 _- H" ?# y+ D, Z

) b) k+ `. g% K# U$ v+ d$ c* z/**/ [' P  U0 Q# {( S; w7 `' [8 p3 E
  * @brief  CPU L1-Cache enable.
, J# r9 W% y# w( r/ p; \& U2 X1 a  * @param  None
. _+ A5 p( S8 Y( N7 @% w7 b  * @retval None
, P. {. O2 ~- H3 M8 X$ P  */
8 M6 P; b7 B' E7 Bstatic void CPU_CACHE_Enable(void)5 s) \. e) o4 i& `& L- \
{: j- J6 a5 a) b, M
  /* Enable I-Cache */
+ y7 x" Z% d  W3 V2 d1 t  SCB_EnableICache();* g, C) g4 D2 d8 ]2 @+ I; E. W) _( l
9 c/ K# z" ~( c' f# [; A
  /* Enable D-Cache */
) b0 |# L8 a! e  SCB_EnableDCache();
# F: H1 g9 e) ^) |! \}
; |( H9 O6 H/ Z9 h+ W' }- ^

  S% u& H9 m2 t
& b8 p, o! f5 |: Z2 M, T3 p2、main.c中时钟配置中加上一句 使能SRAM3时钟9 ~% Y% W5 u% M) p. ~" x
          /* Enable D2 domain SRAM3 Clock (0x30040000 AXI)*/
( T/ w% f0 ~6 h& w0 W  ?; O+ I8 Y          __HAL_RCC_D2SRAM3_CLK_ENABLE();" f9 h- o+ v. c! X# |! Z
. E0 ?% I, ^; s  O) a8 i( s2 X0 |! ^- d
1 H9 r  c# c; ^2 B1 u' S
" C8 `) W- V( Z3 j& a6 p0 j$ `
3、ethernetif.c中DMARxDscrTab、DMATxDscrTab地址分配,注意和MPU对比) j$ S: f0 N' o* z

+ T+ {' V3 q+ u, K5 N#if defined ( __ICCARM__ ) /*!< IAR Compiler */
9 H% v+ ^6 n% a5 A' m- t" E) \
2 O: c- J- m! |5 m2 j0 V#pragma location=0x30040000
- z& m3 d( v8 d. m, }# s, jETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */! h, m: \# Z* K) P! X8 j& Z8 Z
#pragma location=0x300400604 v$ E7 M- Y& j8 o# \
ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */( X  ]3 q+ \+ r/ f6 O0 Q
#pragma location=0x30040200
% Z: a/ x/ M: k% v0 Z8 vuint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffers */4 }( O$ y$ T0 r/ o4 S8 b
; {0 U7 ?7 B! |, n
#elif defined ( __CC_ARM )  /* MDK ARM Compiler */
# Q4 P6 K7 b- O* S. F" d$ u! C' X8 d" o- d$ k
__attribute__((at(0x30040000))) ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
0 _" }6 f3 C( j3 p__attribute__((at(0x30040060))) ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */( T3 I6 C8 _! p* e, W
__attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */
7 B# o/ V9 @3 n* ]1 S, S' G) P! ?; O/ L. B
#elif defined ( __GNUC__ ) /* GNU Compiler */ $ p% D4 S" X, P( `: ?  ?

9 T" i9 q! V( D2 O1 wETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".RxDecripSection"))); /* Ethernet Rx DMA Descriptors */' ]$ F  [. I6 G& v; b+ M& D
ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".TxDecripSection")));   /* Ethernet Tx DMA Descriptors */
5 ]- [4 n1 `+ q/ e; g0 r+ n3 Q8 v( Zuint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE] __attribute__((section(".RxArraySection"))); /* Ethernet Receive Buffers */5 _0 s6 R/ d1 J/ l

0 {/ I+ d  @$ [& X1 F; v+ L#endif
. m$ l5 q0 h! Y+ f+ j
6 ]9 b1 B# f  Q) F; D( a, M% {

8 H1 [& a' I5 R/ l. @6 Z3 s+ J. _& }+ l4、low_level_output中
* {( e5 x- ]* o# X! ?# s
$ f# y9 D0 _' k; M2 w7 b  SCB_CleanInvalidateDCache();( u0 J+ D0 c# ]" v

* H8 g& h; p2 a* V2 U  HAL_ETH_Transmit(&heth, &TxConfig, 5);, t$ }! ^$ Z" p8 @

! W& |7 D% w/ @5 _# ^5、low_level_input中
" \/ G  |0 T! r8 t/ Z- Y* R9 O/ g9 \/ X. e9 j+ s% r6 p+ J
* {& a( F) }+ l  _6 h/ T2 Y

1 B8 K' W, g8 N    /* Clean and Invalidate data cache */% _% E- {  G7 m
    SCB_CleanInvalidateDCache();4 V7 P% }8 d: F# ^- q
6 a9 n! D& {: k- G  |
    HAL_ETH_GetRxDataBuffer(&heth, &RxBuff);
  c  B6 w# M5 m; n) V    HAL_ETH_GetRxDataLength(&heth, &framelength);, Z" U  z: M/ N" N
               
) \7 v: |6 n, c1 D1 ~2 Y# \    SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));
) t) O* S; P+ b
) x/ w8 D  R0 |! D4 _' l
9 }- E8 c* V1 K6 e5 D

# p2 `" P' U7 w1 n* E1 t4 u) c2 J6、lwipopts.h中,注意和MPU对比
7 M- o  R3 k9 _/ h       /* USER CODE BEGIN 1 *// |: G! f$ }( f- C
      #define LWIP_RAM_HEAP_POINTER    (0x30044000)
6 {, r. a; W* X/ _% H$ g) w3 W+ I+ S+ t* ?$ b* B, d2 d
% |4 w4 q  n" p. g; b1 U
7、ETH_RX_BUFFER_SIZE要一致$ [( N0 H, F; _. H% q' G  u& S* {9 J% @
0 ^3 P+ `6 S6 D  J( W( N
     heth.Init.RxBuffLen = ETH_RX_BUFFER_SIZE;
5 q0 r0 ?* z) u# h: t4 R$ X     3 f, }3 F+ t( q9 i$ e# d$ ^3 E
     __attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */. C0 P" O* o. E

0 }7 a( A2 k0 o6 R8 o   SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));
" z, N3 g9 p7 ]  f0 `( r8 Y7 s4 ~& a/ T1 U) I
    p = pbuf_alloced_custom(PBUF_RAW, framelength, PBUF_POOL, &rx_pbuf[current_pbuf_idx], RxBuff.buffer, ETH_RX_BUFFER_SIZE);
5 P$ o/ w. {9 H9 n6 V
+ y/ O/ }# E5 s+ u" {% `8 p

1 P0 X+ p% |7 m0 |( ]8、keil配置RAM如下,勾线IRAM2,不勾选IRAM1
4 ?/ {- x/ ~6 R      见附件。
/ Z) T) ]5 i" h9 s6 z2 V4 i" f' y. r) N

) N8 H! E: Q- r! C1 T  E$ `/ s二、不使能MPU、CACHE情况- m/ I+ @7 Z4 M6 O1 P+ k
" D. ^! z) u% Z; j& k+ ^6 q3 `
上述1,4,5,6标红代码全部注释掉。5 P. i: D2 s$ c  @/ e) h

0 p% ]; T' ]9 N三、注意事项7 _) O3 m' E9 C9 Y& `$ o
1、网络相关管脚配置成高速,cube默认是低速
# o+ I) |6 u! E; e5 ?2 u7 b2、可以先禁止MPU和cache,屏蔽掉相关代码,待网络测通后再开启MPU和cache,进行对应配置! l) U  g' s4 E/ w9 p9 [
3、H7目前官方库支持不到位,特别是有些examples完全没有经过验证,需特别注意# }- \. G- Z! q) R) ~
4、使用MPU和cache时,多看看手册,弄懂机制避免入坑* s; |! q8 @, M- x) I! e5 T

( c3 w4 F4 U* g( {1 H. @8 ^) {
- r6 M0 I$ g2 Z0 P5 v: _: V: f3 ~0 H$ a) N

" s% m6 L! e$ C9 v1 _/ V6 Y5 I
- L) N1 z' _' Y; x
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 编辑
+ r' L/ c0 Y, P+ S; z( w. \
- Y$ x# u/ f0 p- c之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼主发的注意事项,1个小时就调通了,非常感谢!
$ d: Z5 H) b+ L0 N6 i7 v我再补充一点,在配置LWIP之前,需要先给PHY芯片一个硬复位,不然配置不成功,H7的RAM起始地址一定要是0x24000000,我用的是IAR,修改RAM起始地址的方法跟KEIL不太一样,ALT+F7打开“option”选项,然后选择“Linker”>"Config">"Edit">"Memory Regions"修改即可;  P8 y, A" P  r) f; R
2 q5 c: ]& s- y; J  s/ C
另外有点注意的就是 使用CubeMX生成的“ethernetif.c”里面,默认的heth.Init.RxBuffLen是1524,但是在"stm32h7xx_hal_eth.h"中,默认的ETH_MAX_PACKET_SIZE 大小是1528,这两个是不一样的,需要手动改成一样的数。+ x' `& ]4 f. H. e7 F9 g2 F4 a. Q! s1 y: P
QQ图片20180315113746.png
onev 回答时间:2018-3-24 10:59:14
本帖最后由 onev 于 2018-3-24 11:01 编辑
& }6 L8 X" z* h; S9 m: `% |" n9 f% f5 @6 X
要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。。。不过楼主也是蛮厉害的。不知道楼主有测速没有?我现在遇到的问题是Rx速度不堪入目。
* O: L. N  h4 q4 Fnetio:3 R0 o. ]6 a3 v6 ^8 M4 u4 h  O
速度.PNG 0 g, _- Z2 s" Z3 X2 T

7 h5 h" O4 P! }+ M9 b( s! c楼主能加方式交流一下吗?
6 E2 m/ ^0 L; c; X" i
2 _3 B2 V7 x7 r2 z/ a6 r# k' k. X4 i

/ x, l6 I: C) x6 \# u8 R" k9 R
MrJiu 回答时间:2018-3-13 23:32:52
先加个分,以资鼓励。。。特别是说明哪些需要注意的地方,这点特别重要!!!
switcc 回答时间:2018-3-15 14:19:41
豌豆佛 发表于 2018-3-15 11:31
# i& ]- t8 d9 d6 |之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...

( d' ]+ d5 E3 X8 i5 s; C8 z我耽搁了两周啊,后面被搞得没脾气了
wolfgang 回答时间:2018-3-15 15:26:26
H7是有诸多调整。
zero99 回答时间:2018-3-19 09:55:48
感谢分享,已汇总到3月原创7 q: r( q7 x5 ]( w. d
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
onev 回答时间:2018-3-24 11:23:27
豌豆佛 发表于 2018-3-15 11:31
+ X% `; Y) ?( [# L* Z之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...

) n, e7 t" F! M2 W$ P, b) {) o( x5 C& H# `* P
1528.PNG
: v& q& V$ C) `* T0 ^6 c, I, N- O/ F; l9 \/ H9 D+ L5 u
2 ^: \/ \8 N# ^, v
你好,你的速度是多少?
4 [! A2 t. \! u/ f
switcc 回答时间:2018-3-24 13:36:17
onev 发表于 2018-3-24 10:59
: L" o* B/ q  U要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。 ...

& J6 y/ u  H1 S$ G815201002
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 手机版