stm32 - STM32H743ZI NUCLEO 144 和 LWIP - 无法 ping 板
问题描述
希望一切顺利。我正在尝试使用 LWIP 中间件 ping STM32H743ZI NUCLEO 144。CubeMX 生成的代码。
配置:
- 将 HCLK 设置为 400 MHz
- 启用 CPU ICache 和 DCache(在 Cortex_M7 配置下)
- 启用的 MPU(区域 0、区域 1 和区域 2)
- 启用 LWIP
- 选择 LAN8742 作为 Driver_PHY(在 LwIP>Platform Settings 下)
- DHCP 禁用(IP,掩码:255,255,255,000,网关:调制解调器 IP)
- 实时操作系统禁用
- LWIP_HTTPD、LWIP_HTTPD_CGI 已启用
- LWIP_HTTPD_SSI 已启用
- LWIP_HTTPD_MAX_TAG_NAME_LEN 设置为 16
- ICMP 已启用(LwIP 密钥选项>IPMP 选项中的 LWIP_BROADCAST_PING 和 LWIP_MULTICAST_PING)。
- 为 Keil V5 生成的代码
MX_LWIP_Process 添加到 While 循环中的主函数。
而(1)
{MX_LWIP_Process();
}
我不知道应该如何配置 CubeMX 或更改生成的代码才能 ping 我的板。
解决方案
这可能会对您有所帮助(它对我有用):可以在此处找到有关此问题的信息。 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, ®value) < 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, ®value) >= 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, ®value) < 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;
}
推荐阅读
- ios - 裁剪的图像在 ImageView 中无法正确显示
- python - python - 当Python tabula-py在表格中有换行符时如何读取pdf中的表格?
- docker - Docker-compose 构建应用程序并复制 dockerfile 指定的未集成目录内容
- python - 使用 python 删除谷歌日历事件 - 获取事件 ID
- xamarin - System.InvalidCastException:指定的强制转换在 xamarin 表单中无效?
- aws-lambda - 在无服务器框架中为 API Gateway 和 Lambda 有条件地启用 X-ray
- pygame - 如何将矩形归因于精灵
- ffmpeg - 结合两个命令(从图像中获取视频)
- pointers - 为什么从非指针值调用的闭包不能正确添加到切片中?
- google-analytics - 为什么 Cloudflare Analytics 显示的网站访问者数量比 Google Analytics 多?