• RT-Thread基于STM32H743的网络通信调试


    使用STM32H743开发网络通信,本以为会很简单,实际却遇到好多问题,记录一下,以备后续查看。

    1.新建工程,系统版本选择的是4.1.1,芯片型号是STM32H743IIK6.

    2.修改系统时钟,使用外部25MHz晶振,配置系统时钟为400MHz。

    修改drv_clk.c文件里的时钟配置和调试等级为DBG_LOG

    配置代码如下:

    void system_clock_config(int target_freq_mhz)
    {
      RCC_OscInitTypeDef RCC_OscInitStruct = {0};
      RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

      /** Supply configuration update enable
      */
      HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
      /** Configure the main internal regulator output voltage
      */
      __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

      while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
      /** Initializes the RCC Oscillators according to the specified parameters
      * in the RCC_OscInitTypeDef structure.
      */
      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
      RCC_OscInitStruct.HSEState = RCC_HSE_ON;
      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
      RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
      RCC_OscInitStruct.PLL.PLLM = 2;
      RCC_OscInitStruct.PLL.PLLN = 64;
      RCC_OscInitStruct.PLL.PLLP = 2;
      RCC_OscInitStruct.PLL.PLLQ = 2;
      RCC_OscInitStruct.PLL.PLLR = 2;
      RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
      RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
      RCC_OscInitStruct.PLL.PLLFRACN = 0;
      if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
      {
        Error_Handler();
      }
      /** Initializes the CPU, AHB and APB buses clocks
      */
      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
                                  |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
      RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
      RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
      RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
      RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
      RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
      RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;

      if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
      {
        Error_Handler();
      }
    }

    3.注意:如果晶振不是25MHz,配置完时钟初始化后要改一下hal_conf.h里的时钟频率。

    4.下载测试

    5.打开board.h里的BSP_USING_ETH

    6.复制一个ETH的引脚初始化代码到board.c

    代码如下:

    void HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle)
    {

      GPIO_InitTypeDef GPIO_InitStruct = {0};
      if(ethHandle->Instance==ETH)
      {
      /* USER CODE BEGIN ETH_MspInit 0 */

      /* USER CODE END ETH_MspInit 0 */
        /* ETH clock enable */
        __HAL_RCC_ETH1MAC_CLK_ENABLE();
        __HAL_RCC_ETH1TX_CLK_ENABLE();
        __HAL_RCC_ETH1RX_CLK_ENABLE();

        __HAL_RCC_GPIOG_CLK_ENABLE();
        __HAL_RCC_GPIOC_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();
        /**ETH GPIO Configuration
        PG14     ------> ETH_TXD1
        PG13     ------> ETH_TXD0
        PG11     ------> ETH_TX_EN
        PC1     ------> ETH_MDC
        PA1     ------> ETH_REF_CLK
        PC4     ------> ETH_RXD0
        PA2     ------> ETH_MDIO
        PC5     ------> ETH_RXD1
        PA7     ------> ETH_CRS_DV
        */
        GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_13|GPIO_PIN_11;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
        HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

        GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
        HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

        GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

        /* ETH interrupt Init */
        HAL_NVIC_SetPriority(ETH_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(ETH_IRQn);
      /* USER CODE BEGIN ETH_MspInit 1 */

      /* USER CODE END ETH_MspInit 1 */
      }
    }

    7.打开hal_conf.h里ETH的注释。

    8.添加一下PHY芯片的复位函数。

    9.打开LWIP配置为静态IP

    10.编译一下一堆错误。。。

    10.1替换掉drivers下面的drv_eth.c和drv_eth.h文件

    下载地址:xiaoxiaoxiong/RT-Thread基于STM32H743的网络通信配置

    如果是从别处下载的记得更改一下phy_reset();函数,和实际硬件一致即可

    10.2再次编译已经没有错误了,下载测试有W/drv.emac] eth transmit frame faild: 8这个错误。

    然后启用SAL组件,可以使用ifconfig命令了

    虽然可以查看IP地址,连上电脑也显示网线已连接,但是无法ping通

    10.3从GIT上复制drv_mpu.c文件到drivers文件夹下,启用MPU。

    11.接下来就要更改H743芯片的RAM地址了,H7系列的RAM分了好多块,默认使用的是DTCM,起始地址0x20000000,大小时128K。

    ETH默认是使用DMA的,但DTCM的速度是400M,DMA无法进行访问。
    AXI SRAM的速度是200M,DMA可以进行访问,所以要把SRAM该带AXI区域。

    12.直接复制上面那个git里的link.lds文件,覆盖掉工程里原来的文件,更改后如下

    13.然后下载发现芯片直接死机,任何信息都不打印了。崩溃不。。。。。

    14.其实也很简单,更改一下board.h里RAM地址和大小的定义就好了,前说过H743默认使用的是DTCM RAM起始地址是0x20000000,大小128K。我们要改成AXI SRAM。

    AXI SRAM起始地址0x24000000,大小512K

    更改后如下:

    然后下载测试,发现LWIP v2.0.3版本的ping的时候会一直丢包,换成v2.1.2版本的网络OK。

    工程下载地址:xiaoxiaoxiong/RT-Thread基于STM32H743的网络通信配置

  • 相关阅读:
    如何做好软件系统的需求调研,七种武器让你轻松搞定
    多线程同步,信号,生产者消费者模型
    SpringBoot接口数据加解密实战
    php中通用的excel导出方法实例
    力扣(LeetCode)10. 正则表达式匹配(C++)
    云主机内网通信ping不通问题处理过程
    JS中面向对象的程序设计
    mysql(1)
    springboot图书借阅管理系统 java读书心得借书卡管理系统
    相机平行状态下模型无法初始化到桌面
  • 原文地址:https://blog.csdn.net/qq_25186745/article/details/134482559