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

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

[复制链接]
switcc 发布时间:2018-3-13 20:03
本帖最后由 Switcc 于 2018-3-14 17:40 编辑 . t8 C9 I* J3 H/ u4 B! ~* }

" }* n# k9 d7 i. z上上周本人发帖询问stm32H7平台移植DP83848 PHY驱动的帖子,详见/ O' l  Q3 D, N. E
https://www.stmcu.org.cn/module/forum/thread-614912-1-1.html: E& V+ }) Q/ Y( n5 q4 v. s
: `2 ]( o- I# t% n- X
按照回帖建议直接使用cube库里LAN8742里的驱动,然后对照不同PHY芯片寄存器查看,可以读到寄存器数据,但是网络一直没有调通,特别是gratuitous arp设备上线的广播都抓不到,更不谈能PING通设备了。
! e0 \5 Q- K1 h7 h
6 E3 V. N. s. N5 |经过长达两周的反复测试和问题排查,直接问题出在MPU和CACHE处理上。现分享使能MPU、CACHE和不使能MPU、CACHE两种模式配置说明:( v% j" g: k) {! K/ ?

! Q: _7 `' n1 Q# ^: N* R! \* J一、使能MPU、CACHE情况3 \, U' s, a1 h( C
1、main.c中 HAL_Init()上加上MPU和CACHE配置
+ j# t6 z; S# S7 V  /* USER CODE BEGIN 1 */8 G) z& \! w* d8 P/ e/ c, G
  MPU_Config();
9 \' Z. q; i% j( D- G  CPU_CACHE_Enable();

/ P4 b9 F1 q- l4 k5 W( p& J  /* USER CODE END 1 */* I+ n0 g2 N6 K3 m4 \5 f: n5 |

/ N8 {/ x& Q+ b! y0 l8 b+ B; K  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
" b: p, n* j& ]9 T6 x  HAL_Init();
) |+ L4 J, V% `3 f$ Z  G+ t$ Z% b8 W
( _; ?$ q0 S, C1 h( o9 |$ b6 _4 L
6 F; |; n1 R" n7 R, Y- z- x
/* USER CODE BEGIN 4 */
: }' Z/ J/ x3 G1 {( C1 F( O% N+ r$ n/**4 d) v. s' F. a/ l1 P% P) K: p; a
  * @brief  Configure the MPU attributes
$ N7 X% J1 R* _& d  * @param  None
- I3 ?, @- i1 o8 y3 r  * @retval None( Y. y/ s/ H9 |( M+ W
  */1 D$ t* u; B+ }* U- U, I
static void MPU_Config(void). C. t9 O7 y* H8 P2 c: _$ }
{
0 z; E+ Y5 M# f) H2 X  MPU_Region_InitTypeDef MPU_InitStruct;
* s  A' i1 r* ]. f- ^7 C" u8 X5 }" {( ~0 o: ~
  /* Disable the MPU */
0 x% y" D/ {1 c3 m  HAL_MPU_Disable();! e5 c. f. P$ A- I) n
3 C! L% q( I" }+ m
  /* Configure the MPU attributes as Device not cacheable * T9 j* b/ P: o8 }6 }! y
     for ETH DMA descriptors */9 F1 b3 q% X! v
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
( g; S9 A1 E9 M6 \  MPU_InitStruct.BaseAddress = 0x30040000;
. {% t% _5 D, y1 C4 I- s! \9 c* N% Z* I  MPU_InitStruct.Size = MPU_REGION_SIZE_256B;! {; F2 D$ O4 \$ ]6 `; U
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
8 V! E, c* a" i$ f) x  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
; R* z3 @9 s& R4 Y3 R  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;8 A: f* j. z* W) y! K( C. G
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
1 N% n. K% k7 K3 J" J  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
* g, x2 z* z0 @+ \9 q* }/ \; I5 _  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;4 a. P" U5 k2 {' g* p' a
  MPU_InitStruct.SubRegionDisable = 0x00;
2 U& Y. p: r- A  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
) C% E6 G3 k, y! {' C. g
& k  u5 Y" _7 z/ F. O- \  s  HAL_MPU_ConfigRegion(&MPU_InitStruct);
' I5 ^4 k6 a+ m1 Y+ L5 v) O4 m" X) j6 K( J- L
  /* Configure the MPU attributes as Cacheable write through
" u! [' {5 @4 b8 C3 j     for LwIP RAM heap which contains the Tx buffers */( R7 m' N& I$ {8 H. k: v: J7 A8 Q
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;* E. V9 i* O3 @. R! e; |  C, X6 X! a
  MPU_InitStruct.BaseAddress = 0x30044000;
2 W4 n- W2 y- `: @2 m! C! m/ Z  MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;! p: F. [& q" l
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;5 l' [5 W# F) u) L
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;9 c* Z( G1 B, E6 }. X
  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;5 A/ n3 W1 D/ X5 J! m& a$ q8 t
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
2 V, K: q; h* T2 n5 v  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
3 @( \3 [8 `4 ^4 x  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
5 M- X% {+ ~/ n+ Y  MPU_InitStruct.SubRegionDisable = 0x00;+ _, k# V9 J( F( `
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
6 e9 A8 l% d, [" }9 ~
5 T4 M7 {3 ?2 U0 e  HAL_MPU_ConfigRegion(&MPU_InitStruct);
4 k) I2 V1 e4 }; o; d$ _4 E+ d; ]' K- `5 {$ v
  /* Enable the MPU */
) X4 b) T+ P. ?& T0 y  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
; |: M! \; n# D  Y5 G  V5 Z& f. T}; L7 b' i0 |. W/ _/ n" a
$ d1 x! D* z+ N
/**
: V. Q/ J( u# @( I$ X. ]5 S9 o3 N% o) ~  * @brief  CPU L1-Cache enable.7 ^8 `2 |( O9 ?  V' H7 u, {
  * @param  None6 q; _# O2 A: r- |
  * @retval None
6 _7 K. L9 i8 q' i' n7 e( H  */% X# {, D0 s+ d7 H3 ^
static void CPU_CACHE_Enable(void)
" w' ~: \4 N2 a, R{
( g! l( h. \/ H9 [  /* Enable I-Cache */8 W# c& H7 w3 W: E# ~' W0 K7 F# b
  SCB_EnableICache();1 u+ x8 {+ o* R6 W3 u
# w2 X  v3 c) z, g3 }2 W
  /* Enable D-Cache */
" }8 r/ G9 ^+ x4 Q2 u% g& q4 s  SCB_EnableDCache();+ t$ q+ m, R3 p2 {  I
}
: W/ I8 ?- `6 k) H

6 t+ g: S( c$ r7 T- P1 D" I3 ?7 R' `& D- Q
2、main.c中时钟配置中加上一句 使能SRAM3时钟1 [+ S/ n+ s5 R( z3 i* n
          /* Enable D2 domain SRAM3 Clock (0x30040000 AXI)*/5 Q, e0 i6 F- w; a
          __HAL_RCC_D2SRAM3_CLK_ENABLE();! Q+ Y; L1 C: @3 F# V
/ J/ d; V2 E+ }

' L3 q: y( o4 W' ~' C  M- t+ E2 _, C8 d% x: u+ S
3、ethernetif.c中DMARxDscrTab、DMATxDscrTab地址分配,注意和MPU对比* G/ |, A5 l; s2 R/ Y5 }
' g5 k% Y$ V4 K/ d( _8 a
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
5 q- H+ E/ M, ]5 G
8 H% j+ c$ r& B  b# M0 n# C+ }#pragma location=0x30040000* U1 \3 n/ A. ]1 `$ v! P+ ?
ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */& x4 s3 O( Q( S4 n9 ~9 S  b
#pragma location=0x30040060' B1 s7 y2 Y" ^( ?; N  G# y
ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */; A8 V& ^% q. y2 J8 l6 X2 F* w# x
#pragma location=0x30040200
2 S: j3 g" u9 \, X$ ~: duint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffers */. v. O  J0 T- Z& h2 w* s+ S" @
9 H6 F0 b) X1 I1 M
#elif defined ( __CC_ARM )  /* MDK ARM Compiler */9 l6 O) `: r0 q$ E/ C

- C- {+ N, e8 E8 ^8 o__attribute__((at(0x30040000))) ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
+ Z- p$ f! `+ }- i9 d/ Z! s! M__attribute__((at(0x30040060))) ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */
( E6 E, o( C7 \& K. f9 H. p5 U4 Z% D__attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */
/ ^, u8 J) c" B+ k) j5 r  w/ t. z/ q' P
#elif defined ( __GNUC__ ) /* GNU Compiler */
' N) a  l% Z1 K/ I( T
# W, H5 \" ]0 X1 Y+ m" a) pETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".RxDecripSection"))); /* Ethernet Rx DMA Descriptors */9 a& t8 _# G0 B4 f* Y  n5 U+ g
ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".TxDecripSection")));   /* Ethernet Tx DMA Descriptors */
9 f1 Y' d) a4 z* ^! T  luint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE] __attribute__((section(".RxArraySection"))); /* Ethernet Receive Buffers */5 S% c4 |+ g1 [- c7 f2 j

/ m3 M1 C4 j2 d( n  O9 G, R#endif% K# d' i, S, H4 b2 O6 W  \5 }$ {% i

" p5 B( S% c3 d4 I/ }* g) _* {+ \. l: G
4、low_level_output中, M% F  J9 _4 L* S  c# q
1 Y  o! i0 w) Y+ R. m# L/ p: l
  SCB_CleanInvalidateDCache();: w9 V) ~8 i3 y/ g: z9 {

0 s4 x! K$ a* h- ?( i& B9 U  HAL_ETH_Transmit(&heth, &TxConfig, 5);# V! ^# u9 [0 U7 W8 T% a% M

; U- h% k+ m/ g9 ^0 n5、low_level_input中
) f$ R4 }+ a* U. J; U( B
6 n; F) O3 m! q$ n) @' `/ [0 \' R7 J1 W+ _2 U" @# p( r2 ?
$ @7 Q- O, h4 d$ R
    /* Clean and Invalidate data cache */
  O2 S6 N! z. R- R, [3 h% t    SCB_CleanInvalidateDCache();
0 R* I) A- J. H( g9 @- Z. _, D0 S" \+ H1 I, r" [
    HAL_ETH_GetRxDataBuffer(&heth, &RxBuff);
- |& J( X3 P/ F7 M0 e    HAL_ETH_GetRxDataLength(&heth, &framelength);8 o" l/ R& u( _
                - r" b# K+ U4 {! b( \
    SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));( n2 v/ M$ i5 B0 T3 ^6 L
% {1 _2 x3 E! m* E; [- t
6 ?( d$ b$ z9 ]/ ^  a8 r5 A
. N1 J' d  |) o" B( {) X5 F& t& r
6、lwipopts.h中,注意和MPU对比
0 ]3 L7 t! |% p7 ]* J# \- q: o5 A3 R3 V       /* USER CODE BEGIN 1 */
. `. {7 O" J" Y; }$ F4 Q$ q& r      #define LWIP_RAM_HEAP_POINTER    (0x30044000)
+ s$ }% f# W9 f/ r! a8 B
4 x$ Q4 y, J" H+ z, b; ^. E

6 ~& ^" m* [# b8 U  x( p7、ETH_RX_BUFFER_SIZE要一致
8 _4 I" D& G& {( W' r2 k: l0 A, V+ u
     heth.Init.RxBuffLen = ETH_RX_BUFFER_SIZE;6 k" I; E( {8 O. e% g9 k
     
* h' m1 O8 v& w, w) P+ A6 K! c  m, b     __attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */
/ L1 ~: [& @( A# G0 u% q+ L! F9 R4 V! v
   SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));! C: Y5 h4 \, \7 b$ F8 f6 ^) B
/ j' `" w5 c/ |' y" B2 |) a3 T
    p = pbuf_alloced_custom(PBUF_RAW, framelength, PBUF_POOL, &rx_pbuf[current_pbuf_idx], RxBuff.buffer, ETH_RX_BUFFER_SIZE);
* i9 A) h. T- j( e
% E2 k. B1 b1 B

; S) ?+ D; T$ A0 W( K7 w$ A8、keil配置RAM如下,勾线IRAM2,不勾选IRAM1
2 g# E- M/ C4 ^$ M0 J+ B( G1 C      见附件。5 M% H+ Q: O: d* Y- n

6 ?! T  x3 e1 \# X0 P7 \4 w3 [, w3 q  S" }  T4 Y
二、不使能MPU、CACHE情况) r8 o/ p$ ^/ O0 K

6 d9 M6 {4 w) l. k& m上述1,4,5,6标红代码全部注释掉。
+ ^8 z- f- g' x2 X

9 p; d% d) f8 u9 G% C三、注意事项
) |9 B5 F: {% @1、网络相关管脚配置成高速,cube默认是低速
) L% r5 Q0 F! X: l  u: q5 \2、可以先禁止MPU和cache,屏蔽掉相关代码,待网络测通后再开启MPU和cache,进行对应配置
5 z! m$ D2 ~8 G. Z2 D/ v' E7 G2 j3、H7目前官方库支持不到位,特别是有些examples完全没有经过验证,需特别注意( Z4 i+ G  H  b! Q
4、使用MPU和cache时,多看看手册,弄懂机制避免入坑' R1 G7 ~9 l& Z9 T; f
% u5 {/ e, X; S- F9 P

' v; p- [( {2 Y. g) \4 o
  u( T# l( a: C3 `+ S

2 k+ x1 X( W1 z4 t, s; J$ D/ P& J/ g5 R# U! l) [4 }. \- h
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 编辑 . {& K2 ~+ j# h# Z3 i3 Z+ |* ^1 H* n4 Y
/ j( o. h" [# f/ Z; S
之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼主发的注意事项,1个小时就调通了,非常感谢!8 E: t/ H8 A! s
我再补充一点,在配置LWIP之前,需要先给PHY芯片一个硬复位,不然配置不成功,H7的RAM起始地址一定要是0x24000000,我用的是IAR,修改RAM起始地址的方法跟KEIL不太一样,ALT+F7打开“option”选项,然后选择“Linker”>"Config">"Edit">"Memory Regions"修改即可;2 |7 E, C5 B; V- t

9 t7 f  K# C* F  K2 \另外有点注意的就是 使用CubeMX生成的“ethernetif.c”里面,默认的heth.Init.RxBuffLen是1524,但是在"stm32h7xx_hal_eth.h"中,默认的ETH_MAX_PACKET_SIZE 大小是1528,这两个是不一样的,需要手动改成一样的数。, f  Q5 J0 \% b" @! E( y3 G9 s
QQ图片20180315113746.png
onev 回答时间:2018-3-24 10:59:14
本帖最后由 onev 于 2018-3-24 11:01 编辑
( t: h4 ?% t, _- j5 U  {- M( }
# u4 V5 h9 S. A5 w8 u要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。。。不过楼主也是蛮厉害的。不知道楼主有测速没有?我现在遇到的问题是Rx速度不堪入目。0 o  ]5 ~9 T* `- r+ I" O
netio:
- L, r! P# ?4 O7 A, z) {  @/ S 速度.PNG
8 S- P* B8 R! }( d* V' x* _, h. j: _+ G$ U& f" h* @1 Y* |
楼主能加方式交流一下吗?
" V' o/ j9 m1 t7 ]- v3 n" z( m0 m! j: L1 L+ |# ]9 T; o

" z; q: Z7 z  ~
2 z% p8 E, F( y& j/ F
MrJiu 回答时间:2018-3-13 23:32:52
先加个分,以资鼓励。。。特别是说明哪些需要注意的地方,这点特别重要!!!
switcc 回答时间:2018-3-15 14:19:41
豌豆佛 发表于 2018-3-15 11:31
/ v* W) V  U7 q8 J4 t- \, \之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...

+ O* t" H4 G; u" \! H) Y# M) x. |我耽搁了两周啊,后面被搞得没脾气了
wolfgang 回答时间:2018-3-15 15:26:26
H7是有诸多调整。
zero99 回答时间:2018-3-19 09:55:48
感谢分享,已汇总到3月原创  V& @  T! }; ^1 o
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
onev 回答时间:2018-3-24 11:23:27
豌豆佛 发表于 2018-3-15 11:317 G+ u5 `7 ]1 i
之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...
( _3 @' m# U( u% F& X

( O5 J  a& M6 d, K4 O" a/ J% k 1528.PNG 0 f8 V$ a- `, s6 n/ ^
1 V5 d# Q1 z4 L: ~' s
' [! n3 X4 _' v0 k
你好,你的速度是多少?
$ ^% V3 U4 g' |, d
switcc 回答时间:2018-3-24 13:36:17
onev 发表于 2018-3-24 10:59; c  y, k! }' S. e
要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。 ...
4 |" B+ ^$ [$ T( }* O5 r
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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版