STM32H743ZI核子144&;LWIP-Can';不要敲黑板

STM32H743ZI核子144&;LWIP-Can';不要敲黑板,stm32,lwip,nucleo,Stm32,Lwip,Nucleo,希望一切顺利。 我正在尝试使用LWIP中间件ping STM32H743ZI nucleo144。由CubeMX生成的代码 配置: 将HCLK设置为400 MHz 已启用CPU ICache和DCache(在Cortex_M7配置下) 已启用的MPU(区域0、区域1和区域2) 启用的LWIP 选择LAN8742作为驱动程序物理层(在LwIP>平台设置下) 禁用DHCP(IP,掩码:255255000,网关:调制解调器IP) 禁用RTOS LWIP_HTTPD,LWIP_HTTPD_CGI已启用

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

  • 配置:

  • 将HCLK设置为400 MHz
  • 已启用CPU ICache和DCache(在Cortex_M7配置下)
  • 已启用的MPU(区域0、区域1和区域2)
  • 启用的LWIP
  • 选择LAN8742作为驱动程序物理层(在LwIP>平台设置下)
  • 禁用DHCP(IP,掩码:255255000,网关:调制解调器IP)
  • 禁用RTOS
  • LWIP_HTTPD,LWIP_HTTPD_CGI已启用
  • LWIP_HTTPD_SSI已启用
  • LWIP\u HTTPD\u MAX\u TAG\u NAME\u LEN设置为16
  • 已启用ICMP(LWIP密钥选项>IPMP选项中的LWIP_广播_PING和LWIP_多播_PING)
  • 为keilv5生成的代码
  • MX_LWIP_进程添加到While循环的主函数中

    而(1)
    {

    MX_LWIP_过程()

    }

我不知道应该如何配置CubeMX或更改生成的代码以能够ping我的板


这可能会对您有所帮助(对我来说的确如此): 有关此问题的信息可在此处找到。

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

您可能需要更改链接器脚本

在本页中,您将发现良好的信息:

不过,可能不需要上述HAL_延迟

在文件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;
}
//用于ethernetif.c,363,静态void low_level_init(struct netif*netif)
int32_t LAN8742_Init(LAN8742_对象*pObj)
{
uint32_t tickstart=0,regvalue=0,addr=0;
int32_t status=LAN8742_status_OK;
如果(pObj->已初始化==0)
{
如果(pObj->IO.Init!=0)
{
/*GPIO和时钟初始化*/
pObj->IO.Init();
}
/*以备日后查核*/
pObj->DevAddr=LAN8742_MAX_DEV_ADDR+1;
/*从特殊模式寄存器*获取设备地址
对于(addr=0;addr IO.ReadReg(addr,LAN8742_SMR,®value)<0)
{ 
状态=LAN8742_状态_读取_错误;
/*无法读取此设备地址
继续下一个地址*/
继续;
}
if((regvalue&LAN8742\u SMR\u PHY\u ADDR)=ADDR)
{
pObj->DevAddr=addr;
状态=LAN8742_状态_正常;
打破
}
}
如果(pObj->DevAddr>LAN8742_MAX_DEV_ADDR)
{
状态=LAN8742_状态_地址_错误;
}
/*如果设备地址匹配*/
如果(状态==LAN8742_状态_正常)
{
/*设置软件重置*/
如果(pObj->IO.WriteReg(pObj->DevAddr,LAN8742_BCR,LAN8742_BCR_SOFT_RESET)>=0)
{ 
/*获取软件重置状态*/
如果(pObj->IO.ReadReg(pObj->DevAddr、LAN8742_BCR和®value)>=0)
{ 
tickstart=pObj->IO.GetTick();
/*等待软件重置完成或发生超时*/
同时(注册表值和LAN8742\u BCR\u软复位)
{
if((pObj->IO.GetTick()-tickstart)IO.ReadReg(pObj->DevAddr,LAN8742_BCR,®value)<0)
{ 
状态=LAN8742_状态_读取_错误;
打破
}
}
其他的
{
status=LAN8742_status_RESET_TIMEOUT;
}
} 
}
其他的
{
状态=LAN8742_状态_读取_错误;
}
}
其他的
{
状态=LAN8742_状态_写入_错误;
}
}
}
//插孔2019-03-25,HW复位后链路未出现。
pObj->IO.WriteReg(pObj->DevAddr、LAN8742_BCR、LAN8742_BCR_AUTONEGO_EN);
如果(状态==LAN8742_状态_正常)
{
tickstart=pObj->IO.GetTick();
/*等待2秒以执行初始化*/
而((pObj->IO.GetTick()-tickstart)是_Initialized=1;
}
返回状态;
}

这可能会对您有所帮助(对我来说的确如此): 有关此问题的信息可在此处找到。

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

您可能需要更改链接器脚本

在本页中,您将发现良好的信息:

不过,可能不需要上述HAL_延迟

在文件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;
}
//用于ethernetif.c,363,静态void low_level_init(struct netif*netif)
int32_t LAN8742_Init(LAN8742_对象*pObj)
{
uint32_t tickstart=0,regvalue=0,addr=0;
int32_t status=LAN8742_status_OK;
如果(pObj->已初始化==0)
{
如果(pObj->IO.Init!=0)
{
/*GPIO和时钟初始化*/
pObj->IO.Init();
}
/*以备日后查核*/
pObj->DevAddr=LAN8742_MAX_DEV_ADDR+1;
/*从特殊模式寄存器*获取设备地址
对于(addr=0;addr IO.ReadReg(addr,LAN8742_SMR,®value)<0)
{ 
状态=LAN8742_状态_读取_错误;
/*无法读取此设备地址
继续下一个地址*/
继续;
}
if((regvalue&LAN8742\u SMR\u PHY\u ADDR)=ADDR)
{
pObj->DevAddr=addr;
状态=LAN8742_状态_正常;
打破
}
}
如果(pObj->DevAddr>LAN8742_MAX_DEV_ADDR)
{
状态=LAN8742_状态_地址_错误;
}
/*如果设备地址匹配*/
如果(状态==LAN8742_状态_正常)
{
/*设置一个软件