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

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

[复制链接]
switcc 发布时间:2018-3-13 20:03
本帖最后由 Switcc 于 2018-3-14 17:40 编辑 5 {4 O- _3 z3 h$ v+ D5 O

2 n: @( ~- U/ m7 t" T- ^上上周本人发帖询问stm32H7平台移植DP83848 PHY驱动的帖子,详见' z0 Y) X4 N- A) n9 m
https://www.stmcu.org.cn/module/forum/thread-614912-1-1.html3 t$ b6 V3 T' x; f' A
! G7 s6 w4 l/ z5 @
按照回帖建议直接使用cube库里LAN8742里的驱动,然后对照不同PHY芯片寄存器查看,可以读到寄存器数据,但是网络一直没有调通,特别是gratuitous arp设备上线的广播都抓不到,更不谈能PING通设备了。. d, j5 S0 |" \7 L9 c# H" f

& G6 @/ {3 l% u% V' g经过长达两周的反复测试和问题排查,直接问题出在MPU和CACHE处理上。现分享使能MPU、CACHE和不使能MPU、CACHE两种模式配置说明:+ O* H9 z! t' _+ `; F- f' A' _! q

4 F1 w8 i+ @1 Q) z' T( M% ]5 Q, Z/ n一、使能MPU、CACHE情况. g9 w. g2 o4 F- f, q$ F
1、main.c中 HAL_Init()上加上MPU和CACHE配置
1 q0 C% A  V- T$ ?8 A. e; g  /* USER CODE BEGIN 1 */
+ K& i5 @/ B, ^, v4 @& U  MPU_Config();: T. G* N+ F5 e, R0 Y8 f' _
  CPU_CACHE_Enable();
1 d$ K7 ~4 O: Y! Y7 [. w# W) {
  /* USER CODE END 1 */% U' r5 D9 C" A6 ]- ]6 s

/ V) C6 h2 ]$ A7 A  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */' y! f) h) V- {8 w
  HAL_Init();
  ^: C; s2 O; K7 V* M- x! J

1 `6 |$ Y+ h# M7 p/ d! J8 S( [
* S7 ]% A4 Z" b. M; r7 g' l/* USER CODE BEGIN 4 */
: w  K) \' |5 r7 r7 Y9 z/**
6 t* l: P6 ]* o  * @brief  Configure the MPU attributes # l* M, N  e* Y6 [
  * @param  None
: Q0 V8 f6 E' T7 z. }  * @retval None# P+ _+ j3 p+ ^
  */
' E- H, K2 P/ Z/ S7 e8 Bstatic void MPU_Config(void)
6 L) O9 K6 m# _! ]{
, r$ s% L: H& l, X  MPU_Region_InitTypeDef MPU_InitStruct;% F- ?! U9 ?- V! ~! b1 {! r. [

/ E6 T  z4 X" Z2 U$ ?! s  /* Disable the MPU */
+ q+ w2 }0 @5 ]0 A# z- v  HAL_MPU_Disable();
+ n9 c4 j. C  m) j3 h8 ~$ e/ g, X( T( E  m$ Y/ J
  /* Configure the MPU attributes as Device not cacheable % G1 `) g" q! k
     for ETH DMA descriptors */: n- d7 r. x/ }6 U
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;$ O5 K# g3 u, l4 i$ U5 W: h
  MPU_InitStruct.BaseAddress = 0x30040000;
7 _* P4 b4 o1 Z0 F* {0 ~6 {1 G  MPU_InitStruct.Size = MPU_REGION_SIZE_256B;$ o" E2 V+ x( _- R7 D
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
7 e! `; e6 m3 k- A0 }  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;; z  p! z( E7 m) w- `" `7 |
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;- p5 F% N# _6 f! t0 j
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
- P4 c8 p' t# y9 ?  X  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
7 C1 A& }7 g8 P1 b) [3 K  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
& s( F& G# C- \+ I  MPU_InitStruct.SubRegionDisable = 0x00;& F! L; a$ `3 I6 M1 n' V8 [
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;8 t7 H' l1 H# g. T1 K/ J$ k( ?2 e. T
3 n* r  X. @' h) g& q+ c
  HAL_MPU_ConfigRegion(&MPU_InitStruct);
0 i$ Q4 W  V2 M) _
! M/ m+ N+ J# b- L. ]  /* Configure the MPU attributes as Cacheable write through 3 q* I. {: M  o  A" B
     for LwIP RAM heap which contains the Tx buffers */
6 j! W' e- v6 i( ~- h6 o  T& S: e  MPU_InitStruct.Enable = MPU_REGION_ENABLE;( V/ N2 G8 b0 s3 h2 O+ [% S
  MPU_InitStruct.BaseAddress = 0x30044000;, u  K- k" U; E5 p) ~- D
  MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;% j  d+ t% y5 ?! ~) ?
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
8 F  g4 n+ e2 q3 a" |  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
. }/ p" |6 ?5 |# _% Y& S" K, T  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
8 A' T0 Y/ ]6 f. J# f) F: c  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;5 a+ Z# r0 V$ F3 w5 m, {
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;8 O* S, q5 h7 h1 r: @( A$ w" s9 Y
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  B! m# `, m6 T, w' F9 V. M' ]  MPU_InitStruct.SubRegionDisable = 0x00;! e- Q+ m, o; n9 c
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
" C! K9 C$ d6 C( v& Q. `: `
+ i: J  m, e. z4 S& }  HAL_MPU_ConfigRegion(&MPU_InitStruct);: b# l$ S8 B: O* A9 ~. U+ c

