请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
switcc 发布时间:2018-3-13 20:03
本帖最后由 Switcc 于 2018-3-14 17:40 编辑
4 V; O7 l2 |  o1 i' t) {0 \5 ?# ?0 D/ @6 p
上上周本人发帖询问stm32H7平台移植DP83848 PHY驱动的帖子,详见
9 Y' z) \* Y/ J8 b% V* ^https://www.stmcu.org.cn/module/forum/thread-614912-1-1.html* m" A! v$ P" h$ m( M

8 ?9 n' q7 e. F0 X- J6 k按照回帖建议直接使用cube库里LAN8742里的驱动,然后对照不同PHY芯片寄存器查看,可以读到寄存器数据,但是网络一直没有调通,特别是gratuitous arp设备上线的广播都抓不到,更不谈能PING通设备了。
' B. a6 e( ^/ U
& ^/ U4 b9 a7 P0 p& H( H: q; t经过长达两周的反复测试和问题排查,直接问题出在MPU和CACHE处理上。现分享使能MPU、CACHE和不使能MPU、CACHE两种模式配置说明:; x/ t) E$ T' g6 l

1 Y6 q, J/ ]( A, t# z2 R) [. c. g一、使能MPU、CACHE情况$ h* m, ~5 r. o2 [
1、main.c中 HAL_Init()上加上MPU和CACHE配置- _' [! p9 c: w+ @$ x0 B5 y' m. s
  /* USER CODE BEGIN 1 */
+ K% n2 v/ D5 q  MPU_Config();
. v7 P7 q/ [$ M& L* w7 Z! ?! [  CPU_CACHE_Enable();

% a# j* B1 }" q; @/ \  /* USER CODE END 1 */8 _3 y  [- m9 H4 L- ~

( G$ e' e- H; c5 m  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */2 m0 \, Q) s. q$ w3 D. u& C
  HAL_Init();/ l& z9 z" }& C9 o4 U- G
, O" z$ `6 O% u: g5 @- U/ G
' B' f7 M! m& D' `( Z, }- H5 K7 f
/* USER CODE BEGIN 4 */
8 W9 @" i! g1 R) J& ?; K/ v/**
* }# s! M( R: `8 o) U  * @brief  Configure the MPU attributes
; h( p5 M7 S: y4 y9 r/ \  * @param  None5 T  y1 z1 B7 J6 r1 I8 i
  * @retval None
9 y" T7 G+ b1 j3 e  */& V7 T; o1 m1 }3 ~/ F) U" e
static void MPU_Config(void)
# I+ a; c7 y) t9 F8 m{
4 R( _+ o2 A5 j  MPU_Region_InitTypeDef MPU_InitStruct;
6 o6 J9 n3 Z& w8 d
" i; d9 K( S2 n& j+ h6 x% _  /* Disable the MPU */
" \, j- e5 w5 M! Q" {9 q) J0 K  HAL_MPU_Disable();0 K" M: ~1 G, }

/ l* F) [# G0 I1 D, ]  /* Configure the MPU attributes as Device not cacheable
$ W6 M  F: @0 i$ Z6 E3 k; k! ^     for ETH DMA descriptors */8 k& @, l6 `/ I0 M  Y
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
. O# X3 x/ |" g  MPU_InitStruct.BaseAddress = 0x30040000;* l' y  v$ [% |6 U$ v
  MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
" T6 W8 J" O7 j" Y! q  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
. O& u9 f: n+ M+ z  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;3 V4 F2 _8 }- _3 ~
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;5 {! }( ]- R1 M: P1 O$ o3 K
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;& G' {2 Z, o( ^: A
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;: D; \& F" {1 O  U' a+ O3 G
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
4 ?( B- c, i1 n2 w, h1 ^# m  MPU_InitStruct.SubRegionDisable = 0x00;5 f/ x$ l% [& @* p$ O
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
5 h  ^) L. N3 D6 t, X9 v/ k. u0 p0 i7 _/ u" i6 G; |
  HAL_MPU_ConfigRegion(&MPU_InitStruct);' P  l9 Z- a; Z3 }

) G0 [/ T: }4 }8 ~" v; t0 O  /* Configure the MPU attributes as Cacheable write through
* ^9 j: p/ M! i; ?- X: X$ y. C     for LwIP RAM heap which contains the Tx buffers */8 f3 _4 Z% D# K* P
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;( r6 e9 v7 [+ p" ^* M' H
  MPU_InitStruct.BaseAddress = 0x30044000;9 p2 ~' S& ?2 B
  MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;
# a/ B( }- T- m# f" k5 z6 s  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
( K; F. {6 L% I( `8 E  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
4 m3 E) ~# ^* ^3 q$ e$ x6 N, S  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;6 W: |# [0 v8 e& _3 Z; M, U5 \* ^
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;9 t5 O2 d4 c' H! D3 C' L
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;: z. l; v+ ]0 \5 Z+ V( p5 `6 V
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
4 K% J$ @9 i; b4 V6 g  MPU_InitStruct.SubRegionDisable = 0x00;$ e1 u3 J5 x1 ~7 j- n
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
) N8 n5 l& t4 k4 i9 f* }4 r* m, P
  HAL_MPU_ConfigRegion(&MPU_InitStruct);
% V% B6 h. z( f  y6 W
3 ?) ~3 j4 {+ D$ b2 Q5 h  /* Enable the MPU */
4 h* e1 S. N! P% @$ p  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
5 m( i7 b& u! M4 ]: a}
( F9 T. {4 E* x/ Q: `3 D4 ]! L5 v$ ~6 @2 {$ D
/**
! T( p/ k1 N! c  * @brief  CPU L1-Cache enable.
3 o4 _- i5 U9 l1 Z5 S: h3 O% \' j  * @param  None- Q, h+ j8 A& t7 R& h8 |- v9 y
  * @retval None( x) O) n  {, _6 a
  */% h+ I8 j, K7 l. B0 a6 U
static void CPU_CACHE_Enable(void)
, k4 g( j* f' ~) G" t& x{! j  k9 l" v+ I1 }; @$ F
  /* Enable I-Cache */
2 C, ?4 W' k$ _6 g& h  SCB_EnableICache();
% d- I4 w' m3 W/ j1 D* I7 N: u! g" B
  /* Enable D-Cache */! G3 G* q+ [* }5 h$ L  E8 d
  SCB_EnableDCache();
; r) x9 N+ I3 h}
: ]- v4 M! y3 d  d5 j
& }' U. C. Y; T9 c9 M5 N6 D" Z* o

4 }+ f% ^1 W" H, t$ Z2、main.c中时钟配置中加上一句 使能SRAM3时钟
% X0 P+ X) _. K7 D1 y- Y$ I8 S          /* Enable D2 domain SRAM3 Clock (0x30040000 AXI)*/! |8 W) J6 D2 x8 _0 z$ Z! G7 d
          __HAL_RCC_D2SRAM3_CLK_ENABLE();
