2020-06-18 04:51 AM
Hi all, I moved a code that was working on STM32F427VI and somehow I am facing a new issue that I have never see before.
My code works in debug and release when the unit is compiled from Visual Studio and the Ethernet cable is connected or disconnected. But, after I reset the unit (power off/power on) the unit is working when the ethernet cable is connected. If the cable is disconnected go over the while true inside HardFault_Handler. I think that the problem is on that function:
bool configureNetwork(network_config& netconfig)
{
struct ip4_addr ipaddr;
struct ip4_addr netmask;
struct ip4_addr gw;
struct ip4_addr dns;
network_config::setIPAddr(&ipaddr, netconfig.ip);
network_config::setIPAddr(&netmask, netconfig.mask);
network_config::setIPAddr(&gw, netconfig.gateway);
network_config::setIPAddr(&dns, netconfig.dns);
if (gnetStarted) {
handleDHCP(netconfig.isDynamic());
if (curDynamic == false) {
netif_set_addr(&gnetif, &ipaddr, &netmask, &gw);
dns_setserver(0, &dns);
}
}
else {
STARTUP_TRACE.Write("before: netif_add\r\n", 1000);
netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input);
STARTUP_TRACE.Write("after: netif_add\r\n", 1000);
/* Registers the default network interface */
netif_set_default(&gnetif);
netif_set_status_callback(&gnetif, netstatus_callback);
if (netif_is_link_up(&gnetif))
{
/* When the netif is fully configured this function must be called */
netif_set_up(&gnetif);
}
else
{
/* When the netif link is down this function must be called */
netif_set_down(&gnetif);
}
handleDHCP(netconfig.isDynamic());
if (curDynamic == false) {
dns_setserver(0, &dns);
}
netif_set_link_callback(&gnetif, ethernetif_update_config);
gnetStarted = true;
sys_timeout(LINK_CHECK_INTERVAL, second_timeout, NULL);
}
return true;
}
I have this conclusion becasue when I remark this function, the hardFaultHandler is called even when the unit is in debug on visual studio. So the result is the same.
I don't understand what is the difference when the mcu is conencted to the debugger and why the handler is called when the cable is disconnected. I have this issues on the Ethernet for the first time.
Any idea?
2020-06-18 05:48 AM
Attach a debugger and see where the code is getting stuck. Instrument the hard fault handler to give information about the error state.
2020-06-18 08:52 AM
The code reachs here
extern "C" void HardFault_Handler(void)
{
/* USER CODE BEGIN HardFault_IRQn 0 */
/* USER CODE END HardFault_IRQn 0 */
while (1)
{
/* USER CODE BEGIN W1_HardFault_IRQn 0 */
STARTUP_TRACE.Write("HardFault_Handler:stm32f4xx_it\r\n", 1000);
/* USER CODE END W1_HardFault_IRQn 0 */
}
}
I think that I have a problem when I set the lwip interface as dynamic (DHCP_ and the IP = 0 (when the IP is loaded from flash from previous runniung).
In this case the ðernet_input is not init in the correct mode and then I got an error here: err = netif->input(p, netif); becasue it is null.
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;
}
}
2020-06-20 12:53 AM
ST has never had a working link detection code. If you're using RTOS, then your whole code is broken as it doesn't follow lwIP API rules. The same is true for ST's non-working HAL/Cube bloatware:
2020-06-20 11:49 PM
The same code works excellent on my previous ST MCU...
2020-06-20 11:56 PM
I got those messages when the cable is disconnected on DHCP
Assertion "netif is not up, old style port?" failed at line 727 in C:/Users/alex_s/STM32Cube/Repository/STM32Cube_FW_F4_V1.24.1/Middlewares/Third_Party/LwIP/src/core/ipv4/dhcp.c
Assertion "unknown dns_table entry state:" failed at line 1079 in C:/Users/alex_s/STM32Cube/Repository/STM32Cube_FW_F4_V1.24.1/Middlewares/Third_Party/LwIP/src/core/dns.c
2020-06-21 04:49 AM
I understand your point but I need to use DHCP and use the Ethernt on runtime, I can't reset the unti every time that it lose connection.
I changed this code:
if (hal_eth_init_status == HAL_OK)
{
netif->flags |= NETIF_FLAG_LINK_UP;
}
I just removed the IF because when the cable is disconnected the status is eqaul to timeout. The questions is if it is ok to always configure the link_up flag?
The code works now. I start the MCU with DHCP and the cable disconnected, then plug and unplug multipletimes and I see that the communication start/stop accordingly.