: }' G  r. I9 u' h  /* Enable the MPU */
# H9 T: C5 P" x. K  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
) U5 u5 Y  @1 o- g* ~$ P}
- r% l5 F- n9 p* X6 \5 V( M+ o8 J3 @9 V
/**
9 J9 P' y* K8 p( ^" F  * @brief  CPU L1-Cache enable.+ y6 J' g5 ]6 ?, V3 Y+ y: u( h$ F
  * @param  None
& q/ K0 B6 ?/ Y  L9 G& @, [# \  * @retval None$ W6 m% l, X6 f3 A" Q2 N- S8 f$ ^
  */
: i9 G- d0 s) w. j3 \static void CPU_CACHE_Enable(void)2 Y9 C) `" a* s% ]$ q7 `- \( o9 p
{8 ~* G( j/ {2 e9 \
  /* Enable I-Cache */
5 L- X; ^# {! U& V1 O2 C. L$ |8 ?' f  SCB_EnableICache();  ~' c) Y) N, B& j

' k4 }( y: l3 u* ~  s1 w  /* Enable D-Cache */, y! J* a, B8 {' `" t& c, n
  SCB_EnableDCache();) P4 X; k- h5 o4 J
}
% N: E4 b# M/ a% ^6 n/ {" H9 E  y5 z
/ F' [$ s6 `1 |9 J, |2 H5 b
% u& F9 e" O( S9 B- x8 t
2、main.c中时钟配置中加上一句 使能SRAM3时钟$ F6 D. Q' ?! N8 u
          /* Enable D2 domain SRAM3 Clock (0x30040000 AXI)*/
8 c: A" M6 q$ p; |          __HAL_RCC_D2SRAM3_CLK_ENABLE();
' w; q& i1 U: i& a1 h

4 \3 ^  H( u3 A2 B/ V$ ]/ K1 ~# c/ c8 ^- ]1 [1 g; U, T

+ K; L" I) D& \/ ]! ]  S3、ethernetif.c中DMARxDscrTab、DMATxDscrTab地址分配,注意和MPU对比
( R  @. U3 s* Z# Q+ J
8 j6 Q0 V# @3 L1 T% p+ Z0 S2 L3 r8 u#if defined ( __ICCARM__ ) /*!< IAR Compiler */, P" v) P* P/ M& P$ m- i* n8 e
! _6 _$ n1 d- ~4 N1 _- X1 D
#pragma location=0x30040000
* f! O: W9 D+ L1 O2 ZETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */8 M- m7 g: w) B  ?1 o3 m
#pragma location=0x30040060' f# r. c2 `4 y+ k: t. |+ I
ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */0 T3 `! j" X" |* q# i( G, g: H% m
#pragma location=0x30040200
/ P$ Q/ ]: f1 a0 Duint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffers */
6 K2 A2 B8 f/ q$ J6 @) ]. q- k5 d, Y& e5 h: c6 I: M
#elif defined ( __CC_ARM )  /* MDK ARM Compiler */; Q9 g3 c" i0 T' G8 r
5 B% z8 B/ E7 {3 Z1 e
__attribute__((at(0x30040000))) ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
6 S1 s% N7 h- V0 e) i7 j__attribute__((at(0x30040060))) ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */, I( Y& O- R) q- q
__attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */
! b/ }# G, t7 E0 q4 o( R: k$ i6 N, c- R: u% d; n
#elif defined ( __GNUC__ ) /* GNU Compiler */
2 x0 G6 P1 P+ v% B6 x0 o9 ?# I$ `" F7 O& h7 S2 e/ v
ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".RxDecripSection"))); /* Ethernet Rx DMA Descriptors */: S: Z, m' e9 b9 ?" r+ f
ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".TxDecripSection")));   /* Ethernet Tx DMA Descriptors */5 N/ ?$ T$ E- H, Z
uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE] __attribute__((section(".RxArraySection"))); /* Ethernet Receive Buffers */
% l' x( f+ E; r& a9 y" @7 F/ i3 {1 b
#endif8 l+ _$ R4 J( `+ `! C4 Z

