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

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

[复制链接]
switcc 发布时间:2018-3-13 20:03
本帖最后由 Switcc 于 2018-3-14 17:40 编辑 3 H) T6 G6 l# r5 W( X6 m

* @4 R9 T: C% F) R: r4 x上上周本人发帖询问stm32H7平台移植DP83848 PHY驱动的帖子,详见
  e8 E4 Z1 v8 Q0 X( Phttps://www.stmcu.org.cn/module/forum/thread-614912-1-1.html
. C! x8 j3 d4 K4 n+ [% ^
1 {& s: j* w9 g2 Y# W9 a  s1 t; G按照回帖建议直接使用cube库里LAN8742里的驱动,然后对照不同PHY芯片寄存器查看,可以读到寄存器数据,但是网络一直没有调通,特别是gratuitous arp设备上线的广播都抓不到,更不谈能PING通设备了。
2 V4 r+ z* a# x8 Q  K3 C$ |: B2 \* q" x7 T+ k
经过长达两周的反复测试和问题排查,直接问题出在MPU和CACHE处理上。现分享使能MPU、CACHE和不使能MPU、CACHE两种模式配置说明:5 |6 w. a8 @/ }
: d6 c8 B! L9 E
一、使能MPU、CACHE情况( Q5 c9 C2 r6 G
1、main.c中 HAL_Init()上加上MPU和CACHE配置4 b2 J7 m, [0 R, @3 B. @
  /* USER CODE BEGIN 1 */
, R4 ?# o4 b2 j$ ?9 a/ s6 |  MPU_Config();3 i, v! j# G8 U. I/ U+ _
  CPU_CACHE_Enable();

  ?( _. T/ V6 Z& t5 U  /* USER CODE END 1 */
" r, z4 O" z! B/ d7 o4 }+ t. l" `% O2 n) `8 f$ M; \
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */8 {% q- ^4 C5 ~1 J) d& ~
  HAL_Init();$ s( G2 J  L+ F, M8 R3 {
$ y" i; i" n; u1 F3 }

) I) C6 T& o4 K) Z. Z& G& b. \/* USER CODE BEGIN 4 */
3 o) ~- ^# i, f! g$ V$ r/**
, p; \- D" [0 l3 a1 U/ \7 R. ?0 n  * @brief  Configure the MPU attributes
! k0 w$ w2 q. k6 T  * @param  None/ ^$ i) r) r* a5 w) [8 }2 v' C
  * @retval None4 _6 H( K' A( b9 {
  */
1 Z6 ]! W* O# o6 I2 istatic void MPU_Config(void)
+ h6 |. j' K- {5 L{
' U  p! \" v8 y8 Y/ C7 c* [0 j  MPU_Region_InitTypeDef MPU_InitStruct;1 L0 N" q8 j3 y: ~