6 y, z0 L7 r9 t5 d+ h1 Z5 C; k
8 E7 i3 X& j% c* b& E8 e
3 ?' ~. z! s8 p; @1 J$ |

9 ], m6 i* k& s3、ethernetif.c中DMARxDscrTab、DMATxDscrTab地址分配,注意和MPU对比* o$ e1 e9 x3 R

& I9 b" ]% d1 `/ \. {2 V#if defined ( __ICCARM__ ) /*!< IAR Compiler */
+ q4 h* a  ?/ }1 R+ z& s  |! E6 m: Q2 ], p' ?% k6 X
#pragma location=0x30040000
& E! {) w! e6 Q$ U  t7 v# ~ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */, P$ Y8 l/ o( p
#pragma location=0x30040060; |# i1 u: C( \5 r0 v1 m
ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */
8 Y  @% X0 }7 b) ?2 h/ K4 X#pragma location=0x30040200
$ R1 @0 r( {- X" o3 s; p" Quint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffers */
( ~8 T& o7 y3 m* |
' b' }2 j! d% c" ?* Y4 ?$ x) K7 v#elif defined ( __CC_ARM )  /* MDK ARM Compiler */
" p4 w1 b, W4 ]3 D; M! K
, b, u3 J* e) b& ___attribute__((at(0x30040000))) ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */' ~* q8 [. D. ^
__attribute__((at(0x30040060))) ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */  q- ?! w& k/ e  C) M# V0 |- [
__attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */% {- I8 X* w5 G# w6 ^( [/ e, q* \

" ^& |- w, i) u6 E#elif defined ( __GNUC__ ) /* GNU Compiler */
, Y% n7 @- D  o, M& c# U4 P7 O
ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".RxDecripSection"))); /* Ethernet Rx DMA Descriptors */
; W7 [  v  C2 v8 l8 h0 n! i- QETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".TxDecripSection")));   /* Ethernet Tx DMA Descriptors */
+ B# z2 b6 Z% V' Uuint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE] __attribute__((section(".RxArraySection"))); /* Ethernet Receive Buffers */
' u6 D, d, M/ T- u2 N6 e0 @& D! [: _9 h
#endif
4 f! \# k: r  W: N
& O. W  t) a5 y4 `2 Y: L

. @: a/ i9 s% g4 J  m+ E' ?( h/ g, r" P4、low_level_output中
, z4 S0 Y. N# Y( S4 b2 a* ^/ [! c) q' j$ k) K- ?* m
  SCB_CleanInvalidateDCache();, M! _! y, n3 o, D% e/ d

( W2 S& p, N: u( |. ^- E4 C  HAL_ETH_Transmit(&heth, &TxConfig, 5);
  n9 h& B) F- n& c) S
7 d" o3 [5 s; n+ o# r( ?, J! t5、low_level_input中2 D. C3 g* Y6 x; x; I
, u8 `- D) ]$ N. ]6 r  B; h

