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

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

[复制链接]
switcc 发布时间:2018-3-13 20:03
本帖最后由 Switcc 于 2018-3-14 17:40 编辑
$ P7 o/ y+ c' t6 @, [3 k$ y9 G3 b- C, m, s
上上周本人发帖询问stm32H7平台移植DP83848 PHY驱动的帖子,详见) N6 R9 u* M# K7 ^1 f; Z  E
https://www.stmcu.org.cn/module/forum/thread-614912-1-1.html
6 \9 a' i0 x1 G4 m5 o
! K+ \# B  \9 ~按照回帖建议直接使用cube库里LAN8742里的驱动,然后对照不同PHY芯片寄存器查看,可以读到寄存器数据,但是网络一直没有调通,特别是gratuitous arp设备上线的广播都抓不到,更不谈能PING通设备了。
# }' X2 M0 o' {, D& b( [/ R- q# v# C; \% T% [( q
经过长达两周的反复测试和问题排查,直接问题出在MPU和CACHE处理上。现分享使能MPU、CACHE和不使能MPU、CACHE两种模式配置说明:
2 m" O$ X! }4 L$ t2 X. G
! w3 `& U3 \9 E6 l( j一、使能MPU、CACHE情况
# y" G% d5 q) [; y& Z; H( e  W9 k1、main.c中 HAL_Init()上加上MPU和CACHE配置
0 P7 q& `- t% v1 d8 W  /* USER CODE BEGIN 1 */8 T8 C/ E" [/ i; n: e
  MPU_Config();% D7 ^2 ]* \* K( u9 A( ^: }
  CPU_CACHE_Enable();

6 M: A8 a: R6 U( M  /* USER CODE END 1 */8 b$ B2 d7 @. m' H
' g) N2 [: X! }( o+ w0 C* a- ~
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */6 l  e5 Q- Q7 E) C8 ~+ r0 K
  HAL_Init();5 C0 w. j: X" N8 D8 @0 N

! `5 I8 ]! }  T4 W! ~4 X0 \% P
7 H7 X+ a* O0 F. D8 B/* USER CODE BEGIN 4 */" C+ i& a( u( w
/**
  X: k7 l' [5 k% q% @* P* x, [" Z2 z  * @brief  Configure the MPU attributes
* N8 N) _; e1 t) U6 ~/ a  * @param  None
  c4 s7 ~( @1 O! k* X" ?( P  * @retval None
2 z+ t# @! F/ y; n4 v  R0 Q  */" v5 f8 f( E$ o1 q
static void MPU_Config(void)
7 o# P- H: s3 R; }" L{
: g8 Z8 D0 \$ u" ^. u/ s! u% f- P  MPU_Region_InitTypeDef MPU_InitStruct;9 L5 ?. T) N5 y8 b2 o$ p& h' w! l

+ v* e2 I) [2 w  /* Disable the MPU */" _0 h- y5 X3 e& O; o
  HAL_MPU_Disable();  R. t. x6 z  U

" P0 P4 n! s+ S, v3 X8 U6 t  /* Configure the MPU attributes as Device not cacheable
' V( ^( ^1 I0 _  U5 O$ e     for ETH DMA descriptors */2 c1 E/ L! }; a0 L% h. G' _
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;! k# o% [3 s$ d* w* R$ O* J. e
  MPU_InitStruct.BaseAddress = 0x30040000;7 \$ n1 N( h1 R! s% c; H% L
  MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
6 G( Y' a1 b6 I* k* d! ~  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;5 ]$ [- x* v. c3 S  ^5 h
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
: y% z5 T1 H6 `1 X  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;! v5 z! {* f4 Y! c+ p
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
5 K! m. H9 q  m- r4 R& Y2 p  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
/ t( S" J  ?( a2 \8 S  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;& M* s! T& {/ l* {1 {' w- L
  MPU_InitStruct.SubRegionDisable = 0x00;" _: o+ r) Q& m- y; e! n2 k
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
; O( m% [3 K4 f7 s7 Y5 Z( A# r, M) G
  HAL_MPU_ConfigRegion(&MPU_InitStruct);( C, M* X4 P) B4 ~
  V# V, K& S( H2 V2 B+ y# G
  /* Configure the MPU attributes as Cacheable write through
+ M# t4 Q6 F" U& S6 g     for LwIP RAM heap which contains the Tx buffers */, L; s6 {+ I! x
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;9 E% m9 ^- w* J+ }- W
  MPU_InitStruct.BaseAddress = 0x30044000;
# B8 o( k5 Q1 Y1 ^  MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;
, v  g3 [1 m, }& `, N  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
! X) y1 i4 ~3 `5 G( k  u" ^: j5 G  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
" F7 l4 F  m/ l4 h' J( h  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;0 D* r2 f5 R9 a2 q" s
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;" y- `, c% S' g5 o  K  q
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;6 E  H" r3 h3 {( n  z
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;. W* z' g; @8 ?1 V/ j2 {
  MPU_InitStruct.SubRegionDisable = 0x00;
4 C& B# H( v6 g' Z3 E/ [8 I  A  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;: H5 y5 m& I1 M" o9 [

. M7 h5 O+ c+ c4 E  HAL_MPU_ConfigRegion(&MPU_InitStruct);$ O( ~. n+ Z- m% U) `5 g$ F
; Z$ I% ^# L3 X- S
  /* Enable the MPU */. Z5 X3 X6 Y# g( {
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
" f* B/ s* p6 r' k}7 Z# }( @; T' K! W& d

  I: {  _6 c% Q# l0 C1 B/**7 O% {9 n: b$ Z* B
  * @brief  CPU L1-Cache enable.
# {* s' }, b8 F3 l3 L  * @param  None. J0 ~7 [" y  ]) e( ?" u% n
  * @retval None
8 ]8 L6 |! z! I6 o6 q  */1 d' N' k, H5 J0 Q- o! n+ W: U
static void CPU_CACHE_Enable(void)
  U! y, q7 A8 S) g0 F+ Y{
1 k; H; N: S1 |" E: \  /* Enable I-Cache */$ C: t! C6 a9 e$ p: l* L0 ?5 L9 N/ W
  SCB_EnableICache();
$ a! n( b& h8 L: L  U
# w. x. R) C8 x" G4 b& |  /* Enable D-Cache */* f  I( w5 k3 E* V5 h
  SCB_EnableDCache();
% [1 W% H. D$ ^0 _6 w}
/ P( K2 V2 e0 {5 T

! b8 X6 c' w) u
8 a1 I3 }8 i# ]1 K# Z: j$ M2、main.c中时钟配置中加上一句 使能SRAM3时钟% }- O5 T# p# w; U
          /* Enable D2 domain SRAM3 Clock (0x30040000 AXI)*/
% b5 L# N/ T8 o) ?( Q% J) J- p          __HAL_RCC_D2SRAM3_CLK_ENABLE();
! @; |2 n  s& ^8 \6 H; ^
# f6 V% @5 O4 \( A1 l- z

; f, H. H0 W/ g4 ~& j- c: x1 {( R
3、ethernetif.c中DMARxDscrTab、DMATxDscrTab地址分配,注意和MPU对比: J' K' N- @% L! ]2 p$ i8 b
8 l$ K/ r% Y" d0 ^0 Z
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
/ V8 u; p' K- X5 o$ U+ q7 O
! ^4 {1 f8 a& s1 Z% K/ z( F#pragma location=0x30040000. R- K% T: T; [) ]  V8 r9 ^
ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */! N/ x8 ~# G( H& I
#pragma location=0x300400602 N* [2 m' P8 \5 [% [" ^
ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */
7 G4 d: A* R+ F- e$ l% x- z#pragma location=0x30040200' u7 O* c1 K: s$ H9 }( v8 Z
uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffers */* E6 p' m9 z$ j8 d( V3 Y

; S1 @: d$ d# n( M* _( g#elif defined ( __CC_ARM )  /* MDK ARM Compiler */7 k4 B( _3 [& K! a9 m' C! o
% h+ S8 Q/ @- ?4 i7 n
__attribute__((at(0x30040000))) ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
' f+ i* p1 D! h- q) N% `__attribute__((at(0x30040060))) ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors *// k) p( X- q. U8 x0 p+ A
__attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */$ H+ n# H; Q! ~  o, ?9 X3 h
$ d; P3 n2 R. _* w
#elif defined ( __GNUC__ ) /* GNU Compiler */ 1 o( a- ~* s8 [. m8 V7 b, ?
. D, K% Z4 Z: W+ Q
ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".RxDecripSection"))); /* Ethernet Rx DMA Descriptors */
5 p  o4 C) s8 e) G" kETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".TxDecripSection")));   /* Ethernet Tx DMA Descriptors */
# P: s: X( L/ z" s2 iuint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE] __attribute__((section(".RxArraySection"))); /* Ethernet Receive Buffers */7 I3 ?% c6 R7 N2 k
8 q+ N/ w2 r5 ^. D: o# c! \
#endif( A6 G/ I% K0 x3 \6 z
: A/ E" F" a1 i7 p; B, {
5 ~' W+ B& I* r: k' l# v4 m4 [
4、low_level_output中( Y$ A' T% W  w5 g$ Y
  L& K, c/ }( S- z
  SCB_CleanInvalidateDCache();, G9 S% n  m" J
& E) _2 j( C. D- B8 |& Q4 h7 V
  HAL_ETH_Transmit(&heth, &TxConfig, 5);
: I' [* |2 \# m7 f  P
' C1 H  P% |# W. M5、low_level_input中) T2 D! y& E1 V) u8 A

: C. s) w; J1 {0 u. a
8 c0 O- J* k2 c$ K
4 Z* C9 P9 ?# I9 j2 x* b! ?  c5 d
    /* Clean and Invalidate data cache */
( Q- {  r+ }/ j$ M6 Z$ D    SCB_CleanInvalidateDCache();
  l9 x9 G; \# g0 _1 Y2 m0 y! Y, \, ]+ S( L* E% K! J, d/ [
    HAL_ETH_GetRxDataBuffer(&heth, &RxBuff);$ j8 C) ]7 p0 j1 O( O( D
    HAL_ETH_GetRxDataLength(&heth, &framelength);7 i$ L' O- I7 q/ |
               
' p) M" n* E! Q- s( j* h" O1 c9 h    SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));  s& J7 q4 _- ]$ j0 f
* I4 ~: F$ Y& A5 ^5 Z8 [
1 V& l# X2 F* S9 i
! P: _: w) B4 y. ]% ]
6、lwipopts.h中,注意和MPU对比
* e4 A# W. K+ O4 Z       /* USER CODE BEGIN 1 */4 u6 a1 g/ s% A+ `0 t! S$ u* F
      #define LWIP_RAM_HEAP_POINTER    (0x30044000)
7 j3 `9 U. d6 ?5 |. \
% Z% c: i+ G' ]: a3 ?+ P" M

. ?* Y0 s# Y- o  D) }7、ETH_RX_BUFFER_SIZE要一致9 j7 b2 ^% a# @5 L; V

  d' i3 D- S# {& k$ D) K9 q% m     heth.Init.RxBuffLen = ETH_RX_BUFFER_SIZE;
6 h6 W, Y; W; _1 M     
5 t/ M' A! F) f5 ~     __attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */' y& P& }' B7 l) K3 F' |* u
: n% b: [, ?8 N7 C6 N
   SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));+ {: B. y% l* Z# B; U% J; q

! Y9 ?% O" J4 f" N8 ^    p = pbuf_alloced_custom(PBUF_RAW, framelength, PBUF_POOL, &rx_pbuf[current_pbuf_idx], RxBuff.buffer, ETH_RX_BUFFER_SIZE);
( A( l# ]2 r, _7 m! p8 E5 n/ [" ]$ C% {4 w1 P

' ^8 K4 C# d. Z( U8 Q4 D6 T8、keil配置RAM如下,勾线IRAM2,不勾选IRAM16 r9 [$ U; V# q: H. |
      见附件。
3 `/ y: P. V! m6 C* L1 `9 h
+ w/ e+ |3 C4 v* L5 m7 `: ^  h" C5 u1 M: Q4 y$ P, ~7 \
二、不使能MPU、CACHE情况& c4 _' r5 g: H/ E' Y+ ^
2 h8 p* N4 z7 P1 d: q3 a
上述1,4,5,6标红代码全部注释掉。# g/ O) }5 `9 L. |$ H

$ v3 @* c: W/ d三、注意事项
2 s& f/ G3 p! |; f1、网络相关管脚配置成高速,cube默认是低速( R* h$ x: f$ D8 e; [. r
2、可以先禁止MPU和cache,屏蔽掉相关代码,待网络测通后再开启MPU和cache,进行对应配置
5 M& K" o6 n, F" d) Q3、H7目前官方库支持不到位,特别是有些examples完全没有经过验证,需特别注意/ V, C3 s$ L& z# f
4、使用MPU和cache时,多看看手册,弄懂机制避免入坑
2 {" v* w7 x& x: d0 H* _& q5 w  L, H2 K4 k( S

& J% j4 c' s/ B. E. {/ i( d
3 J$ P7 e( s/ e) r4 k

7 G  y& k$ A; ^8 R5 G) c! X% n
# S$ D$ R% ^' V/ M7 M! z
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 编辑 / K$ E/ x5 u# E" p' W/ k3 R
4 _0 u# o( u) [7 s
之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼主发的注意事项,1个小时就调通了,非常感谢!
1 F1 r0 E) S; s3 K我再补充一点,在配置LWIP之前,需要先给PHY芯片一个硬复位,不然配置不成功,H7的RAM起始地址一定要是0x24000000,我用的是IAR,修改RAM起始地址的方法跟KEIL不太一样,ALT+F7打开“option”选项,然后选择“Linker”>"Config">"Edit">"Memory Regions"修改即可;
6 D1 a/ K, _4 R
0 f/ g& ~/ x7 u5 Q, O: D$ X另外有点注意的就是 使用CubeMX生成的“ethernetif.c”里面,默认的heth.Init.RxBuffLen是1524,但是在"stm32h7xx_hal_eth.h"中,默认的ETH_MAX_PACKET_SIZE 大小是1528,这两个是不一样的,需要手动改成一样的数。
! u- C0 h$ B7 g* m, E8 t
QQ图片20180315113746.png
onev 回答时间:2018-3-24 10:59:14
本帖最后由 onev 于 2018-3-24 11:01 编辑 2 L0 ^1 x8 m; }! q9 U

- W' f5 O9 c; i9 \% v: V& o要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。。。不过楼主也是蛮厉害的。不知道楼主有测速没有?我现在遇到的问题是Rx速度不堪入目。( }1 i& O! U9 }, ~( R7 J
netio:
: G1 u. }$ F1 [% v4 ^! t; k2 v 速度.PNG
0 U8 Y" f, ^. c1 R) u* m) N0 u  P5 i. f7 ?( f0 M
楼主能加方式交流一下吗?) w9 g$ U+ I9 d5 W6 j: M, L9 V

, J9 z8 _' k* }
+ O6 I) c9 z9 j8 d$ b0 f# K9 S, o: Y0 ]4 k! L4 N1 [' i
MrJiu 回答时间:2018-3-13 23:32:52
先加个分,以资鼓励。。。特别是说明哪些需要注意的地方,这点特别重要!!!
switcc 回答时间:2018-3-15 14:19:41
豌豆佛 发表于 2018-3-15 11:31* ^) N4 m, R% S+ a; q
之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...

) q8 C+ k  z- A我耽搁了两周啊,后面被搞得没脾气了
wolfgang 回答时间:2018-3-15 15:26:26
H7是有诸多调整。
zero99 回答时间:2018-3-19 09:55:48
感谢分享,已汇总到3月原创: P. `9 n+ ^6 L9 W2 E# H
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
onev 回答时间:2018-3-24 11:23:27
豌豆佛 发表于 2018-3-15 11:31: a# [6 g$ I7 h6 R
之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼 ...
( R& p0 s0 O/ H9 Y+ d0 F

  \. |; ]5 o2 V: @ 1528.PNG
/ d, @* y# {  v5 y, _* J* L
1 d' b- `2 P% j/ R: I4 T& u7 u
( t' `. b! z9 w& I! G你好,你的速度是多少?& v  w( H: S+ M9 p, j/ N0 ]
switcc 回答时间:2018-3-24 13:36:17
onev 发表于 2018-3-24 10:59. i# w6 H- `6 |& _
要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。 ...

( J6 P) g- _& v  @1 n7 C815201002
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 手机版