STM32-如何确定运行时是否拔掉了以太网电缆

时间:2019-03-14 16:11:10

标签: stm32 ethernet

*更新:多维数据集具有状态和链接回调。还没有尝试过,但是我希望这是最好的解决方案

我正在将STM32F429ZI上的以太网外围设备与CubeMX生成的LWIP中间件一起使用。 This question与PC类似。

我发现很难理解产品规格中的“以太网”部分。我看不到可以查看哪些寄存器来检查断开的链接。

我还研究了LWIP代码,以防出现明显的非注册监视方法。在主循环中,它使用MX_LWIP_Process轮询网络接口。在读取时,它通过以下方式知道是否有数据包:

void ethernetif_input(struct netif *netif)
{
  err_t err;
  struct pbuf *p;

  /* move received packet into a new pbuf */
  p = low_level_input(netif);

  /* no packet could be read, silently ignore this */
  if (p == NULL) return;

发送时,tcp_output()函数非常麻烦。它有无效的netif错误,无效的local_ip错误以及我可以观察到的一般错误,但没有什么可以直接告诉我链接已断开。

我最后的想法是,如果拔下电缆,以太网接头上的LED会熄灭。我将查看STM32F4 DK的硬件图,以查看是否可以观看。

1 个答案:

答案 0 :(得分:0)

是的,您可以使用回调。

您所要做的只是:

1-)在lwipopts.h文件中启用LWIP_NETIF_LINK_CALLBACK定义。 默认情况下,该值可以为0。选中它。

2-)在void ethernetif_input(struct netif * netif)函数中初始化“ netif_set_link_callback(netif,ethernetif_update_config);”。

3-)读取PHY寄存器并执行任何所需的操作。

以我的示例为例,如果断开并重新连接了以太网电缆,系统将自行重置。

void ethernetif_input(struct netif *netif)
{
 err_t err;
 struct pbuf *p;

 /* move received packet into a new pbuf */
 p = low_level_input(netif);
 uint32_t regvalue = 0;
 netif_set_link_callback(netif, ethernetif_update_config); //added by Volkan
 // Read PHY link status

 if (HAL_ETH_ReadPHYRegister(&EthHandle, PHY_BSR, &regvalue) == HAL_OK) 

{
    if((regvalue & PHY_LINKED_STATUS)== (uint16_t)RESET) 
    {
      // Link status = disconnected
       if (netif_is_link_up(netif))

       {

          netif_set_down(netif);
          printf("unplugged\r\n");
          netif_set_link_down(netif);

      }
  }

else

{

// Link status = connected

    if (!netif_is_link_up(netif))
    {

        printf("plugged\r\n");
        NVIC_SystemReset();

    }
 }
}

/* no packet could be read, silently ignore this */
if (p == NULL) return;

/* entry point to the LwIP stack */
err = netif->input(p, netif);

if (err != ERR_OK)
{
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
pbuf_free(p);
p = NULL;
}
}

仅此而已。