本帖最后由 Switcc 于 2018-3-14 17:40 编辑 ' G9 d5 R' V) Z* b C 上上周本人发帖询问stm32H7平台移植DP83848 PHY驱动的帖子,详见 https://www.stmcu.org.cn/module/forum/thread-614912-1-1.html,- f2 M& K% b9 E) c9 c6 G7 d 按照回帖建议直接使用cube库里LAN8742里的驱动,然后对照不同PHY芯片寄存器查看,可以读到寄存器数据,但是网络一直没有调通,特别是gratuitous arp设备上线的广播都抓不到,更不谈能PING通设备了。 经过长达两周的反复测试和问题排查,直接问题出在MPU和CACHE处理上。现分享使能MPU、CACHE和不使能MPU、CACHE两种模式配置说明:" k& W) l% e/ t- M9 C0 R! _8 C i( G0 L. {: F 一、使能MPU、CACHE情况$ }& z3 A E) k: X9 M; \ 1、main.c中 HAL_Init()上加上MPU和CACHE配置 /* USER CODE BEGIN 1 */ MPU_Config();7 g1 B F% q- Y" ] CPU_CACHE_Enable(); /* USER CODE END 1 */ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); 4 Z, u- x! |$ P* l9 C6 B- O: p , N+ S7 |/ u5 x) \ /* USER CODE BEGIN 4 */ /** * @brief Configure the MPU attributes : N( Z7 k8 V/ [' ?1 `0 h& u) V3 U * @param None * @retval None* {/ ]/ A& I. f- q2 x% b */ static void MPU_Config(void) {( C( f. G* m2 |( A8 g MPU_Region_InitTypeDef MPU_InitStruct;$ F* @9 D3 c2 _ /* Disable the MPU */ HAL_MPU_Disable(); * l6 A# Q7 H Z, N! Q2 K- g, X /* Configure the MPU attributes as Device not cacheable for ETH DMA descriptors */- V& J. j5 s0 `$ D5 J' _! Z MPU_InitStruct.Enable = MPU_REGION_ENABLE;0 Q; i# l5 X! y# n MPU_InitStruct.BaseAddress = 0x30040000; MPU_InitStruct.Size = MPU_REGION_SIZE_256B;8 o* c1 D% _1 ~( r: u9 E, B! X MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;8 Z [" r u) I. K x5 Q. U. k MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;% X( o H% ~3 F+ Y6 i! C4 j 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;5 I% W$ C! F8 `! E) l% r3 U HAL_MPU_ConfigRegion(&MPU_InitStruct); /* Configure the MPU attributes as Cacheable write through for LwIP RAM heap which contains the Tx buffers */: V* _+ x3 ]- z; ` MPU_InitStruct.Enable = MPU_REGION_ENABLE;( S$ q" n* h# N MPU_InitStruct.BaseAddress = 0x30044000;3 H& t$ _3 e& n$ f" o/ n0 ` MPU_InitStruct.Size = MPU_REGION_SIZE_16KB; MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER1; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; MPU_InitStruct.SubRegionDisable = 0x00; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; ( B' ^8 ~0 V, E5 w+ e+ I: t+ M, |( _ HAL_MPU_ConfigRegion(&MPU_InitStruct); ! W4 ?' A0 E; y# H, \( p/ F /* Enable the MPU */ HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); }0 \9 L" n, _4 d; v# [ /** * @brief CPU L1-Cache enable. * @param None5 h) [# D+ o2 a9 e% Q: G * @retval None5 c1 m" y; L8 }# v+ w* v! J7 Q */ static void CPU_CACHE_Enable(void) { /* Enable I-Cache */ SCB_EnableICache();& S* y. O% L3 I% o9 i /* Enable D-Cache */# p0 i2 K: d" A% O$ q! M- E SCB_EnableDCache();& H' u8 l# y: Q, I G: c } & r/ i) Z4 R% a5 P. |, w % W+ c7 @6 n' x* o0 P6 x 2、main.c中时钟配置中加上一句 使能SRAM3时钟 /* Enable D2 domain SRAM3 Clock (0x30040000 AXI)*/ __HAL_RCC_D2SRAM3_CLK_ENABLE();$ e4 ~; E! [' L- Q ( g$ R: C$ d/ C9 m' q1 B3 a7 R6 e 3、ethernetif.c中DMARxDscrTab、DMATxDscrTab地址分配,注意和MPU对比- \# G( O9 ]# G# A$ [7 ^ 3 t$ [. w& \( l2 a5 q* I7 [/ k #if defined ( __ICCARM__ ) /*!< IAR Compiler */ 9 e4 y q" I Y* p9 a #pragma location=0x30040000 ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */3 v2 l# w1 o7 q+ A #pragma location=0x30040060. h3 y! H6 ~' g3 d ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */ #pragma location=0x300402006 i3 x# r+ k& d# p4 g uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffers */ #elif defined ( __CC_ARM ) /* MDK ARM Compiler */5 ]1 q% c* j8 O3 { __attribute__((at(0x30040000))) ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */ __attribute__((at(0x30040060))) ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */ __attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */8 r1 d! w) L1 \8 Q 8 }: Y$ ?' c0 ]; R+ v #elif defined ( __GNUC__ ) /* GNU Compiler */ ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".RxDecripSection"))); /* Ethernet Rx DMA Descriptors */ ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".TxDecripSection"))); /* Ethernet Tx DMA Descriptors */ uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE] __attribute__((section(".RxArraySection"))); /* Ethernet Receive Buffers */" b, p( ^$ B( R! T6 ~$ U2 ?1 w2 Z; Y6 V ! h( Q* X" x- u, y. s #endif ! M! K2 _' u) I. Q' z 2 t( A2 d9 C1 P: |4 {- p) |! e( g 4、low_level_output中 ! O" I; Z# M# l- P5 a9 H( l. N0 Z0 l SCB_CleanInvalidateDCache();6 X$ I' G- ?! v' s0 t m ] ! R& o- W0 c5 v HAL_ETH_Transmit(&heth, &TxConfig, 5); 5、low_level_input中 ) `3 t7 ~5 i' k9 F, _ ; C2 t& @3 s8 U /* Clean and Invalidate data cache */ SCB_CleanInvalidateDCache(); HAL_ETH_GetRxDataBuffer(&heth, &RxBuff); HAL_ETH_GetRxDataLength(&heth, &framelength); % |, n* e* T- A3 u$ N( g+ f+ _ SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));: A" j! F: l5 h2 G0 J 6、lwipopts.h中,注意和MPU对比 /* USER CODE BEGIN 1 */ #define LWIP_RAM_HEAP_POINTER (0x30044000) 0 ]" }, H C# u* L& f6 M* J 8 n8 T% y4 V! s' T) c3 } 7、ETH_RX_BUFFER_SIZE要一致2 o1 Z6 e7 z, B s. X ! o6 [6 G' E- k; a9 w3 W8 O5 N. @ heth.Init.RxBuffLen = ETH_RX_BUFFER_SIZE; __attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */! ?9 n* G- m2 U) g5 R* p) ] 2 o g# o& o: }: @4 r9 _ L" i SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE)); h v" z0 q' p) H2 o9 W ) y& M6 D% i% `; c; e7 ^6 ]" I p = pbuf_alloced_custom(PBUF_RAW, framelength, PBUF_POOL, &rx_pbuf[current_pbuf_idx], RxBuff.buffer, ETH_RX_BUFFER_SIZE); 8、keil配置RAM如下,勾线IRAM2,不勾选IRAM1 见附件。 , r& @ e% G8 W! Z" L% P- y' D+ i 二、不使能MPU、CACHE情况 , y2 }" s' Q% w! K- G 上述1,4,5,6标红代码全部注释掉。+ s8 H( D6 ~7 l9 ]# h ' B1 t2 J3 A) S. m5 |- j0 E: u1 i 三、注意事项7 D' X! E, `) D3 x1 C- S$ @ 1、网络相关管脚配置成高速,cube默认是低速2 T. P @$ s0 M2 ?. { 2、可以先禁止MPU和cache,屏蔽掉相关代码,待网络测通后再开启MPU和cache,进行对应配置, _4 n, Q( u( W1 m$ S2 ~/ p, J 3、H7目前官方库支持不到位,特别是有些examples完全没有经过验证,需特别注意: E4 y. i3 c+ L 4、使用MPU和cache时,多看看手册,弄懂机制避免入坑4 p/ A, L5 E! B1 V # M' [1 V; t" \3 B" N# a5 c6 v) F 6 @( _0 [& P }- K. G . }( {, C3 r( w: Z5 v ! ]2 u1 Y8 `8 N : K$ m) s+ E, ?. j4 v3 {% ^* a: [1 _3 j |
【经验分享】STM32_H7_ADC
STM32H7R/S高性能MCU:安全性,大存储和优异图显赋能更多应用创新
Stm32H7XX GCC下分散加载实现
【银杏科技ARM+FPGA双核心应用】STM32H7系列10——ADC
DIY-STM32H750核心板
[nucleo-H7A3ZI-Q]1-点亮一个皮皮灯
DIY-STM32H743核心板
【银杏科技ARM+FPGA双核心应用】STM32H7系列57——MDK_FLM
1月10日有奖直播 | 基于STM32 的CODESYS智能自动化解决方案
STM32的CAN FD位定时设置注意事项
在大数据量通信交互时,会造成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的任务优先级提高
( ~9 N1 W6 [; q& I( m" A5 x* f
之前用的是F207+DP83848,很容易就调通了,这次换了H7之后,CubeMX里面配置完全不一样了,卡了2天,看到楼主发的注意事项,1个小时就调通了,非常感谢!6 m4 H% z' t# x3 w
我再补充一点,在配置LWIP之前,需要先给PHY芯片一个硬复位,不然配置不成功,H7的RAM起始地址一定要是0x24000000,我用的是IAR,修改RAM起始地址的方法跟KEIL不太一样,ALT+F7打开“option”选项,然后选择“Linker”>"Config">"Edit">"Memory Regions"修改即可;- s, Q7 P6 ?9 R) [ W
# L% s# u- A. a$ M
另外有点注意的就是 使用CubeMX生成的“ethernetif.c”里面,默认的heth.Init.RxBuffLen是1524,但是在"stm32h7xx_hal_eth.h"中,默认的ETH_MAX_PACKET_SIZE 大小是1528,这两个是不一样的,需要手动改成一样的数。8 L7 D9 Q; U$ @& v
% z( `3 F) H! @
要是早两天看到你的帖子我就告诉你这个问题出在cache上了,我也正在调试H743的ETH,也是碰到了cache问题。。。不过楼主也是蛮厉害的。不知道楼主有测速没有?我现在遇到的问题是Rx速度不堪入目。2 K5 O0 @ c$ Y
netio:8 J! ~* J3 i8 x: y3 C6 B R
# a: F, l% h+ s, {/ b
楼主能加方式交流一下吗?4 L, C4 v m: Q+ D5 a
$ Z Q8 A1 \1 c% e. m! X' X. M
我耽搁了两周啊,后面被搞得没脾气了
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
你好,你的速度是多少?
815201002