( m5 Z) b1 |0 O5 v3 [! X5 {7 T3 Q4 k5 o7 J
4、low_level_output中" p5 @0 e) B8 E

% X) g* n! ]& p3 m* r  SCB_CleanInvalidateDCache();" d4 p/ u6 Q7 s1 l; E4 l

& I4 \# g/ o1 {( Q  HAL_ETH_Transmit(&heth, &TxConfig, 5);
! S! @! j1 h# l5 t  s7 P) e
$ _& T) _9 T  u) U5、low_level_input中
9 Y" f$ p9 Q3 i$ g. t$ z3 @7 B0 m- Z! @

; `, v, C) r3 N- t

& I; ?" j1 O5 m; n, m2 r8 L    /* Clean and Invalidate data cache */, S3 y: q* p  h* a5 _, D8 W) o7 Y: [
    SCB_CleanInvalidateDCache();! w4 M* i7 Q0 D% v! k
1 y4 @8 @$ j1 _3 B
    HAL_ETH_GetRxDataBuffer(&heth, &RxBuff);. I+ P, v* N, L0 E) W7 ?9 A; ^
    HAL_ETH_GetRxDataLength(&heth, &framelength);
5 t! C* @9 Z: j  x- q9 `                6 A4 a, k, J2 `( E) z5 ~: A7 R
    SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));
' I% Y, _% f* \9 W& a
/ o% C8 [# h( k8 m+ ~6 n* C4 C3 l
8 {' y  ~3 I2 B

# B+ Y/ |2 l, J) O- l9 c3 B$ h3 y6、lwipopts.h中,注意和MPU对比
' j' Q7 m& y$ n$ _9 j1 Y       /* USER CODE BEGIN 1 */* u$ ~+ W0 I* N, h
      #define LWIP_RAM_HEAP_POINTER    (0x30044000)
( c- a& D  v9 r( M4 }7 A" ^
7 O+ R& C3 L& ]7 r+ T

) f8 N( u  Y8 d. B/ K6 d7、ETH_RX_BUFFER_SIZE要一致
- ^, x5 g8 S5 ~. D$ l3 e# s8 ?
7 H/ N( V) J4 H! _/ a     heth.Init.RxBuffLen = ETH_RX_BUFFER_SIZE;) G) |! r: \. `2 E- o4 t) O6 |! c% h
     
$ O& N- O8 W) b. D9 S/ x2 t     __attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */2 Q. ]4 h/ z$ @2 k4 I* i6 T
. X( h" L  s! g! r
   SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));# K% W5 w- q2 B1 @5 `" ~; m! y2 Q
