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

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

[复制链接]
switcc 发布时间:2018-3-13 20:03
本帖最后由 Switcc 于 2018-3-14 17:40 编辑 " H3 w/ L% B& j1 G; i

# {3 Q( h+ T' {9 |" B上上周本人发帖询问stm32H7平台移植DP83848 PHY驱动的帖子,详见5 j. ?8 w4 s+ w/ L  p+ F
https://www.stmcu.org.cn/module/forum/thread-614912-1-1.html  [! |8 G4 D2 C- S

3 R1 |; H) q! d按照回帖建议直接使用cube库里LAN8742里的驱动,然后对照不同PHY芯片寄存器查看,可以读到寄存器数据,但是网络一直没有调通,特别是gratuitous arp设备上线的广播都抓不到,更不谈能PING通设备了。
5 v' U% b2 Y2 r) s% {, u) g" m5 @2 @7 ]% U# Z0 I$ k
经过长达两周的反复测试和问题排查,直接问题出在MPU和CACHE处理上。现分享使能MPU、CACHE和不使能MPU、CACHE两种模式配置说明:
+ ~) Q. D' O1 ]5 [2 X* Q) E8 W6 v& f# O3 x* D
一、使能MPU、CACHE情况+ g* t2 f, l# ?) d3 M
1、main.c中 HAL_Init()上加上MPU和CACHE配置
% s( J8 d: X7 L- k9 g  /* USER CODE BEGIN 1 */" l/ L0 F, {4 Y! |1 p
  MPU_Config();
, M6 V: g/ W) p6 X( m6 N  CPU_CACHE_Enable();
1 B, E! U, A8 g2 U5 o
  /* USER CODE END 1 */
6 C" N- O6 L9 H( _1 E% @9 I  S+ u: d2 ^2 n9 b) w2 M
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
2 Z5 w2 A2 n/ C# p, P: g! p  HAL_Init();$ h4 W# l' M3 m* f

. D0 j* U2 [. o2 b$ Y# l
3 c+ p" {9 F. z7 e: u- H/* USER CODE BEGIN 4 */
- X; R9 {. M9 s$ o4 M9 k/**
. Y  h7 e% j- I/ V2 I# m8 v" F  V  * @brief  Configure the MPU attributes
  s1 B3 m5 H( a, ^  * @param  None# i% n( Z0 l' ?) A) i
  * @retval None$ v1 h* K4 M9 |' [% T3 m' S
  */5 \, h9 t4 ^; ]9 @* `( Y
static void MPU_Config(void)
2 @/ s! H3 r1 E) c{
: ~) B: D& b" l4 X  MPU_Region_InitTypeDef MPU_InitStruct;7 B" R) O* W: Y, x2 w# F
3 U' a# J# o! I- u8 J
  /* Disable the MPU */
, B0 z1 Y( t- A! w  HAL_MPU_Disable();
5 t7 U- R  f! t# I
; R: f5 L$ c- R0 f6 y  /* Configure the MPU attributes as Device not cacheable ; M  p& C5 m8 M2 `/ C) t5 K5 i
     for ETH DMA descriptors */, Y4 g( {  r- \9 x
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
/ K! `- k% l/ c: ~, v: s  MPU_InitStruct.BaseAddress = 0x30040000;, t( _; H5 U1 r3 P* D5 ?( d- n
  MPU_InitStruct.Size = MPU_REGION_SIZE_256B;: [% p, M1 U2 V# d4 D
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;) }  Q3 Q# f5 Y9 s! f
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;2 u3 M4 {+ {1 l5 W8 r/ {7 R
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;9 Y. p# J1 n! o$ i3 z7 T
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
- J! |& V5 R4 m* y' ]* c$ e  MPU_InitStruct.Number = MPU_REGION_NUMBER0;$ d; Q' }9 J$ q8 Q
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;& @7 F" v" F) k" w8 D" ]) J  D
  MPU_InitStruct.SubRegionDisable = 0x00;1 a0 \" H3 d' f' y3 U. W; m& }' _
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
0 }: {' o0 c( K
7 `2 N  B+ Q) a5 @3 b+ o  HAL_MPU_ConfigRegion(&MPU_InitStruct);
5 Z2 |8 M3 C" n  z; K" _" l3 p; [; B, e
  /* Configure the MPU attributes as Cacheable write through ! `  A. Q3 [+ x4 s' }9 B7 a# T
     for LwIP RAM heap which contains the Tx buffers */
% B' b: H) |8 Y& J2 k* R# |  t2 r  MPU_InitStruct.Enable = MPU_REGION_ENABLE;) _0 i9 k) ~4 [! J) }
  MPU_InitStruct.BaseAddress = 0x30044000;
0 x) b# ]7 R8 S& u" A* I+ l2 X  MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;
  i8 e8 o+ o  M5 }- h  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;3 x" V3 o3 v6 {" l5 K
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
7 ?) Q5 Q/ y7 Q1 R3 \) H  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;8 ]. [1 D8 |, m5 v5 f" M
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
$ {: ]; L0 l+ ~, r  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
# m7 z9 ]% g  q: R) O  J  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
6 D& f) N, V5 n6 z  MPU_InitStruct.SubRegionDisable = 0x00;
! W" G- p4 _4 Q4 c0 w  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;& s' Z' h8 a+ w: B! L& `

