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

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

[复制链接]
switcc 发布时间:2018-3-13 20:03
本帖最后由 Switcc 于 2018-3-14 17:40 编辑
  B* h9 k; m4 ^
% B& e/ |2 Z9 F$ \9 I! x/ K上上周本人发帖询问stm32H7平台移植DP83848 PHY驱动的帖子,详见
: H+ u3 H6 P) U6 f3 F- H2 Vhttps://www.stmcu.org.cn/module/forum/thread-614912-1-1.html- V6 E) P7 a) N- }
5 B* S& g' w) F& h# H
按照回帖建议直接使用cube库里LAN8742里的驱动,然后对照不同PHY芯片寄存器查看,可以读到寄存器数据,但是网络一直没有调通,特别是gratuitous arp设备上线的广播都抓不到,更不谈能PING通设备了。8 o; V* E9 g! m, W! d: H
# H/ o5 A$ k; y( P" K0 R
经过长达两周的反复测试和问题排查,直接问题出在MPU和CACHE处理上。现分享使能MPU、CACHE和不使能MPU、CACHE两种模式配置说明:
8 Y3 M  M/ V, T8 n1 u$ R# X  J
) G( T0 D0 q" L一、使能MPU、CACHE情况! b; S1 a" ^1 C4 f3 K6 H4 m
1、main.c中 HAL_Init()上加上MPU和CACHE配置9 e- r7 N/ z* F$ q# p
  /* USER CODE BEGIN 1 */
2 P) A6 V5 t  O7 R4 I( `) e  MPU_Config();
& s, }( t- h9 h  P  CPU_CACHE_Enable();
. g0 t5 p( V  K2 m
  /* USER CODE END 1 */7 K1 j1 x5 ]* P- d$ F! z

* ?9 z& ^; d6 e: j8 n2 J" B3 o  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */1 V/ y! I& c* k# U: x
  HAL_Init();$ d6 F0 S$ Y0 W9 |# L

( W* j- M0 R% S7 o) R/ b" [
7 Z1 H2 r0 j  `. E7 Z" M/* USER CODE BEGIN 4 */, L) T& B0 G8 j$ }; ?/ M7 Z
/**# h0 x7 f9 m2 \% U8 z: ~
  * @brief  Configure the MPU attributes ! ]# D, t4 H& D9 [/ ~
  * @param  None
) |, E" g/ O7 v: a- Q+ ^' {; U4 a; x  * @retval None
% A& |. [# S" N, K& Y  */- O: R" ~9 s3 W# u: S4 p
static void MPU_Config(void)
, V8 I% E5 X" J* m, g* \{
$ B# c, i) g2 ^# w; q% c7 p" C  MPU_Region_InitTypeDef MPU_InitStruct;  a9 r9 j+ v- d3 q7 N
6 |% a/ P# q+ S8 ^0 A2 ?
  /* Disable the MPU */2 j  }0 @8 I, m2 K* e
  HAL_MPU_Disable();6 R; [2 [6 J( R( ?7 @5 w
0 Z! I& z( l! C4 Q# n" T" r
  /* Configure the MPU attributes as Device not cacheable
3 W# V9 ~# |* e; H     for ETH DMA descriptors */8 v8 x9 E, z9 R$ V" P) e
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
' N; y) C: q# S8 ]' E& F! F0 j  MPU_InitStruct.BaseAddress = 0x30040000;
* P8 R3 d$ I6 ?& I+ N4 F( c  MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
! Z! {1 ^0 |1 G) ?: }7 h! V0 j  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;: o0 A0 {, i5 m$ b% A" J
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;2 @% q: H, i# I% m
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
! n4 _3 M0 Z) g8 k9 o+ }1 A  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
* C; y- U; |! b1 Q% l7 Q  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
" L  m/ K: r- ], _$ P, W) w  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;- f& W% ~8 e& ~  Z6 y, ], i0 `* b
  MPU_InitStruct.SubRegionDisable = 0x00;
1 `8 p  C  ]6 X  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;- g  d! {/ k8 K$ k# [: U! T
2 R/ R8 G% D  d# c
  HAL_MPU_ConfigRegion(&MPU_InitStruct);/ R' L' Q) G/ g2 [0 D; S
* `5 `  V' v  _2 ]/ {% c/ h+ u+ f# U
  /* Configure the MPU attributes as Cacheable write through 4 |. l, `; Y: m/ ^+ }
     for LwIP RAM heap which contains the Tx buffers */, o) W- A# K$ o* r  Z& p; h
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
% `; _# w' q2 Z0 o4 L1 h  MPU_InitStruct.BaseAddress = 0x30044000;/ ?9 i& b1 {% e- j# H* q, G
  MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;+ r6 e; H! h6 y/ X8 O3 i0 W; {% s
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
! x& a! Z8 B/ v' i; G# [  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
; Y- e4 {4 Q; b* G! X  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;+ m8 V( ]& A" p. z$ H
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
: m( Z4 a5 ^* q/ b0 s# r* U$ F  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
2 S0 }, B0 l) J) U6 T! a7 `( F  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;: }3 R+ I9 v/ g* S8 Z
  MPU_InitStruct.SubRegionDisable = 0x00;7 ]7 ^3 M, Z/ F* W* a
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;5 r$ Z" K8 I4 \6 a
& ]9 Z1 L2 s- M; r, O8 e1 ^
  HAL_MPU_ConfigRegion(&MPU_InitStruct);" Y( T: N1 d( i& {
