[STM32H7] 【STM32H7S78-DK测评】9、配置LWIP

[复制链接]
 楼主| sujingliang 发表于 2024-9-27 21:44 | 显示全部楼层 |阅读模式
<
本帖最后由 sujingliang 于 2024-9-27 21:49 编辑

为了配置LWIP又花费了不少时间,虽然已有大佬在其他技术网站分享了配置过程,但轮到自己配置还是遇到不少问题。


先分析一下重点需要关注的问题吧:


一、重点
1、原理图上ETH管脚部分有错误,STM32CubeMX默认生成的也是错的
正确的如下:

  1.     /**ETH GPIO Configuration
  2.     PD7     ------> ETH_RMII_REF_CLK
  3.     PD4     ------> ETH_PHY_INTN
  4.     PG11     ------> ETH_RMII_TX_EN
  5.     PC1     ------> ETH_MDC
  6.     PA2     ------> ETH_MDIO
  7.     PC4     ------> ETH_RMII_RXD0
  8.     PA7     ------> ETH_RMII_CRS_DV
  9.     PC5     ------> ETH_RMII_RXD1
  10.     PB0     ------> ETH_RMII_TXD0
  11.     PB1     ------> ETH_RMII_TXD1
  12.     */

1.png

还有跳线JP6要调到PC1

2、要从一个好的模板开始配
完全从头配费时费力,很容易出错。而且STM32H7S78-DK配置需要考虑支持BOOT,APPLI,XIP。所以最好从一个mpu,xspi,EXTMEN_MANAGER、UART4都配好的模板开始。可以从USB_Device\MSC_Standalone例程的ioc文件开始,去掉USB、SD等等就有一个很好的基础。



3、MPU配置很关键
boot
  1. static void MPU_Config(void)
  2. {
  3.   MPU_Region_InitTypeDef MPU_InitStruct = {0};

  4.   /* Disables the MPU */
  5.   HAL_MPU_Disable();

  6.   /** Initializes and configures the Region and the memory to be protected
  7.   */
  8.   MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  9.   MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  10.   MPU_InitStruct.BaseAddress = 0x0;
  11.   MPU_InitStruct.Size = MPU_REGION_SIZE_4GB;
  12.   MPU_InitStruct.SubRegionDisable = 0x87;
  13.   MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  14.   MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;
  15.   MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
  16.   MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  17.   MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  18.   MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

  19.   HAL_MPU_ConfigRegion(&MPU_InitStruct);

  20.   /** Initializes and configures the Region and the memory to be protected
  21.   */
  22.   MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  23.   MPU_InitStruct.BaseAddress = 0x90000000;
  24.   MPU_InitStruct.Size = MPU_REGION_SIZE_32MB;
  25.   MPU_InitStruct.SubRegionDisable = 0x0;
  26.   MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
  27.   MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  28.   MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  29.   MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
  30.   MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;

  31.   HAL_MPU_ConfigRegion(&MPU_InitStruct);

  32.   /** Initializes and configures the Region and the memory to be protected
  33.   */
  34.   MPU_InitStruct.Number = MPU_REGION_NUMBER2;
  35.   MPU_InitStruct.BaseAddress = 0x70000000;
  36.   MPU_InitStruct.Size = MPU_REGION_SIZE_128MB;
  37.   MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;

  38.   HAL_MPU_ConfigRegion(&MPU_InitStruct);

  39.   /** Initializes and configures the Region and the memory to be protected
  40.   */
  41.   MPU_InitStruct.Number = MPU_REGION_NUMBER3;
  42.   MPU_InitStruct.BaseAddress = 0x24000000;
  43.   MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
  44.   MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  45.   MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  46.   MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

  47.   HAL_MPU_ConfigRegion(&MPU_InitStruct);
  48.   /* Enables the MPU */
  49.   HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

  50. }


appli可能需要重新配置mpu
  1. static void MPU_Config(void)
  2. {
  3.   MPU_Region_InitTypeDef MPU_InitStruct = {0};

  4.   /* Disables the MPU */
  5.   HAL_MPU_Disable();

  6.   /** Initializes and configures the Region and the memory to be protected
  7.   */
  8.   MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  9.   MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  10.   MPU_InitStruct.BaseAddress = 0x0;
  11.   MPU_InitStruct.Size = MPU_REGION_SIZE_4GB;
  12.   MPU_InitStruct.SubRegionDisable = 0x87;
  13.   MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  14.   MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;
  15.   MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
  16.   MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  17.   MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  18.   MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

  19.   HAL_MPU_ConfigRegion(&MPU_InitStruct);

  20.   /** Initializes and configures the Region and the memory to be protected
  21.   */
  22.   MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  23.   MPU_InitStruct.BaseAddress = 0x90000000;
  24.   MPU_InitStruct.Size = MPU_REGION_SIZE_32MB;
  25.   MPU_InitStruct.SubRegionDisable = 0x0;
  26.   MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
  27.   MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  28.   MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  29.   MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
  30.   MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;

  31.   HAL_MPU_ConfigRegion(&MPU_InitStruct);

  32.   /** Initializes and configures the Region and the memory to be protected
  33.   */
  34.   MPU_InitStruct.Number = MPU_REGION_NUMBER2;
  35.   MPU_InitStruct.BaseAddress = 0x70000000;
  36.   MPU_InitStruct.Size = MPU_REGION_SIZE_128MB;
  37.   MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;

  38.   HAL_MPU_ConfigRegion(&MPU_InitStruct);

  39.   /** Initializes and configures the Region and the memory to be protected
  40.   */
  41.   MPU_InitStruct.Number = MPU_REGION_NUMBER3;
  42.   MPU_InitStruct.BaseAddress = 0x24020000;
  43.   MPU_InitStruct.Size = MPU_REGION_SIZE_32KB;
  44.   MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  45.   MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  46.   MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

  47.   HAL_MPU_ConfigRegion(&MPU_InitStruct);

  48.   /** Initializes and configures the Region and the memory to be protected
  49.   */
  50.   MPU_InitStruct.Number = MPU_REGION_NUMBER4;
  51.   MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
  52.   MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  53.   MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  54.   MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;

  55.   HAL_MPU_ConfigRegion(&MPU_InitStruct);

  56.   /** Initializes and configures the Region and the memory to be protected
  57.   */
  58.   MPU_InitStruct.Number = MPU_REGION_NUMBER5;
  59.   MPU_InitStruct.BaseAddress = 0x24040000;
  60.   MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;
  61.   MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
  62.   MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

  63.   HAL_MPU_ConfigRegion(&MPU_InitStruct);
  64.   /* Enables the MPU */
  65.   HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

  66. }