0 V+ x- c+ Z- S- S  HAL_MPU_ConfigRegion(&MPU_InitStruct);' N/ N. A& I! v1 {

$ G* U3 ?) ]4 v: T$ M  /* Enable the MPU */
: k+ e$ W3 Z5 m5 [- N' F  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);. r$ p/ t! \0 H! @  I/ t
}
4 m' M- G$ i1 q4 C
0 V) j5 d' v* m/**( g3 O7 Y7 X9 n9 g7 V; M
  * @brief  CPU L1-Cache enable.4 p$ f/ _# y2 t4 w* D
  * @param  None
1 l* o( f6 l( w) P6 D  * @retval None5 X* g; a- d$ f! i
  */. o! s6 M, N1 m; T' {
static void CPU_CACHE_Enable(void)
3 u: Z1 o4 E% i) ?& G( g5 t{% w$ x; S! w/ e9 m* E# R' W7 T
  /* Enable I-Cache */
* F9 ~, r  i  X' L  SCB_EnableICache();6 `) f. U6 d. B3 `
/ X$ S. G& ?7 `8 L
  /* Enable D-Cache */
1 E) K: I, O+ x' ]  SCB_EnableDCache();; L+ t1 V: o- q$ D! E3 q6 `1 ^- F1 z
}! ~' J) ], t* f  G9 A9 T* v+ t
6 S: J; s7 r2 V) _/ B, n
  x: V; K' u* o; a* m5 Q$ n
2、main.c中时钟配置中加上一句 使能SRAM3时钟; o- \2 s' c8 C3 V
          /* Enable D2 domain SRAM3 Clock (0x30040000 AXI)*/- P: E! ^6 ?: I: p5 @. Z
          __HAL_RCC_D2SRAM3_CLK_ENABLE();