1 v9 A/ k# z% |: S9 X3 g! w
  /* Enable the MPU */
2 O# u! n" t8 Q* Z  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
1 w; {! w) x/ }. ^4 i9 \7 w8 M; Z}
5 I- t$ s) w4 b
2 F: }, F  a) H5 Y$ o5 N4 t/**  u; m# i0 w2 M- Q1 k6 @
  * @brief  CPU L1-Cache enable.! k. |# G: n  n/ v
  * @param  None
; @5 |! x" m0 j3 d5 P( b  * @retval None* k) ^6 J6 e4 p. i) w
  */
" V* t: A9 h' ^6 X$ ?/ _% @' Gstatic void CPU_CACHE_Enable(void)
4 Z- B/ \! t1 r3 b8 K, m+ k{
# C/ w8 Q9 c2 C  t3 y7 U" a3 g4 H0 `  /* Enable I-Cache */( j; C* B! t% E  q% A* S
  SCB_EnableICache();
% D7 u4 ^8 @7 E" W4 e6 C# M( l+ k
, A$ C' i3 Z4 U4 h( S" u  /* Enable D-Cache */) c2 i1 B/ n8 l2 v" L5 B4 o
  SCB_EnableDCache();
  s, S4 F( t- v' p  o}
3 Q8 v  i+ u9 \4 p* h

2 ?/ L! r  h4 @3 e0 l4 {/ G9 b+ q/ s0 v2 \; T" G9 z( g
2、main.c中时钟配置中加上一句 使能SRAM3时钟
& ?& u. }$ `  \& [# l          /* Enable D2 domain SRAM3 Clock (0x30040000 AXI)*/5 f; A% w1 D$ `: u* g
          __HAL_RCC_D2SRAM3_CLK_ENABLE();
3 m$ D7 j% r. }6 Z; B
% ]  g9 q1 w9 s4 U# A9 m

4 o0 H  W: z( K8 ]0 i2 f
5 L+ R) \6 R1 D$ }' F' ]3、ethernetif.c中DMARxDscrTab、DMATxDscrTab地址分配,注意和MPU对比
& }4 ^& Q* p# B+ P2 y4 B
6 F# W8 s$ v, p, C  R+ o3 y7 k0 Q: g#if defined ( __ICCARM__ ) /*!< IAR Compiler */% f3 g% a$ h1 {/ W# o/ e; T
2 d% d* V' Z: U) F8 {
#pragma location=0x30040000  H- \( a: |$ J" ]5 ?
ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
7 B7 t9 X$ w; w) e2 f#pragma location=0x30040060
) a( O/ I; {( B& lETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */$ I7 ]: [' X  j+ k+ ]: t
#pragma location=0x30040200' i8 a" r! d9 }% R- e
uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffers */4 ~, Y( i" t. `

8 r9 Z/ c  V. k  S* ~) t4 D8 U#elif defined ( __CC_ARM )  /* MDK ARM Compiler */
  s! e( L% L' B* Q
/ p+ ]7 K0 e4 D__attribute__((at(0x30040000))) ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
' y1 P# b; s4 c/ t; y8 g$ Q; o__attribute__((at(0x30040060))) ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */
; D- o+ f- {. Z- g__attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */
8 w/ t. ^' X# O1 q1 J
3 C% m. j- X+ i/ ~4 Q#elif defined ( __GNUC__ ) /* GNU Compiler */
* A5 d. P1 w6 h" N* c/ S6 O: H2 P! t  N1 \8 m1 C- @5 J
ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".RxDecripSection"))); /* Ethernet Rx DMA Descriptors */: \/ i* r4 d( c# ]# i1 L+ O
ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".TxDecripSection")));   /* Ethernet Tx DMA Descriptors */* p, s1 \9 k! x% w& \  {# J7 H
uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE] __attribute__((section(".RxArraySection"))); /* Ethernet Receive Buffers */6 n4 t' `0 B) R; n! M& n  Y
, @3 F( @8 S0 _4 t& q8 X
#endif; k* L+ x  D' d' a

; l% z+ d& |# u0 e8 l. m$ ~% x
8 C: p8 }& o  \* J7 ~) F4、low_level_output中6 V# l' R* l' _8 b% ?

