cancel
Showing results for 
Search instead for 
Did you mean: 

The STM32F407 lwIP does not work after the second reboot

embedtekin
Associate II

After the device powers on, lwIP works properly. I reboot it once using the code below, and it continues to function correctly. However, if I reboot it a second time with the same code, it stops working. It goes through the PCB initialization, but no data reaches the callbacks. Normally, DHCP is enabled, but after the second reboot, it doesn't acquire an IP via DHCP either. What should I do to ensure the device reboots properly?

 

void Reboot_Device(void){
	close_udp();
        taskDISABLE_INTERRUPTS();
	netif_set_down(&gnetif);   
	netif_remove(&gnetif);   
	HAL_ETH_DeInit(&heth);
	NVIC_SystemReset();

}

 

1 ACCEPTED SOLUTION

Accepted Solutions
embedtekin
Associate II

I solved the issue. The problem was that the PHY's registers, etc., were not fully reset. I connected the NRST pin of the PHY circuit to a GPIO, and now I trigger a reset once during initialization.

HAL_GPIO_WritePin(PHY_RST_GPIO_Port, PHY_RST_Pin, GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(PHY_RST_GPIO_Port, PHY_RST_Pin, GPIO_PIN_SET);

View solution in original post

3 REPLIES 3
Imen.D
ST Employee

Hello @embedtekin ,

Make sure to proper reinitialization after reboot. So, reinitialize System Clock, Ethernet Peripheral (using the HAL_ETH_Init) and reinitialize lwIP stack.

Maybe this issue is caused by one interrupt from the previous execution that remains pending in the NVIC. So, make sure to clear any pending interrupts in the NVIC to avoid spurious interrupts after reboot.

When your question is answered, please close this topic by clicking "Accept as Solution".
Thanks
Imen

Since it returns to the main function, the things you mentioned get reinitialized. Am I thinking incorrectly? It seems like there's no deinit function for lwIP. However, I deinitialize many things related to Ethernet before the reboot. Since it returns to the main function, they get initialized again. It already works fine the first time. If I couldn't reinitialize properly, it wouldn't work the first time either, I think

embedtekin
Associate II

I solved the issue. The problem was that the PHY's registers, etc., were not fully reset. I connected the NRST pin of the PHY circuit to a GPIO, and now I trigger a reset once during initialization.

HAL_GPIO_WritePin(PHY_RST_GPIO_Port, PHY_RST_Pin, GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(PHY_RST_GPIO_Port, PHY_RST_Pin, GPIO_PIN_SET);