4 ]6 D, Z0 u1 N  P5 N/ O
2 q3 a( b& G: Q: H* {3 Z/ U
: y4 ^6 I! E" W

$ x" u9 `6 t# `, ?8 Y* a$ I3、ethernetif.c中DMARxDscrTab、DMATxDscrTab地址分配,注意和MPU对比  G) @- D' r' x  E7 K
9 k8 u5 `9 j3 ~/ x( h" s1 Z& \) b* G( A
#if defined ( __ICCARM__ ) /*!< IAR Compiler */3 |& k8 C! T# w4 X! D

2 L, f) o# o9 q  G. c( D0 k#pragma location=0x30040000
4 C" N3 U. q1 u+ d) v" @/ c9 e9 vETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
* |3 o) e* T. [#pragma location=0x30040060
0 U+ @8 b# q/ f5 _) B6 j6 ?9 g9 HETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */8 K' D6 D, m/ t6 W/ G# ]8 O( {
#pragma location=0x30040200
* s  I8 `1 {" puint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffers */
& d& {9 _/ Z* z0 L2 e, [5 S2 d8 z% m. t. m, |& T: w
#elif defined ( __CC_ARM )  /* MDK ARM Compiler */! x& I' u9 f2 c# ]

3 K, l8 \. t0 ^8 @0 w__attribute__((at(0x30040000))) ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */) [. e3 K( N, {& ~; C1 v
__attribute__((at(0x30040060))) ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */
: E3 n! I+ @8 s. T$ @) [__attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */$ H3 f& b  H& F3 X6 M0 I# n

5 ]" v' @- s( C6 b& p, g#elif defined ( __GNUC__ ) /* GNU Compiler */
8 z$ d2 `  p8 d$ V0 N* Q$ o( \* W2 P6 I# ]- c& L
ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".RxDecripSection"))); /* Ethernet Rx DMA Descriptors */
5 o$ v. v6 q9 O: WETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".TxDecripSection")));   /* Ethernet Tx DMA Descriptors */2 |% h6 b* `- o
uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE] __attribute__((section(".RxArraySection"))); /* Ethernet Receive Buffers */( _) Q+ }0 z- D9 z$ P0 F& F2 J

) E! F, `6 U' g7 ^3 W9 h#endif+ H, L5 K. }3 J7 C+ m1 b9 \
1 t3 M$ T, y! X. S) W1 \
2 n& t7 h; T* k: T% z/ L
4、low_level_output中
% y2 Q8 O; m- e8 `) r" o9 D  J3 K/ T( f# h
  SCB_CleanInvalidateDCache();8 X9 l& r& V! S/ x5 d1 w
/ J+ C( p( P, M
  HAL_ETH_Transmit(&heth, &TxConfig, 5);
6 g4 g) F$ C" m" o* S" {6 e- ~: D. c
5、low_level_input中2 F" w8 d% t- ]* w' U' h
" R% ^+ z; \' t- G! w
7 v0 w1 ?( i& B; v. b  a9 N; d

# |: {. W% W: x: [: \/ s    /* Clean and Invalidate data cache */
3 m+ ~8 m! R: }2 \; P! Y' ^8 Z4 I    SCB_CleanInvalidateDCache();
& ]3 \& m$ I  O# Y
' A6 ]3 R, y& \# ^1 K    HAL_ETH_GetRxDataBuffer(&heth, &RxBuff);
# ]/ y- @' }  C* L" t" L    HAL_ETH_GetRxDataLength(&heth, &framelength);+ J9 d# X5 L/ H  Y8 c" _/ k! C
                ) T2 v+ M! \7 Z7 {+ J& F" w
    SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));& k. k2 ]6 r) n, ]; {1 @/ {6 H
3 `5 m- o" @% J7 @

9 s- ^* g; H" o% g! j  L& Z9 ]& d* j/ J
6、lwipopts.h中,注意和MPU对比/ J$ r2 |' k2 F2 m1 [# O0 s! f
       /* USER CODE BEGIN 1 */  z" S8 Z$ `) \8 j& S$ ^
      #define LWIP_RAM_HEAP_POINTER    (0x30044000)5 Y: \6 b" |6 c& H- o- a* n2 c

8 t9 i; Y/ r3 a  f. [

) V9 f! _' X  z7 v, a$ b; W7、ETH_RX_BUFFER_SIZE要一致
, u  T8 X, r1 E9 p  Q+ f
3 h1 ]5 K4 u8 {0 b/ e" J" c5 Y     heth.Init.RxBuffLen = ETH_RX_BUFFER_SIZE;* g. w8 N0 }3 O* _
     ; V" J& G  j- V" l& d" ~  ^7 |
     __attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */
% u9 {' L4 u/ U# B; W
; t& D/ V0 ]2 a! V5 |* [+ N9 h. t   SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));
% q0 Q/ x, z# T" y
* k5 Z2 k- M7 _, G1 h, W) Q; f. o    p = pbuf_alloced_custom(PBUF_RAW, framelength, PBUF_POOL, &rx_pbuf[current_pbuf_idx], RxBuff.buffer, ETH_RX_BUFFER_SIZE);( S: A7 u3 s! P
1 H' Y, K" V* ]/ a* e: L$ x3 T- a

) z% h: p* Q! K1 Q; K8、keil配置RAM如下,勾线IRAM2,不勾选IRAM1
  @# j0 g$ T4 k* ^6 ]5 t/ `- N; U      见附件。1 b% N$ N" p  l5 D5 Q$ B0 f

) N6 \& K, q7 G% [) e
* F: S& @8 g! k8 f! q! A! f7 t7 T二、不使能MPU、CACHE情况
+ z6 t7 i1 q8 `* o$ ?
% v  E" k  }9 K# H8 [上述1,4,5,6标红代码全部注释掉。
4 w% t1 W4 `, K" ?* C1 S7 N
) I% g$ E* y# ~2 u0 M
三、注意事项! P" v+ o/ M; b: {" s2 r6 F0 J- f3 V
1、网络相关管脚配置成高速,cube默认是低速7 v- m. W0 x# ^# ~; r, X
2、可以先禁止MPU和cache,屏蔽掉相关代码,待网络测通后再开启MPU和cache,进行对应配置
* w' Y/ [$ h# K5 E3、H7目前官方库支持不到位,特别是有些examples完全没有经过验证,需特别注意0 r! O- q. M$ R- L. x
4、使用MPU和cache时,多看看手册,弄懂机制避免入坑$ ?, f' N% q: O' P5 c1 W* e