% S* v& n) Y# X
. \) l, E& m8 p9 J7 M8 h4 I
    /* Clean and Invalidate data cache */8 t4 J. U: Z5 \" a
    SCB_CleanInvalidateDCache();: y% v6 Y0 n8 q3 }
) `0 f' d2 Y; `: m9 B+ m5 z
    HAL_ETH_GetRxDataBuffer(&heth, &RxBuff);4 Q3 y: g% r& T6 f! l" d; G6 U+ t
    HAL_ETH_GetRxDataLength(&heth, &framelength);* c( D' ]  e  m2 ~8 B; R& v
                . i, T: `: ?' N3 ~! c
    SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));
! R2 L' t) z4 z/ B
, d7 l$ j5 m! P

; F; I' T3 `% I8 V8 R# M( k( _8 d5 C' k' n) r, U* i2 ^
6、lwipopts.h中,注意和MPU对比9 G# q' Q! V) }. ]2 f1 D7 a
       /* USER CODE BEGIN 1 */. o+ p) E5 H% Y/ `  [. ?
      #define LWIP_RAM_HEAP_POINTER    (0x30044000)4 q- ^8 i. {0 n$ E
3 H( o% |/ m! Q( b

+ f+ p2 j) U$ b7、ETH_RX_BUFFER_SIZE要一致* i, K2 y6 t# w0 ~- |: t  n
) g/ A( L! a, x+ N( z% C2 Q! t
     heth.Init.RxBuffLen = ETH_RX_BUFFER_SIZE;; Q/ W& W3 f6 m9 T' O
       s2 K4 R, S2 n" N. h
     __attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */
/ M% f' R2 _: x" Y) h+ V; U+ f9 V9 }/ e0 j
   SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));7 `3 T" f8 H% X5 j  a. g
. b% e  i. @2 e; p3 n+ M5 i
    p = pbuf_alloced_custom(PBUF_RAW, framelength, PBUF_POOL, &rx_pbuf[current_pbuf_idx], RxBuff.buffer, ETH_RX_BUFFER_SIZE);. j8 \! W* v1 x0 p6 g

! K) O" o: {5 c0 ?, z

& `; d8 R7 y0 ~) t. i% @8、keil配置RAM如下,勾线IRAM2,不勾选IRAM1
9 r* U2 i% y2 g      见附件。) X# ]: q8 U% g2 p) r) u
$ C; |0 P6 d+ c8 P/ y, J
1 f: @0 f: j1 U4 ?" |+ c
二、不使能MPU、CACHE情况
$ k. d. P6 {2 v$ V/ A9 `; R$ h1 j; g9 ?' d8 U
上述1,4,5,6标红代码全部注释掉。
; O! A5 _4 Q7 V  T* \: N0 |