, C1 n, S( a3 o6 ?1 m3 a  /* Disable the MPU */0 c* J, r: n# P8 a6 i+ ^6 g2 \
  HAL_MPU_Disable();
) h1 i  M. K- p2 O- v6 ~- `
6 y4 ?: H! F5 K  /* Configure the MPU attributes as Device not cacheable . o: ~* U  M$ B& |1 G4 S
     for ETH DMA descriptors */7 i3 Z- C0 E: n3 Q- H
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;. p( J: U- t/ O5 N5 F8 }) _+ @1 C
  MPU_InitStruct.BaseAddress = 0x30040000;) ?0 Z' [# D5 |2 C
  MPU_InitStruct.Size = MPU_REGION_SIZE_256B;. o9 A6 ^, Y0 Z" {/ P- Q0 A
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
% Q& @- q6 |. H  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
7 w5 h5 v# f0 p6 h! f# u  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;+ C2 M# A; q9 Z" a0 X
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
7 m% H' H. j4 I; l! b  MPU_InitStruct.Number = MPU_REGION_NUMBER0;; @4 a8 ]! q' P4 P$ V8 }3 w7 m6 }
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;; x' M' a8 F  W- P# v
  MPU_InitStruct.SubRegionDisable = 0x00;
) j' I# o, D$ V% q  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
* o* _7 f* e3 O$ s2 S( k' D- D7 D
/ R% K; |( |, o3 }9 g: N* {  HAL_MPU_ConfigRegion(&MPU_InitStruct);
( |4 W# `; q# y& T- }6 r* _4 p2 E; [- M7 `5 ]  c, W
  /* Configure the MPU attributes as Cacheable write through
8 A) e8 _7 Y6 a: Z2 b     for LwIP RAM heap which contains the Tx buffers */5 w7 s, f/ L4 Q! a
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
! |; ]1 R6 _( w7 A' n& `  MPU_InitStruct.BaseAddress = 0x30044000;
- d, a7 G# [7 s0 o5 y  MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;+ N4 i4 I$ V( N9 v
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;! w' H' d$ q( @) \# M- [9 ^2 C( F
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
9 V$ e$ Z1 H% L( B, u  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
9 U* f" W% Y/ d9 G( V  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;) M' n: t$ w& |* V) m/ _4 j1 q
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
0 l, M6 r  ~) ~' f# @2 t# a  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;: ~) ^/ l( r2 D6 J& O' b: d+ O; Q# J
  MPU_InitStruct.SubRegionDisable = 0x00;6 c( t2 [6 R* ?& X  n8 I
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;% F: @2 j! l+ \0 t) l" }* ~+ t
$ n# t! Y9 i7 X
  HAL_MPU_ConfigRegion(&MPU_InitStruct);+ y7 M0 U# k+ Q! y( D
1 A& m) S. V' [! w+ q
  /* Enable the MPU */, U( C5 j! S+ a2 N7 L) j: I/ i
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);8 p2 L5 y) s7 u5 q' R! m4 I
}
4 K! Y  ]% p. b7 E# E6 T6 Y0 X1 e+ h
# Y2 G3 P$ j6 l5 w9 n: j  O/**
- |+ ~+ r2 O4 {2 x, c  * @brief  CPU L1-Cache enable.
, K( ~7 T/ w2 |/ O" k9 J! v  * @param  None
, c1 `/ c/ \4 k! Q  * @retval None; ], T) Z" K) y5 E
  */( p4 ^) I) l9 w* [. @
static void CPU_CACHE_Enable(void)  l* v& f0 c# p8 G* N5 X. Y. @
{
0 ~5 E2 O5 n4 f1 I+ W  /* Enable I-Cache */$ Z0 y; `0 E. L2 t
  SCB_EnableICache();
2 X, \5 e4 e2 g& F' s0 y! T' q0 ~8 w+ ^; F8 G
  /* Enable D-Cache */+ L5 A9 w! g8 V& M0 M
  SCB_EnableDCache();
0 W: y  X% j% Q  Z, t% }+ r, O1 Y}
8 d6 x+ ~& }, E

1 ^2 x2 T! T4 X. V: ~! A" ]9 F- E4 N7 v+ G9 g
2、main.c中时钟配置中加上一句 使能SRAM3时钟- ]8 H( e* P, H' T7 S4 Q, U
          /* Enable D2 domain SRAM3 Clock (0x30040000 AXI)*/, p1 d: a! A% {6 I
          __HAL_RCC_D2SRAM3_CLK_ENABLE();; h0 Y8 x( ^4 ?5 x3 p
4 C7 ?0 f* Q, c! Q

9 H- H7 ^; c- e+ g
. {: _; W1 c8 n, A, `! ^3、ethernetif.c中DMARxDscrTab、DMATxDscrTab地址分配,注意和MPU对比
' @5 l; ~) e  d6 Q# R2 H7 ?! T
7 M/ s- u& [1 N7 B1 E8 [#if defined ( __ICCARM__ ) /*!< IAR Compiler */
! I! X  c" P. Q5 Q. `5 ?
- l6 r' ~: u# K) \. \% p% O#pragma location=0x300400002 Q; e+ p4 k( A# l9 _! M  w5 @
ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */. k8 g/ Y- f6 Y; _' ^! W2 d# j  @
#pragma location=0x30040060) Z0 T: y7 f* h7 O4 t2 B, |
ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */: o/ o% i0 A$ J. u2 t* l) @
#pragma location=0x30040200
: T" Q/ n6 Y$ duint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffers */% P1 n% Z( j: C- C+ Q: S

  U* B! m3 b; u  p: {#elif defined ( __CC_ARM )  /* MDK ARM Compiler */
  S' ^: U; a: O" _  @6 o$ Z* z- W  s4 x" P
__attribute__((at(0x30040000))) ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */+ w) r/ U$ t' a1 _6 q( z( b
__attribute__((at(0x30040060))) ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */
) v" K4 P+ L+ n1 v4 {; t6 x7 v__attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */: \$ t1 O2 m) o. S- s

+ x- z  H2 U( w! `" u  h: s#elif defined ( __GNUC__ ) /* GNU Compiler */ 3 w. Y' a. ]1 ]9 X7 j+ {

: |2 I# z1 K* V, G$ K; f+ WETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".RxDecripSection"))); /* Ethernet Rx DMA Descriptors */
9 w8 V6 ]8 B! ?* @, DETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".TxDecripSection")));   /* Ethernet Tx DMA Descriptors */! N/ ^, `' c* s* s. h- S2 g
uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE] __attribute__((section(".RxArraySection"))); /* Ethernet Receive Buffers */& A- ?( f1 h3 P8 B7 a- @" J4 d3 X5 M
) |8 n8 r0 h+ J$ |, X& C# i# F+ L
#endif
8 }! a0 K+ J& E+ K& g
! z: n9 R$ }+ O0 p- D