! F5 K. [& c4 {& G2 ]1 L9 u4 L# W. a# ^0 O! z, d

" R. {. j& ]2 t. z5 D5 t% R- u0 E

4 C! {1 t, Q: O* v' e; e) }' l: k
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 X( i" s# z" w& ]. m
" p- Q  {  c2 `3 u% }之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼主发的注意事项,1个小时就调通了,非常感谢!0 {4 @. N# @6 Z2 h% J* n5 j  }+ W
我再补充一点,在配置LWIP之前,需要先给PHY芯片一个硬复位,不然配置不成功,H7的RAM起始地址一定要是0x24000000,我用的是IAR,修改RAM起始地址的方法跟KEIL不太一样,ALT+F7打开“option”选项,然后选择“Linker”>"Config">"Edit">"Memory Regions"修改即可;# f# R# x$ p- d! Z: g
  s7 {; C/ C9 q1 X2 ^+ L6 h
另外有点注意的就是 使用CubeMX生成的“ethernetif.c”里面,默认的heth.Init.RxBuffLen是1524,但是在"stm32h7xx_hal_eth.h"中,默认的ETH_MAX_PACKET_SIZE 大小是1528,这两个是不一样的,需要手动改成一样的数。5 ], W9 v; F  {! j! i* `4 \$ M
QQ图片20180315113746.png
onev 回答时间:2018-3-24 10:59:14
本帖最后由 onev 于 2018-3-24 11:01 编辑 , ^' l( o  z8 m! R

+ \. o8 ]( z4 N7 @+ x要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。。。不过楼主也是蛮厉害的。不知道楼主有测速没有?我现在遇到的问题是Rx速度不堪入目。
, }6 E0 R& z+ tnetio:
- ?1 S* i" q: O. g9 \; ]* j/ e 速度.PNG / @1 b' O# g' P# M

! q. `) t* ~3 H. j) F4 i$ l& B楼主能加方式交流一下吗?
4 V8 O$ U3 S+ I% N/ Y$ A! {& w& K
* q4 C, i) D  K3 b1 T4 h% T! d  z0 ?5 g

$ W" {7 S, e4 z- V' O0 `9 \9 ?
MrJiu 回答时间:2018-3-13 23:32:52
先加个分,以资鼓励。。。特别是说明哪些需要注意的地方,这点特别重要!!!
switcc 回答时间:2018-3-15 14:19:41
豌豆佛 发表于 2018-3-15 11:317 h/ f. a4 N" t+ {$ L5 N
之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...

- j: T; n" D* P: z/ {  V我耽搁了两周啊,后面被搞得没脾气了
wolfgang 回答时间:2018-3-15 15:26:26
H7是有诸多调整。
zero99 回答时间:2018-3-19 09:55:48
感谢分享,已汇总到3月原创& S" K# X: B' ?9 a) |- n
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
onev 回答时间:2018-3-24 11:23:27
豌豆佛 发表于 2018-3-15 11:31
% F1 L' g, Z7 K之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...

9 a$ ~$ ?$ k* x, c" s. C, ^. K# D; Q% j7 g& l
1528.PNG + n" L, V* G" b, S7 E/ C
: X0 ^8 f0 U* |# V
( Q! k% }& f+ O4 s$ H; e4 ^1 z
你好,你的速度是多少?  n  @2 B! k$ A) W6 x9 }
switcc 回答时间:2018-3-24 13:36:17
onev 发表于 2018-3-24 10:59
( U& W# V4 o8 f- O! U3 S- o! J0 c要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。 ...

' T. V" |0 t( e+ g& ~$ u% F. A815201002
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 手机版