Skip to main content
Associate
May 22, 2026
Question

PTP STM32F4 hardware timestamps not enabled

  • May 22, 2026
  • 3 replies
  • 75 views

I set ETH to be working on RMII_PTP_SYNCHRO, However HAL_ETH_USE_PTP is still not defined by default.

3 replies

Andrew Neil
Super User
May 22, 2026

Welcome to the forum.

Remember that we know nothing about you, or what you are using, or what you have done.

So you need to give more details - see:

How to write your question to maximize your chances to find a solution

A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
Associate
May 22, 2026

Hello, My goal is to use flexptp on STM32F429ZIT6 mcu following this implementation https://github.com/epagris/flexPTP#platforms-and-examples, 

Looking into cube mx configuration i noticed that there is a RMII_PTP_SYNCHRO mode for ETH IP which I did.

Now after some digging in the generated code i found that low_level_init function is lacking the HAL_ETH_INIT function as i will show now: 

static void low_level_init(struct netif *netif)
{
 HAL_StatusTypeDef hal_eth_init_status = HAL_OK;
 /* Start ETH HAL Init */
 
 /* End ETH HAL Init */

 /* Initialize the RX POOL */
 LWIP_MEMPOOL_INIT(RX_POOL);

#if LWIP_ARP || LWIP_ETHERNET

 /* set MAC hardware address length */
 netif->hwaddr_len = ETH_HWADDR_LEN;

 /* set MAC hardware address */
 netif->hwaddr[0] = heth.Init.MACAddr[0];
 netif->hwaddr[1] = heth.Init.MACAddr[1];
 netif->hwaddr[2] = heth.Init.MACAddr[2];
 netif->hwaddr[3] = heth.Init.MACAddr[3];
 netif->hwaddr[4] = heth.Init.MACAddr[4];
 netif->hwaddr[5] = heth.Init.MACAddr[5];

 /* maximum transfer unit */
 netif->mtu = ETH_MAX_PAYLOAD;

 /* Accept broadcast address and ARP traffic */
 /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */
 #if LWIP_ARP
 netif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
 #else
 netif->flags |= NETIF_FLAG_BROADCAST;
 #endif /* LWIP_ARP */

/* USER CODE BEGIN PHY_PRE_CONFIG */

/* USER CODE END PHY_PRE_CONFIG */
 /* Set PHY IO functions */
 LAN8742_RegisterBusIO(&LAN8742, &LAN8742_IOCtx);

 /* Initialize the LAN8742 ETH PHY */
 if(LAN8742_Init(&LAN8742) != LAN8742_STATUS_OK)
 {
 netif_set_link_down(netif);
 netif_set_down(netif);
 return;
 }

 if (hal_eth_init_status == HAL_OK)
 {
 /* Get link state */
 ethernet_link_check_state(netif);
 }
 else
 {
 Error_Handler();
 }
#endif /* LWIP_ARP || LWIP_ETHERNET */

/* USER CODE BEGIN LOW_LEVEL_INIT */

/* USER CODE END LOW_LEVEL_INIT */
}

Is this generated code lacking something ? if yes is it because i missed some steps when configuring it in CUbeMX ?

Pavel A.
Super User
May 22, 2026

@oussamajlassi This low_level_init() function only deals with things related to LwIP. 

IEEE‑1588 PTP timestamps should be enabled somewhere in ETH_init, or maybe in the USER CODE section (between lines 60-62).

See also https://community.st.com/t5/stm32-mcus-embedded-software/stm32h573zi-rmii-ptp-synchro/td-p/726875