/ R" P' b4 ]! A; F4、low_level_output中' g" O& L/ J$ E- o
7 D! u! A; [6 D: {
  SCB_CleanInvalidateDCache();
  e1 F* N" m# B9 w4 u  p/ [3 e9 x6 Z0 v) h$ c% o. s
  HAL_ETH_Transmit(&heth, &TxConfig, 5);' _' v" Y  m" k# K! d
3 S& L' [- ~4 D! w" L3 L
5、low_level_input中
3 t/ _: t5 |5 K$ T
9 G' o( B8 |8 a" Z# H
0 ]4 l( f( y* P. M

. ]' F6 G  |* }6 C1 h- h) I    /* Clean and Invalidate data cache */( ^$ v( C3 f1 `. h7 T+ }+ P
    SCB_CleanInvalidateDCache();
+ r- @! [9 K5 c* Y9 y% r% }) D" J/ z8 m
    HAL_ETH_GetRxDataBuffer(&heth, &RxBuff);
' @4 P( p) C; `, v1 Y% B+ z7 J6 T    HAL_ETH_GetRxDataLength(&heth, &framelength);' `$ K0 k+ Q- ^( D& ?+ I7 L
                6 ?: F4 q; S- n( G
    SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));
) m0 `  \% x& N9 B* }6 g( ?
# P! p6 w& t& Q

& _; i. w2 O, z& {5 D7 f6 z9 Q6 A) W( k
6、lwipopts.h中,注意和MPU对比' _4 `. u: a7 @1 f) B
       /* USER CODE BEGIN 1 */' m4 d, k3 b' v1 ~8 ~
      #define LWIP_RAM_HEAP_POINTER    (0x30044000)
) T, o8 }8 f$ S
. V+ V" T) m" d9 \

! h# @) u2 r' Z; j# T: @  Y  J0 O& W7、ETH_RX_BUFFER_SIZE要一致; H( L5 {! _0 V+ C* v$ s# Z

, f3 J% J( m8 R( c, C     heth.Init.RxBuffLen = ETH_RX_BUFFER_SIZE;% \8 Z: ?; ^6 c5 N/ f3 Y$ ?' m
     
2 s$ G% o" w1 l) A$ u  M     __attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */
! a# h4 v) Q9 E! u  `- D1 l# [6 E9 |, \% J; j' L+ w
   SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));" y. R6 J5 l$ b; [
( B8 J  C: I0 M
    p = pbuf_alloced_custom(PBUF_RAW, framelength, PBUF_POOL, &rx_pbuf[current_pbuf_idx], RxBuff.buffer, ETH_RX_BUFFER_SIZE);" Q* }' @5 y+ _. J" t
% B/ F/ w7 _) P
1 x  O( @/ i9 w" `* @& F: d( ~
8、keil配置RAM如下,勾线IRAM2,不勾选IRAM1; ]1 M/ E2 G3 Q. k
      见附件。
' ]- q$ Y4 D  E
  ]6 k+ t4 n, |* g, ^
; K1 t+ b4 }7 e二、不使能MPU、CACHE情况' w4 T; b& u1 M4 L& `

