[STM32H7] 【STM32H7S78-DK测评】移植LWIP下IPV4&V6双栈

[复制链接]
 楼主| abner_ma 发表于 2024-10-20 23:21 | 显示全部楼层 |阅读模式
<
    网络通信模型
0.png

PHY层:
  物理层位于OSI最底层,物理层协议定义电气信号、线的状态、时钟要求、数据编码和数据传输用的连接器。 物理层的器件称为PHY。

  功能:PHY层负责信号的转换,如将数字信号转换为适合在以太网线上传输的模拟信号,并实现数据的物理传输。
    STM32H7系列微控制器并未集成PHY层。因此,在使用STM32H7进行以太网通信时,需要外部连接一个PHY芯片。
MAC层
    功能:MAC层负责数据帧的封装和解封装,以及处理以太网的访问控制。
    集成情况:STM32H7RS的MAC外设支持多种以太网接口标准,MII(媒体独立接口)和RMII(精简媒体独立接口),使其能够灵活地与外部PHY芯片连接。

2.png



   STM32H7以太网通信的过程:
    MAC与PHY的连接:STM32H7内部的MAC外设会通过MII(媒体独立接口)或RMII(精简媒体独立接口)等接口来连接外部的PHY芯片。这些接口用于传输网络数据。PHY的配置与控制:为了配置或读取PHY芯片的状态,STM32H7还需要通过MDIO(管理数据输入输出)接口与PHY芯片进行通信。MDIO接口类似于IIC接口,包括一根数据线MDIO和一根时钟线MDC。
   原理图:
1.png
   SDK  LwIP_TFTP_Server  demo案例:STM32H7S78-DK\Applications\LwIP\LwIP_TFTP_Server


66.png

   J6跳线,板子上默认是跳到PB2,换到PC1可以正常运行。


777.png

LWIP 配置

888.png

启动IPv6

