Configure timer in slave_triger mode, ETRF pin as a trigger. OnePulse PWM. There 'd be latency about 20-30 nsec - so it's minimum delay, resolution 2 nsec. No interrupt, all in hardware
Example of code I have for stm32G474re:
static void tim3_config(void)
{
TIM_HandleTypeDef htim234;
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
TIM_SlaveConfigTypeDef sSlaveConfig = {0};
__HAL_RCC_TIM3_CLK_ENABLE();
htim234.Instance = TIM3;
htim234.Init.Prescaler = 0;
htim234.Init.CounterMode = TIM_COUNTERMODE_UP;
htim234.Init.Period = 352;
htim234.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim234.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
HAL_TIM_Base_Init(&htim234);
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
HAL_TIM_ConfigClockSource(&htim234, &sClockSourceConfig);
HAL_TIM_PWM_Init(&htim234);
HAL_TIM_OnePulse_Init(&htim234, TIM_OPMODE_SINGLE);
sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER;
sSlaveConfig.InputTrigger = TIM_TS_ETRF;
sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_INVERTED;
sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;
sSlaveConfig.TriggerFilter = 0;
HAL_TIM_SlaveConfigSynchro(&htim234, &sSlaveConfig);
sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC4REF; // TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim234, &sMasterConfig);
sConfigOC.OCMode = TIM_OCMODE_PWM2;
sConfigOC.Pulse = 1;
sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim234, &sConfigOC, TIM_CHANNEL_4);
HAL_TIM_Base_Start(&htim234);
HAL_TIM_PWM_Start(&htim234, TIM_CHANNEL_4);
}