2024-10-10 05:39 AM
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();
}
Solved! Go to Solution.
2024-10-14 01:58 AM
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);
2024-10-10 07:10 AM - edited 2024-10-10 07:10 AM
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.
2024-10-13 11:58 PM
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
2024-10-14 01:58 AM
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);