1 k3 |3 M* H3 I) L$ }& K  r  SCB_CleanInvalidateDCache();
" ]9 `" w" X/ V9 n8 j$ @, j6 X; V' o  J1 b
  HAL_ETH_Transmit(&heth, &TxConfig, 5);
2 y  k# X. D1 y% \; w1 ]. ^3 c! E  s
: \% a  }# i- _5、low_level_input中7 ~6 D, E8 e  d+ N

2 b0 ~7 G2 S! d/ Y, l
, ?3 Q; U. x% s3 |4 F( q
7 e% V0 h( o; g0 q( k; y
    /* Clean and Invalidate data cache */
+ N9 i; h6 j* r8 z4 d1 ]0 f3 d    SCB_CleanInvalidateDCache();6 D2 i* J. S5 z; w1 x. E

5 c6 g- G" }7 {- e$ q7 {    HAL_ETH_GetRxDataBuffer(&heth, &RxBuff);
1 R2 ]- c7 q( M7 q    HAL_ETH_GetRxDataLength(&heth, &framelength);% f0 w5 m) Y( S. R. K
                  i0 p0 E+ o( ?# y, f" j, c: S: w0 w
    SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));
. E/ h4 F; F( F! t

1 W; L/ V9 C2 }9 Z0 r
& t0 w9 B0 [& D9 T: i/ ~6 O6 X! H1 g9 l* u; X
6、lwipopts.h中,注意和MPU对比5 a9 ?9 ]: }5 k* @
       /* USER CODE BEGIN 1 */
