查看: 2049|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    2019-11-4 13:48
  • 签到天数: 14 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2020-7-21 17:29:46 | 显示全部楼层 |阅读模式
    分享到:
    按照回帖建议直接使用cube库里LAN8742里的驱动,然后对照不同PHY芯片寄存器查看,可以读到寄存器数据,但是网络一直没有调通,特别是gratuitous arp设备上线的广播都抓不到,更不谈能PING通设备了。

    经过长达两周的反复测试和问题排查,直接问题出在MPU和CACHE处理上。现分享使能MPU、CACHE和不使能MPU、CACHE两种模式配置说明:

    一、使能MPU、CACHE情况
    1、main.c中 HAL_Init()上加上MPU和CACHE配置
      /* USER CODE BEGIN 1 */
      MPU_Config();
      CPU_CACHE_Enable();

      /* USER CODE END 1 */

      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();


    /* USER CODE BEGIN 4 */
    /**
      * @brief  Configure the MPU attributes
      * @param  None
      * @retval None
      */
    static void MPU_Config(void)
    {
      MPU_Region_InitTypeDef MPU_InitStruct;

      /* Disable the MPU */
      HAL_MPU_Disable();

      /* Configure the MPU attributes as Device not cacheable
         for ETH DMA descriptors */
      MPU_InitStruct.Enable = MPU_REGION_ENABLE;
      MPU_InitStruct.BaseAddress = 0x30040000;
      MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
      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;

      HAL_MPU_ConfigRegion(&MPU_InitStruct);

      /* Configure the MPU attributes as Cacheable write through
         for LwIP RAM heap which contains the Tx buffers */
      MPU_InitStruct.Enable = MPU_REGION_ENABLE;
      MPU_InitStruct.BaseAddress = 0x30044000;
      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;

      HAL_MPU_ConfigRegion(&MPU_InitStruct);

      /* Enable the MPU */
      HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
    }

    /**
      * @brief  CPU L1-Cache enable.
      * @param  None
      * @retval None
      */
    static void CPU_CACHE_Enable(void)
    {
      /* Enable I-Cache */
      SCB_EnableICache();

      /* Enable D-Cache */
      SCB_EnableDCache();
    }


    2、main.c中时钟配置中加上一句 使能SRAM3时钟
              /* Enable D2 domain SRAM3 Clock (0x30040000 AXI)*/
              __HAL_RCC_D2SRAM3_CLK_ENABLE();



    3、ethernetif.c中DMARxDscrTab、DMATxDscrTab地址分配,注意和MPU对比

    #if defined ( __ICCARM__ ) /*!< IAR Compiler */

    #pragma location=0x30040000
    ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
    #pragma location=0x30040060
    ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */
    #pragma location=0x30040200
    uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffers */

    #elif defined ( __CC_ARM )  /* MDK ARM Compiler */

    __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 */

    #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 */

    #endif


    4、low_level_output中

      SCB_CleanInvalidateDCache();

      HAL_ETH_Transmit(&heth, &TxConfig, 5);

    5、low_level_input中



        /* Clean and Invalidate data cache */
        SCB_CleanInvalidateDCache();

        HAL_ETH_GetRxDataBuffer(&heth, &RxBuff);
        HAL_ETH_GetRxDataLength(&heth, &framelength);
                   
        SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));



    6、lwipopts.h中,注意和MPU对比
           /* USER CODE BEGIN 1 */
          #define LWIP_RAM_HEAP_POINTER    (0x30044000)


    7、ETH_RX_BUFFER_SIZE要一致

         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 */

       SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT*ETH_RX_BUFFER_SIZE));

        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
          见附件。


    二、不使能MPU、CACHE情况

    上述1,4,5,6标红代码全部注释掉。

    三、注意事项
    1、网络相关管脚配置成高速,cube默认是低速
    2、可以先禁止MPU和cache,屏蔽掉相关代码,待网络测通后再开启MPU和cache,进行对应配置
    3、H7目前官方库支持不到位,特别是有些examples完全没有经过验证,需特别注意
    4、使用MPU和cache时,多看看手册,弄懂机制避免入坑





    QQ截图20180313200203.png (15.41 KB, 下载次数: 38)




    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-25 23:17 , Processed in 0.116924 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.