4、sct
  1. ; *************************************************************
  2. ; *** Scatter-Loading Description File generated by uVision ***
  3. ; *************************************************************
  4. LOAD_FLASH 0x70000000 0x08000000  {    ; load region size_region
  5.   ER_ROM 0x70000000 0x08000000  {  ; load address = execution address
  6.    *.o (RESET, +First)
  7.    *(InRoot$Sections)
  8.    .ANY (+RO)
  9.    .ANY (+XO)
  10.   }

  11.   ER_ITCM 0x00000000 0x00010000  {  ;
  12.   }

  13.   RW_DTCM 0x20000000 0x00010000  {  ; RW data
  14.    *(STACK, +RW)
  15.    *(HEAP, +RW)
  16.   }

  17.   RW_SRAMAHB 0x30000000 0x8000  {
  18.   }

  19.   RW_BKPSRAM 0x38800000 0x1000  {
  20.   }

  21.   RW_RAM 0x24000000  0x00020000  {
  22.    .ANY (+RW +ZI)
  23.   }
  24.   RW_DMARxDscrTab 0x24020000 0x80 {
  25.   *(.RxDescripSection)
  26.   }
  27.   RW_DMATxDscrTab 0x24020080 0x80 {
  28.   *(.TxDescripSection)
  29.   }
  30.   memory_RX_POOL_base 0x24020100 0x8000-0x100 {
  31.   *(.Rx_PoolSection)
  32.   }
下面需要手工添加:
  RW_DMARxDscrTab 0x24020000 0x80 {
  *(.RxDescripSection)
  }
  RW_DMATxDscrTab 0x24020080 0x80 {
  *(.TxDescripSection)
  }
  memory_RX_POOL_base 0x24020100 0x8000-0x100 {
  *(.Rx_PoolSection)
  }


5、RCC和时钟图
没用HSE、LSE
2.png

3.png
5.png




4.png

6、LWIP请参考网友分享吧




二、修改
1、main while(1)增加:
  1. MX_LWIP_Process();
2、print_ip_address();也加到while(1)

如果获取了IP说明网络已经连上了,print_ip_address可以打印出IP。
  1. /* USER CODE BEGIN 0 */
  2. void print_ip_address(void) {
  3.   struct netif *netif = netif_default;
  4.   ip_addr_t ip_addr = *netif_ip_addr4(netif);

  5.   printf("IP Address: %d.%d.%d.%d\n",
  6.          ip4_addr1(&ip_addr),
  7.          ip4_addr2(&ip_addr),
  8.          ip4_addr3(&ip_addr),
  9.          ip4_addr4(&ip_addr));
  10. }

  1.     /* USER CODE BEGIN 3 */
  2.                 print_ip_address();




三、效果
6.png

四、总结
1、STM32H7S78-DK还是比较新的,目前官方出的软件包也才是第一版,所以原理图、MX、例程上存在问题也可以理解。
2、之前就发现例程中有的带IOC文件,有的不带。现在看来可能是编写的例程的人也发现了MX生成的IOC有问题,代码需要修改,所以为了不误导使用者,就不提供IOC了。所以再遇到没有IOC的例程就要多考虑一下了,这里头可能真有坑。

附IOC配置文件:
LWIP.rar (4.61 KB, 下载次数: 5)

烟雨蒙蒙520 发表于 2024-9-29 01:25 | 显示全部楼层
在配置每个部分时,逐步进行验证。比如先测试ETH的基本通信,再逐步集成LWIP的功能,这样可以更容易找到问题所在。
Amazingxixixi 发表于 2024-10-31 16:10 | 显示全部楼层
网路速度可以到多少?能跑满100M么?
suncat0504 发表于 2024-10-31 17:13 | 显示全部楼层
楼主好细心啊。等于是帮着别人踩坑了。
地瓜patch 发表于 2024-10-31 18:30 来自手机 | 显示全部楼层
网络速度咋样,下个视频类大文件测试一下看看效果啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

146

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部

84

主题

146

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部