% B) f+ D0 e* U* V9 Y4 q5 [      #define LWIP_RAM_HEAP_POINTER    (0x30044000)% G, z5 D) F2 C8 p

$ i+ a/ z8 L& S9 [+ t+ X, S- T
1 N# H& b9 {- b5 s
7、ETH_RX_BUFFER_SIZE要一致
& {$ M1 p, l" o5 k; j+ y2 G# s
; d5 w" h0 x. x( X' d" ]7 |     heth.Init.RxBuffLen = ETH_RX_BUFFER_SIZE;
! b4 M) w* h$ N$ `$ h8 J/ b4 w       R# D  p2 H. M( V! X# L' A
     __attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */
  p% z3 D( Y) I# q1 y2 t6 r7 Q, E6 K. P! F  g8 Z
   SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));
& _2 F, \! j9 _# Z8 y! G+ I/ A5 p& u9 D
    p = pbuf_alloced_custom(PBUF_RAW, framelength, PBUF_POOL, &rx_pbuf[current_pbuf_idx], RxBuff.buffer, ETH_RX_BUFFER_SIZE);
1 t  }( K* k* h6 d2 E; o0 T+ q0 `% K; n& v) a
; N- a+ w' `- F& }' ]) y
8、keil配置RAM如下,勾线IRAM2,不勾选IRAM10 Y% [1 v9 @' B( a- ~: B
      见附件。0 [# T3 s8 e0 }+ f/ k: D. L6 q

4 [2 K; X, l. l
8 V0 K/ F0 l' y$ u# b5 P4 g7 }4 W二、不使能MPU、CACHE情况7 o& t% L/ C% g9 |* o
; H+ u9 V5 V' c6 U" F
上述1,4,5,6标红代码全部注释掉。
' k3 S" W- e$ T& `, L

& z- K/ b' }! y* G( J% f三、注意事项
) D6 i# ^" A, U" c) A1 i0 W1、网络相关管脚配置成高速,cube默认是低速
% L3 I+ `2 A( F% y; r* d7 p2、可以先禁止MPU和cache,屏蔽掉相关代码,待网络测通后再开启MPU和cache,进行对应配置7 n+ x% w* f1 _1 j; B1 z
3、H7目前官方库支持不到位,特别是有些examples完全没有经过验证,需特别注意
7 D% ~) w" T7 m4、使用MPU和cache时,多看看手册,弄懂机制避免入坑8 S0 d/ z( t& S- j& ^
, k, \" ^+ s2 T+ B

, b& ~! O1 d. _" O
- c" `7 {! X- F4 ~
! m6 z  P. l' t8 k1 ]
5 y% J' x: z  c. f5 M& r& r
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 编辑
! `/ E' H7 c0 f! i+ F4 G2 g& {# k: `$ r( u4 A, N4 h7 |
之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼主发的注意事项,1个小时就调通了,非常感谢!8 n; Z) ?, f6 ~
我再补充一点,在配置LWIP之前,需要先给PHY芯片一个硬复位,不然配置不成功,H7的RAM起始地址一定要是0x24000000,我用的是IAR,修改RAM起始地址的方法跟KEIL不太一样,ALT+F7打开“option”选项,然后选择“Linker”>"Config">"Edit">"Memory Regions"修改即可;
+ C9 K# w! b% I$ s+ C' {2 c; o' J1 h2 B! a9 Z) ]
另外有点注意的就是 使用CubeMX生成的“ethernetif.c”里面,默认的heth.Init.RxBuffLen是1524,但是在"stm32h7xx_hal_eth.h"中,默认的ETH_MAX_PACKET_SIZE 大小是1528,这两个是不一样的,需要手动改成一样的数。5 a; A3 @- f4 h0 K- p: U9 V
QQ图片20180315113746.png
onev 回答时间:2018-3-24 10:59:14
本帖最后由 onev 于 2018-3-24 11:01 编辑
+ C& h  K5 x: o  I  S, o  _* P3 c; W/ }8 l: q. U
要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。。。不过楼主也是蛮厉害的。不知道楼主有测速没有?我现在遇到的问题是Rx速度不堪入目。
% T3 ^; H0 Y( Z7 ]/ Vnetio:
  L, P9 Z& M8 P5 O/ B 速度.PNG - t7 D. {% H  {! D. v$ d

$ `+ r2 b; ^! U+ w  ~/ U" ^3 o楼主能加方式交流一下吗?) z4 W8 a8 G$ j
  _" |0 T2 R* h! D: T5 s1 K  T
9 f9 W& _. n* {1 X/ O
& f. _" x8 I  r; C- o: ~$ A
MrJiu 回答时间:2018-3-13 23:32:52
先加个分,以资鼓励。。。特别是说明哪些需要注意的地方,这点特别重要!!!
switcc 回答时间:2018-3-15 14:19:41
豌豆佛 发表于 2018-3-15 11:31
" n  Q* W! D3 V7 z5 `之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...

0 ^5 C6 b( U6 n" V" ?$ o% T我耽搁了两周啊,后面被搞得没脾气了
wolfgang 回答时间:2018-3-15 15:26:26
H7是有诸多调整。
zero99 回答时间:2018-3-19 09:55:48
感谢分享,已汇总到3月原创6 S1 M# O3 K7 @# K/ O, L1 L
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
onev 回答时间:2018-3-24 11:23:27
豌豆佛 发表于 2018-3-15 11:314 L5 @  O6 H$ e, c
之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...
' ~: E1 I; z) u% \# W; ]+ n0 P

6 r! ?/ R6 D& T, S 1528.PNG 1 \. x" n% J$ M, I$ X; {

, m( Q8 H3 J: t8 x  {; ?. ~1 S9 _# d3 O5 |9 C3 ]
你好,你的速度是多少?: w* a* @+ s/ C
switcc 回答时间:2018-3-24 13:36:17
onev 发表于 2018-3-24 10:59
1 q2 s0 [. o1 ~# z要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。 ...

& K4 q; X+ b6 C6 Y815201002
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 手机版