: f& n- R( G3 P4 o: ]9 L三、注意事项
: a; K" A$ }( A3 n* {5 t1、网络相关管脚配置成高速,cube默认是低速  g' V+ j: a% X% W4 W9 p  Q' a8 ~7 D
2、可以先禁止MPU和cache,屏蔽掉相关代码,待网络测通后再开启MPU和cache,进行对应配置
( K+ i" b, o4 u- x' N) ~% ^3、H7目前官方库支持不到位,特别是有些examples完全没有经过验证,需特别注意
  q! e0 |7 C7 o  _4 U( {8 Y* \* h4、使用MPU和cache时,多看看手册,弄懂机制避免入坑
4 U0 w- I6 _. b1 j* ]# r2 O& v2 ?; Y
  x( ?3 {3 ~1 D. I& ?0 l

9 D( l3 \8 k. |5 _  j' _

6 \/ W6 p& L1 B, T$ F. E9 P
4 h0 l3 x% Z) O1 \/ F5 D
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 Y6 \, s, i' r6 p$ u$ v9 Q

4 S, V' E" H. Y' a, O/ `之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼主发的注意事项,1个小时就调通了,非常感谢!" ?" X# s# v/ {( h: K7 y8 f7 M
我再补充一点,在配置LWIP之前,需要先给PHY芯片一个硬复位,不然配置不成功,H7的RAM起始地址一定要是0x24000000,我用的是IAR,修改RAM起始地址的方法跟KEIL不太一样,ALT+F7打开“option”选项,然后选择“Linker”>"Config">"Edit">"Memory Regions"修改即可;6 v" H. q9 A$ u* N! k
, c% y% T( |2 Q* @: A
另外有点注意的就是 使用CubeMX生成的“ethernetif.c”里面,默认的heth.Init.RxBuffLen是1524,但是在"stm32h7xx_hal_eth.h"中,默认的ETH_MAX_PACKET_SIZE 大小是1528,这两个是不一样的,需要手动改成一样的数。
1 w7 m/ h* N3 m2 V1 p
QQ图片20180315113746.png
onev 回答时间:2018-3-24 10:59:14
本帖最后由 onev 于 2018-3-24 11:01 编辑
: n8 n# t5 Z/ a
9 V2 c# L; x5 u要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。。。不过楼主也是蛮厉害的。不知道楼主有测速没有?我现在遇到的问题是Rx速度不堪入目。
; a; c. v) f0 [- k2 [  H+ Nnetio:
0 v9 e; v! W6 ~: A& I 速度.PNG
2 ~, o+ F+ \9 [/ ?; O, f6 L) O  b' q+ |0 Z
楼主能加方式交流一下吗?" I& ~, O2 R7 f! w

* h* ]& h4 \# K# k3 x4 Q
6 j) q! e5 B6 |" }4 p5 K/ N9 G6 w  @0 G; f
MrJiu 回答时间:2018-3-13 23:32:52
先加个分,以资鼓励。。。特别是说明哪些需要注意的地方,这点特别重要!!!
switcc 回答时间:2018-3-15 14:19:41
豌豆佛 发表于 2018-3-15 11:31' }# p% |6 P, u/ u& Z) z; A
之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...
* f# x0 @0 ^5 F& T! o
我耽搁了两周啊,后面被搞得没脾气了
wolfgang 回答时间:2018-3-15 15:26:26
H7是有诸多调整。
zero99 回答时间:2018-3-19 09:55:48
感谢分享,已汇总到3月原创: i5 S/ N, M9 d, D4 c# j, A7 Z
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
onev 回答时间:2018-3-24 11:23:27
豌豆佛 发表于 2018-3-15 11:31& m2 W5 E9 k1 o3 S0 j2 B
之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...

8 a8 }% c6 c8 J2 c) J8 N" @! B. z/ |, `4 O/ K& O$ `+ T- c9 k
1528.PNG
' V: O& Q7 h4 h) D& K0 N: N1 u
& t5 g' q% n$ v9 [
你好,你的速度是多少?
( r4 `; [3 w! D% J0 D' G
switcc 回答时间:2018-3-24 13:36:17
onev 发表于 2018-3-24 10:59
% m5 Q6 ~; T+ D' t" ?+ [: ~( J要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。 ...
, M5 ]/ ]$ W; P2 f# z( U- K( ^
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 手机版