STM32H743ZI NUCLEO 144和LWIP-无法对板进行乒乓

时间:2019-06-11 14:15:43

标签: stm32 lwip nucleo

希望一切顺利。 我正在尝试使用LWIP中间件来ping STM32H743ZI NUCLEO 144。 CubeMX生成的代码。

  • 配置:

    1. 将HCLK设置为400 MHz
    2. 启用了CPU ICache和DCache(在Cortex_M7配置下)
    3. 启用的MPU(Region0,Region1和Region2)
    4. 已启用LWIP
    5. 选择LAN8742作为Driver_PHY(在LwIP>“平台设置”下)
    6. DHCP已禁用(IP,MASK:255,255,255,000,网关:调制解调器IP)
    7. 禁用RTOS
    8. 启用了LWIP_HTTPD,启用了LWIP_HTTPD_CGI
    9. 已启用LWIP_HTTPD_SSI
    10. LWIP_HTTPD_MAX_TAG_NAME_LEN设置为16
    11. 已启用ICMP(LwIP密钥选项> IPMP选项中的LWIP_BROADCAST_PING和LWIP_MULTICAST_PING)。
    12. 为Keil V5生成的代码
    13. MX_LWIP_Process已添加到While循环的主要功能中。

      while(1)
      {

      MX_LWIP_Process();

      }

我不知道该如何配置CubeMX或更改生成的代码以能够对我的主板执行ping操作。

My_File

1 个答案:

答案 0 :(得分:0)

这可能会对您有所帮助(对我有帮助): 有关此问题的信息可以在这里找到。 https://community.st.com/s/article/FAQ-Ethernet-not-working-on-STM32H7x3

需要将内存缓冲区分配给可以通过以太网访问的RAM  外围设备。 您可能需要调整游览堆栈/堆的大小。 默认的以太网GPIO速度可能太低。 您可能需要配置MPU。

您可能需要更改链接描述文件。

在此页面上,您将找到很好的信息: https://github.com/MX-Master/STM32H7_Nucleo-H743ZI_Ethernet_LwIP

虽然可能不需要HAL_Delay。

在文件lan8742.c(驱动程序)中,我在190行附近为LAN8742_Init函数添加了额外的一行以设置自动协商:

// Link did not come up after HW reset.
pObj->IO.WriteReg(pObj->DevAddr, LAN8742_BCR, LAN8742_BCR_AUTONEGO_EN);

该函数如下所示:

// Used in ethernetif.c, 363, static void low_level_init(struct netif *netif)
int32_t LAN8742_Init(lan8742_Object_t *pObj)
{
   uint32_t tickstart = 0, regvalue = 0, addr = 0;
   int32_t status = LAN8742_STATUS_OK;

   if(pObj->Is_Initialized == 0)
   {
     if(pObj->IO.Init != 0)
     {
       /* GPIO and Clocks initialization */
       pObj->IO.Init();
     }

     /* for later check */
     pObj->DevAddr = LAN8742_MAX_DEV_ADDR + 1;

     /* Get the device address from special mode register */  
     for(addr = 0; addr <= LAN8742_MAX_DEV_ADDR; addr ++)
     {
       if(pObj->IO.ReadReg(addr, LAN8742_SMR, &regvalue) < 0)
       { 
         status = LAN8742_STATUS_READ_ERROR;
         /* Can't read from this device address 
            continue with next address */
         continue;
       }

       if((regvalue & LAN8742_SMR_PHY_ADDR) == addr)
       {
         pObj->DevAddr = addr;
         status = LAN8742_STATUS_OK;
         break;
       }
     }

     if(pObj->DevAddr > LAN8742_MAX_DEV_ADDR)
     {
       status = LAN8742_STATUS_ADDRESS_ERROR;
     }

     /* if device address is matched */
     if(status == LAN8742_STATUS_OK)
     {
       /* set a software reset  */
       if(pObj->IO.WriteReg(pObj->DevAddr, LAN8742_BCR, LAN8742_BCR_SOFT_RESET) >= 0)
       { 
         /* get software reset status */
         if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BCR, &regvalue) >= 0)
         { 
           tickstart = pObj->IO.GetTick();

           /* wait until software reset is done or timeout occurred  */
           while(regvalue & LAN8742_BCR_SOFT_RESET)
           {
             if((pObj->IO.GetTick() - tickstart) <= LAN8742_SW_RESET_TO)
             {
               if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BCR, &regvalue) < 0)
               { 
                 status = LAN8742_STATUS_READ_ERROR;
                 break;
               }
             }
             else
             {
               status = LAN8742_STATUS_RESET_TIMEOUT;
             }
           } 
         }
         else
         {
           status = LAN8742_STATUS_READ_ERROR;
         }
       }
       else
       {
         status = LAN8742_STATUS_WRITE_ERROR;
       }
     }
   }


   // Jack 2019-03-25, Link did not come up after HW reset.
   pObj->IO.WriteReg(pObj->DevAddr, LAN8742_BCR, LAN8742_BCR_AUTONEGO_EN);



   if(status == LAN8742_STATUS_OK)
   {
     tickstart =  pObj->IO.GetTick();

     /* Wait for 2s to perform initialization */
     while((pObj->IO.GetTick() - tickstart) <= LAN8742_INIT_TO)
     {
     }
     pObj->Is_Initialized = 1;
   }

   return status;
}