STM32H743ZI核子144&;LWIP-Can';不要敲黑板
希望一切顺利。 我正在尝试使用LWIP中间件ping STM32H743ZI nucleo144。由CubeMX生成的代码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已启用
- 配置:
- 将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_过程() }
这可能会对您有所帮助(对我来说的确如此): 有关此问题的信息可在此处找到。 需要将内存缓冲区分配给可通过以太网访问的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, ®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;
}
//用于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, ®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;
}
//用于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_状态_正常)
{
/*设置一个软件