*更新:多维数据集具有状态和链接回调。还没有尝试过,但是我希望这是最好的解决方案
我正在将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的硬件图,以查看是否可以观看。
答案 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, ®value) == 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;
}
}
仅此而已。