IPv6.png
  1. void HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  4.   RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  5.   if(ethHandle->Instance==ETH)
  6.   {
  7.   /* USER CODE BEGIN ETH_MspInit 0 */

  8.   /* USER CODE END ETH_MspInit 0 */

  9.   /** Initializes the peripherals clock
  10.   */
  11.     PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ETH1REF|RCC_PERIPHCLK_ETH1PHY;
  12.     PeriphClkInit.Eth1RefClockSelection = RCC_ETH1REFCLKSOURCE_PHY;
  13.     PeriphClkInit.Eth1PhyClockSelection = RCC_ETH1PHYCLKSOURCE_PLL3S;

  14.   /* USER CODE BEGIN MACADDRESS */

  15.   /* USER CODE END MACADDRESS */

  16.     if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  17.     {
  18.       Error_Handler();
  19.     }

  20.     /* Enable Peripheral clock */
  21.     __HAL_RCC_ETH1MAC_CLK_ENABLE();
  22.     __HAL_RCC_ETH1TX_CLK_ENABLE();
  23.     __HAL_RCC_ETH1RX_CLK_ENABLE();

  24.     __HAL_RCC_GPIOD_CLK_ENABLE();
  25.     __HAL_RCC_GPIOG_CLK_ENABLE();
  26.     __HAL_RCC_GPIOC_CLK_ENABLE();
  27.     __HAL_RCC_GPIOA_CLK_ENABLE();
  28.     __HAL_RCC_GPIOB_CLK_ENABLE();
  29.     /**ETH GPIO Configuration
  30.     PD7     ------> ETH_RMII_REF_CLK
  31.     PD4     ------> ETH_PHY_INTN
  32.     PG11     ------> ETH_RMII_TX_EN
  33.     PC1     ------> ETH_MDC
  34.     PA2     ------> ETH_MDIO
  35.     PC4     ------> ETH_RMII_RXD0
  36.     PA7     ------> ETH_RMII_CRS_DV
  37.     PC5     ------> ETH_RMII_RXD1
  38.     PB0     ------> ETH_RMII_TXD0
  39.     PB1     ------> ETH_RMII_TXD1
  40.     */
  41.     GPIO_InitStruct.Pin = GPIO_PIN_7;
  42.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  43.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  44.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  45.     GPIO_InitStruct.Alternate = GPIO_AF4_ETH;
  46.     HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  47.     GPIO_InitStruct.Pin = GPIO_PIN_4;
  48.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  49.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  50.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  51.     GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
  52.     HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  53.     GPIO_InitStruct.Pin = GPIO_PIN_11;
  54.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  55.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  56.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  57.     GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
  58.     HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  59.     GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5;
  60.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  61.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  62.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  63.     GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
  64.     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  65.     GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_7;
  66.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  67.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  68.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  69.     GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
  70.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  71.     GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
  72.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  73.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  74.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  75.     GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
  76.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  77.   /* USER CODE BEGIN ETH_MspInit 1 */

  78.   /* USER CODE END ETH_MspInit 1 */
  79.   }
  80. }

  81. void HAL_ETH_MspDeInit(ETH_HandleTypeDef* ethHandle)
  82. {
  83.   if(ethHandle->Instance==ETH)
  84.   {
  85.   /* USER CODE BEGIN ETH_MspDeInit 0 */

  86.   /* USER CODE END ETH_MspDeInit 0 */
  87.     /* Disable Peripheral clock */
  88.     __HAL_RCC_ETH1MAC_CLK_DISABLE();
  89.     __HAL_RCC_ETH1TX_CLK_DISABLE();
  90.     __HAL_RCC_ETH1RX_CLK_DISABLE();

  91.     /**ETH GPIO Configuration
  92.     PD7     ------> ETH_RMII_REF_CLK
  93.     PD4     ------> ETH_PHY_INTN
  94.     PG11     ------> ETH_RMII_TX_EN
  95.     PC1     ------> ETH_MDC
  96.     PA2     ------> ETH_MDIO
  97.     PC4     ------> ETH_RMII_RXD0
  98.     PA7     ------> ETH_RMII_CRS_DV
  99.     PC5     ------> ETH_RMII_RXD1
  100.     PB0     ------> ETH_RMII_TXD0
  101.     PB1     ------> ETH_RMII_TXD1
  102.     */
  103.     HAL_GPIO_DeInit(GPIOD, GPIO_PIN_7|GPIO_PIN_4);

  104.     HAL_GPIO_DeInit(GPIOG, GPIO_PIN_11);

  105.     HAL_GPIO_DeInit(GPIOC, GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5);

  106.     HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_7);

  107.     HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1);

  108.   /* USER CODE BEGIN ETH_MspDeInit 1 */

  109.   /* USER CODE END ETH_MspDeInit 1 */
  110.   }
  111. }

  112. /*******************************************************************************
  113.                        PHI IO Functions
  114. *******************************************************************************/
  115. /**
  116.   * [url=home.php?mod=space&uid=247401]@brief[/url]  Initializes the MDIO interface GPIO and clocks.
  117.   * @param  None
  118.   * @retval 0 if OK, -1 if ERROR
  119.   */
  120. int32_t ETH_PHY_IO_Init(void)
  121. {
  122.   /* We assume that MDIO GPIO configuration is already done
  123.      in the ETH_MspInit() else it should be done here
  124.   */

  125.   /* Configure the MDIO Clock */
  126.   HAL_ETH_SetMDIOClockRange(&heth);

  127.   return 0;
  128. }
  IPv4 & V6 双栈,同时支持IPv4和IPv6两种协议栈。这意味着这些设备既能处理IPv4数据包,也能处理IPv6数据包。当设备接收到一个数据包时,它会检查数据包的IP版本号,然后根据版本号选择相应的协议栈进行处理。在双栈网络中,设备可以同时拥有IPv4和IPv6两种地址。这些地址可以通过手动配置、DHCP(动态主机配置协议)或其他地址分配机制进行分配。

9999999999999999.png

开发板和电脑在同一个网关下分配不同Ip,成功通信。

OK.png





呐咯密密 发表于 2024-10-22 10:57 | 显示全部楼层
实现的很好啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:项目经理
简介:资深嵌入式开发工程师

95

主题

181

帖子

3

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