& ^8 M) w, z+ ~9 @
    p = pbuf_alloced_custom(PBUF_RAW, framelength, PBUF_POOL, &rx_pbuf[current_pbuf_idx], RxBuff.buffer, ETH_RX_BUFFER_SIZE);+ G+ [6 \$ B8 z2 \4 z( \4 N
; v% N5 R: ]& ?3 O

  g" s1 _, O3 A. y1 x8、keil配置RAM如下,勾线IRAM2,不勾选IRAM1
0 s3 M# h! ~( |5 X3 w' X& W      见附件。: M0 U* w' K$ L3 q, a0 E7 o
, o/ `6 K9 H2 N( j: K4 c. R
* U3 Y+ O' ?7 n6 r! y% ^
二、不使能MPU、CACHE情况
4 [. q" s  @5 h3 O$ `) N! n- e! i2 m3 E! |) o  Z
上述1,4,5,6标红代码全部注释掉。
+ h, m9 ?7 u* K4 B) Y
& M, O7 B* O9 k9 L6 f( o5 `
三、注意事项
9 i' d' K. T! D( g1、网络相关管脚配置成高速,cube默认是低速
3 c% Y+ i0 k3 G9 H3 l! N2、可以先禁止MPU和cache,屏蔽掉相关代码,待网络测通后再开启MPU和cache,进行对应配置
1 u6 x8 r5 h' U/ F! y4 r3、H7目前官方库支持不到位,特别是有些examples完全没有经过验证,需特别注意( P( `, |7 W5 D. l( `! U4 \* G
4、使用MPU和cache时,多看看手册,弄懂机制避免入坑
5 [+ ^3 f2 h5 g3 G1 m  e8 L& C8 c; k. Q' t  C( K7 v$ _. ~: A% w4 U! Z8 E2 }$ I
5 L; }" @* h6 r: Q. A

& V* [6 D9 t6 d% k* d( o

6 X2 E9 B4 X- a& g" R* ?+ F; i; U9 H8 ]0 F9 I4 n/ ]7 ^
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 编辑 1 m# w1 x7 Q% L0 N( h

+ g: a5 y3 H  R8 p5 O6 w0 e之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼主发的注意事项,1个小时就调通了,非常感谢!
2 B- _5 N1 e2 L' W; @& }/ _0 i我再补充一点,在配置LWIP之前,需要先给PHY芯片一个硬复位,不然配置不成功,H7的RAM起始地址一定要是0x24000000,我用的是IAR,修改RAM起始地址的方法跟KEIL不太一样,ALT+F7打开“option”选项,然后选择“Linker”>"Config">"Edit">"Memory Regions"修改即可;
8 J2 t, x! _& L' m3 w2 I& z" b2 M) K7 V, j4 `6 T6 K
另外有点注意的就是 使用CubeMX生成的“ethernetif.c”里面,默认的heth.Init.RxBuffLen是1524,但是在"stm32h7xx_hal_eth.h"中,默认的ETH_MAX_PACKET_SIZE 大小是1528,这两个是不一样的,需要手动改成一样的数。1 }; u5 W8 ^# A: u6 h
QQ图片20180315113746.png
onev 回答时间:2018-3-24 10:59:14
本帖最后由 onev 于 2018-3-24 11:01 编辑 + q( L: O5 }+ k6 Y

! p% X' M5 M! V5 s1 t; i9 g8 O要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。。。不过楼主也是蛮厉害的。不知道楼主有测速没有?我现在遇到的问题是Rx速度不堪入目。7 `. v/ a) O! K; J
netio:9 n! c8 V% J& B3 j0 l) h9 X$ O
速度.PNG
. F- u# n8 B/ K7 K8 Z6 p! [9 w. R- h
6 l! b: I  h- s0 X$ J9 j! g6 t  B, b楼主能加方式交流一下吗?
$ c9 z. o* }# m" }8 W: w
0 S3 b, i0 p# S4 ]; d- h- \* h, k
7 q9 o, n5 n8 t( p4 N: w$ X$ \0 s7 @6 @0 e. S7 n' D
MrJiu 回答时间:2018-3-13 23:32:52
先加个分,以资鼓励。。。特别是说明哪些需要注意的地方,这点特别重要!!!
switcc 回答时间:2018-3-15 14:19:41
豌豆佛 发表于 2018-3-15 11:31
2 d( A8 @- e4 Q( ~; C之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...
- S! d5 g- o6 m% B' d) l) C) f* l
我耽搁了两周啊,后面被搞得没脾气了
wolfgang 回答时间:2018-3-15 15:26:26
H7是有诸多调整。
zero99 回答时间:2018-3-19 09:55:48
感谢分享,已汇总到3月原创: i! _' X: b1 ]7 {. a
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
onev 回答时间:2018-3-24 11:23:27
豌豆佛 发表于 2018-3-15 11:31
& ^+ y6 c! W* r4 ]7 h之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...

& F7 @; H+ G+ }1 a0 ?
0 G9 d) E* ^  F. h 1528.PNG
& R# s+ P/ {3 r7 c  A( S% f2 V3 J2 G  r! u+ f1 M) k, ]4 Q
& G; E; O7 A8 u  h/ [% P: J
你好,你的速度是多少?
6 P" B# K4 A9 n. G: G
switcc 回答时间:2018-3-24 13:36:17
onev 发表于 2018-3-24 10:59
2 v( Y5 y. p" N/ ^& Y  _1 L9 t1 D; J: y要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。 ...

! I7 U9 t+ S& \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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版