7 [7 a% M6 e( H" }& P4 l上述1,4,5,6标红代码全部注释掉。; u+ ]6 X. ]% ]$ [
$ l1 |; c5 E1 r. v! F- N1 Y8 ^
三、注意事项
) x5 u& B4 B. b; |1、网络相关管脚配置成高速,cube默认是低速) L& I" z3 l% U/ ^# T
2、可以先禁止MPU和cache,屏蔽掉相关代码,待网络测通后再开启MPU和cache,进行对应配置# S8 Z! {' w# g# ^4 c) H* X
3、H7目前官方库支持不到位,特别是有些examples完全没有经过验证,需特别注意' Z* `/ j2 \6 ^9 C3 t/ [6 V, p
4、使用MPU和cache时,多看看手册,弄懂机制避免入坑$ W2 c( D8 @# }0 A/ t' x3 o. j

" A6 U, z' N4 q8 V+ |# f5 J' i; h( F) P9 C  F) h# ]

4 ?) J! W8 v) h/ H1 B- V5 O, M1 d

+ N2 [6 o5 H9 w2 z' X, [2 E! w* e8 F+ o9 N# 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 编辑 % ~, _3 b' j$ u, O

8 f8 c: H; a# O# E4 m. H! }& m之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼主发的注意事项,1个小时就调通了,非常感谢!4 P) S& |. C/ O/ g6 Y; _
我再补充一点,在配置LWIP之前,需要先给PHY芯片一个硬复位,不然配置不成功,H7的RAM起始地址一定要是0x24000000,我用的是IAR,修改RAM起始地址的方法跟KEIL不太一样,ALT+F7打开“option”选项,然后选择“Linker”>"Config">"Edit">"Memory Regions"修改即可;
9 T) x- m1 J' O5 W0 z! x8 |2 ^9 Q- I6 z' r
另外有点注意的就是 使用CubeMX生成的“ethernetif.c”里面,默认的heth.Init.RxBuffLen是1524,但是在"stm32h7xx_hal_eth.h"中,默认的ETH_MAX_PACKET_SIZE 大小是1528,这两个是不一样的,需要手动改成一样的数。# l& R2 e1 d3 |( H& a
QQ图片20180315113746.png
onev 回答时间:2018-3-24 10:59:14
本帖最后由 onev 于 2018-3-24 11:01 编辑
$ G& U3 q9 R, @& }
7 s  w# ]/ J' \: j7 Z要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。。。不过楼主也是蛮厉害的。不知道楼主有测速没有?我现在遇到的问题是Rx速度不堪入目。3 }9 S0 f) s0 q& L& ~
netio:# _6 c& S5 u$ ~
速度.PNG
) u9 F4 p, d6 u) e4 k
7 G; j& z& P3 ?: T) Z% V楼主能加方式交流一下吗?4 T& L8 P. z* i$ P1 C  P4 s

$ e: x2 K7 d4 e3 B& i" L
# w" M: b6 b* C: E. s' H
. H3 v" z/ ?9 k% c; b
MrJiu 回答时间:2018-3-13 23:32:52
先加个分,以资鼓励。。。特别是说明哪些需要注意的地方,这点特别重要!!!
switcc 回答时间:2018-3-15 14:19:41
豌豆佛 发表于 2018-3-15 11:31
) I9 u4 Q+ i: i* G之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...
' \7 \1 i# U& Z+ @' I
我耽搁了两周啊,后面被搞得没脾气了
wolfgang 回答时间:2018-3-15 15:26:26
H7是有诸多调整。
zero99 回答时间:2018-3-19 09:55:48
感谢分享,已汇总到3月原创0 r* m, a/ i' A; d0 m) S# ]8 Y
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
onev 回答时间:2018-3-24 11:23:27
豌豆佛 发表于 2018-3-15 11:31
# f% U' ], `! Q' b1 s$ X2 ^- F! e2 m之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...
7 j: B" f0 z3 z+ a% D: _
9 V* s! d6 D3 O
1528.PNG ! r4 }  U: w& L7 c" l

1 r  J8 r# y/ y' Q7 |, u6 L/ D0 Q, i% N; w3 `) x
你好,你的速度是多少?$ h* H! a! ^1 q5 m9 K* j! U
switcc 回答时间:2018-3-24 13:36:17
onev 发表于 2018-3-24 10:59& \1 j- a" i( l+ x
要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。 ...

( d) }+ S! z5 Q* M815201002
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 手机版