I wrote an article on STM Timers trthat includes an example of One-Shot node. · https://jaxcoder.com/Post/Index?guid=456f6a89-1a93-4a72-bab9-4cf3a9e7f9b6  · To get more than one pulse you se the TIMn->RCR (Repeat) To whatever value you need,. · PartsBin - An Electronic Parts Organizer for Windows @ JaxCoder.com Answer from MHank.1 on community.st.com
🌐
ControllersTech®
controllerstech.com › home › stm32 tutorials › stm32 timers series › stm32 timers (part 9): one pulse mode (opm) – generate precise triggered pulses with delay and width control
STM32 Timers (Part 9): One Pulse Mode (OPM) – Generate Precise Triggered Pulses with Delay and Width Control
March 23, 2026 - This is where STM32 One Pulse Mode (OPM) becomes extremely powerful. In this mode, the timer waits for a trigger event and then generates a single pulse with programmable delay and pulse width, after which it automatically stops.
Discussions

microcontroller - Unable to initialize STM32 timer in one pulse mode with ST HAL - Electrical Engineering Stack Exchange
I use an STM32F401C discovery board with STM32F401VCT6 microcontroller and want to set up a timer in one pulse mode, generating an interrupt after elapsed period. More on electronics.stackexchange.com
🌐 electronics.stackexchange.com
stm32f4discovery - How trigge stm32 one pulse mode timer internally - Stack Overflow
I've used the stm32 one pule mode timer to generate pulse train. one pulse mode generate the pulse train in response of a extranl event originally, but i want to know that is there anyway to trigge... More on stackoverflow.com
🌐 stackoverflow.com
STM32 Start ADC with timer in one-pulse mode - Electrical Engineering Stack Exchange
I need to start an ADC reading with a fixed delay in different places in my code. It should be done with a timer and once an update event (overflow) is generated, the timer should be stopped and re... More on electronics.stackexchange.com
🌐 electronics.stackexchange.com
February 6, 2023
stm32cubemx - How to generate single pulse with STM32 timer - Electrical Engineering Stack Exchange
The same timer configuration should work on STM32C0. Of course, you must select the GPIO corresponding to your timer. I've used TIM2_CH2 on PB3. If you use timers with "break" capability, such as Advanced timer (TIM1, TIM8, etc.), you must also enable the outputs globally using the LL_TIM_EnableAllOutputs() function - this applies in general, not just for one-pulse mode... More on electronics.stackexchange.com
🌐 electronics.stackexchange.com
December 3, 2025
People also ask

Does Retriggerable One Pulse Mode work on all STM32 timers?
No. Retriggerable OPM is only available on certain advanced timers (like TIM1/TIM8 on specific STM32 series). Always check the reference manual of your MCU to confirm support.
🌐
controllerstech.com
controllerstech.com › home › stm32 tutorials › stm32 timers series › stm32 timers (part 9): one pulse mode (opm) – generate precise triggered pulses with delay and width control
STM32 Timers (Part 9): One Pulse Mode (OPM) – Generate Precise ...
Can One Pulse Mode work without an external trigger?
Yes. You can start One Pulse Mode using software by generating a trigger event internally (e.g., setting the CEN bit or using a software trigger), but external trigger mode is typically used for precise event-based control.
🌐
controllerstech.com
controllerstech.com › home › stm32 tutorials › stm32 timers series › stm32 timers (part 9): one pulse mode (opm) – generate precise triggered pulses with delay and width control
STM32 Timers (Part 9): One Pulse Mode (OPM) – Generate Precise ...
Can One Pulse Mode be combined with DMA or interrupts?
Yes. You can enable update or capture/compare interrupts for monitoring events, and DMA can be used in more advanced setups, although OPM itself operates fully in hardware without requiring CPU intervention.
🌐
controllerstech.com
controllerstech.com › home › stm32 tutorials › stm32 timers series › stm32 timers (part 9): one pulse mode (opm) – generate precise triggered pulses with delay and width control
STM32 Timers (Part 9): One Pulse Mode (OPM) – Generate Precise ...
🌐
EmbeddedExpertIO
blog.embeddedexpert.io
STM32 Timers Applications: One Pulse Mode – EmbeddedExpertIO
One Pulse Mode (OPM) in STM32 timers is a specialized operating configuration in which the timer generates a single output pulse in response to a defined trigger event and then automatically halts its counter operation. Unlike continuous PWM or periodic output modes, OPM is designed for ...
Top answer
1 of 2
1

I have finally figured out, what was missing in my code.

Apart from HAL_TIM_OnePulse_Start_IT(), also HAL_TIM_Base_Start() has to be called in order to set up the timer operation in one pulse mode.

Now my main function looks like below and the interrupt is fired when after the set time.

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_TIM10_Init();

  HAL_TIM_Base_Start(&htim10);
  HAL_TIM_OnePulse_Start_IT(&htim10, TIM_CHANNEL_1);

  while (1)
  {

  }
}
2 of 2
0

You haven't shown us all the code. For example, where is the Timer and GPIO peripherals enabled? And where is the Timer interrupt enabled?

Typically with STM32Cube HAL applications, the functions like HAL_TIM_Base_Init() call another function like HAL_TIM_Base_MspInit(), which you may have to provide an implementation for. The xxx_MspInit() functions are typically implemented in a file called stm32xxxx_hal_msp.c. ST provides a template for this file with the HAL but I believe the expectation is that you will copy the template to your project file and customize it. (I'm not familiar with the STM32CubeMX tool, which might do some of this automatically.)

Typically within HAL_TIM_Base_MspInit() in stm32xxxx_hal_msp.c is where you will enable the timer and the timer interrupt. That code will look something like this:

    // Enable the peripheral clock.
    __HAL_RCC_TIM10_CLK_ENABLE();

    // NVIC configuration for the TIM10 interrupt.
    HAL_NVIC_SetPriority(TIM10_IRQn, 3, 0);
    HAL_NVIC_EnableIRQ(TIM10_IRQn);

Then you also need to provide an implementation for the timer interrupt handler. Typically this is done in a file called stm32xxxx_it.c. This is another file provided as a template with the HAL but you're expected to customize it in your project directory. (And again, STM32CubeMX may do some of this automatically.)

/**
* @brief  This function handles TIM10_IRQHandler interrupt request.
* @param  None
* @retval None
*/
void TIM10_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&htim10);
}

It's HAL_TIM_IRQHandler() which then calls your HAL_TIM_PeriodElapsedCallback() function.

So make sure you've enabled the timer and the timer interrupt in HAL_TIM_Base_MspInit(). Then make sure you've provided an implementation for TIM10_IRQHandler() which calls HAL_TIM_IRQHandler(). Then use the debugger to step through the code. Set breakpoints in HAL_TIM_Base_MspInit() and TIM10_IRQHandler() and HAL_TIM_PeriodElapsedCallback() to figure out what is working and what is not working.

🌐
Blogger
arm-stm.blogspot.com › 2015 › 12 › stm32-timer-one-pulse-mode.html
ARM Cortex STM32: STM32 Timer One Pulse Mode
December 27, 2015 - 3. Select the one pulse mode by setting the OPM bit in CR1 register, if only one pulse is to be generated. Otherwise this bit should be reset. Delay = CCRy/(TIMx_CLK/(PSC + 1)) Pulse-Length = (ARR - CCRy)/(TIMx_CLK/(PSC + 1)) For more details ...
🌐
Stack Overflow
stackoverflow.com › questions › 75882402 › how-trigge-stm32-one-pulse-mode-timer-internally
stm32f4discovery - How trigge stm32 one pulse mode timer internally - Stack Overflow
... You have to explain what "internally" means in this context. What "external" is then. Yes, you can enable one pulse mode by setting a special OPM bit in timer control register.
Find elsewhere
🌐
STMicroelectronics Community
community.st.com › t5 › stm32-mcus-products › help-with-timer-in-retriggerable-one-pulse-mode › td-p › 130291
Solved: Help with timer in retriggerable one pulse mode - STMicroelectronics Community
March 10, 2022 - I am using the STM32L4S9AII6 clocked at 120MHz. I am trying to configure a simple (to me it should be simple) retriggerable one pulse mode timer. I was able to configure TIM6 in one-shot mode, but I had the following issues: The timer was not retriggerable MxCube did not allow me to eliminate the ...
🌐
YouTube
youtube.com › watch
STM32 Timers (Part 9): One Pulse Mode (OPM) – Generate Precise Triggered Pulses - YouTube
Learn how to configure STM32 Timer One Pulse Mode (OPM) to generate single, multiple, and retriggerable pulses using external triggers with CubeMX and HAL.🔨...
Published   March 4, 2023
🌐
7-Zip Documentation
documentation.help › STM32F0xx › TIM_One_Pulse.html
STM32F0xx Standard Peripherals Firmware Library: TIM One Pulse example - STM32F0xx Standard Peripherals Library Documentation
The (TIM_Period - TIM_Pulse) defines the One Pulse value, the pulse value is fixed to: One Pulse value = (TIM_Period - TIM_Pulse)/TIM2 counter clock = (65535 - 16383) / 24000000 = 2.04 ms. ... The "system_stm32f0xx.c" is generated by an automatic clock configuration tool and can be easily ...
🌐
Compile N Run
compilenrun.com › stm32 tutorial › stm32 timers › stm32 one-pulse mode
STM32 One-Pulse Mode | Compile N Run
The STM32 microcontroller family offers a variety of timer peripherals with advanced features for precise timing control. One of these features is the One-Pulse Mode (OPM), which allows you to generate a single, precisely timed pulse when triggered.
Top answer
1 of 1
1

Example code in LL drivers can be following (code tested on STM32G031K8). The same timer configuration should work on STM32C0. Of course, you must select the GPIO corresponding to your timer. I've used TIM2_CH2 on PB3. If you use timers with "break" capability, such as Advanced timer (TIM1, TIM8, etc.), you must also enable the outputs globally using the LL_TIM_EnableAllOutputs() function - this applies in general, not just for one-pulse mode. By the way, advanced timers have a "repetition counter" feature that allows you to generate a single burst of pulses. Alternatively, pulses can be triggered by various internal or external signals, not just software.

The timing is as follows:

You start the timer using the LL_TIM_EnableCounter() function. It counts until it reaches the CompareValue (CCRx register) value, then sets the output to level H. It then continues counting until it reaches the Autoreload value, at which point it sets the output back to L and turns off. CompareValue must be greater than 0 and less than Autoreload.

LL_TIM_InitTypeDef TIM_InitStruct = {0};
LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

// Enable clocks to peripherals
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM2);
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB);

// Set GPIO (timer output)
// PB3   ------> TIM2_CH2
GPIO_InitStruct.Pin = LL_GPIO_PIN_3;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_2;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

// set time base (and pulse length)
TIM_InitStruct.Prescaler = 15; // 1 MHZ for timer (CPU clock 16MHZ there)
TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
TIM_InitStruct.Autoreload = 1000; // Pulse width (1000 + 1 - Compare Value)
TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
LL_TIM_Init(TIM2, &TIM_InitStruct);

// Set "PWM" mode
TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM2; // righ aligned PWM
TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_ENABLE; // Enable timer output
TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE; // irrelevant
TIM_OC_InitStruct.CompareValue = 1; // minimum value 1 (pulse "delay" from trigger)
TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_HIGH;
LL_TIM_OC_Init(TIM2, LL_TIM_CHANNEL_CH2, &TIM_OC_InitStruct);

// Enable one pulse mode
LL_TIM_SetOnePulseMode(TIM2, LL_TIM_ONEPULSEMODE_SINGLE);

// Enabling timer start pulse generation (call when you need to generate pulse)
LL_TIM_EnableCounter(TIM2);
🌐
STMicroelectronics Community
community.st.com › t5 › stm32-mcus-products › timer-1-retriggerable-one-pulse-mode › td-p › 768614
Solved: Timer 1 Retriggerable One-Pulse Mode - STMicroelectronics Community
February 3, 2025 - Hi, I want to do something extremely basic. Trigger a pulse using software for Timer 1 which is configured in Retriggerable One-Pulse Mode. Background: I can do the above if the Timer 1 is in normal One-Pulse mode. By simply Writing the CEN bit in TIM1->CR1. Now, as soon as n set me registers...
🌐
Hackster.io
hackster.io › theembeddedthings › stm32-timer-control-opm-pwm-capture-ac84a7
STM32 Timer Control: OPM, PWM, & Capture - Hackster.io
August 24, 2025 - It demonstrates generating a single ... of STM32 timers. In One-Pulse Mode (OPM), the timer generates a single PWM pulse with a precise duration upon a software or hardware trigger....
🌐
DeepBlue
deepbluembedded.com › home › blog › stm32 timers tutorial | hardware timers explained
STM32 Timers Explained Tutorial - Timer Modes Examples Interrupts pwm
January 20, 2024 - For control and monitoring purposes, the timer has also timing measure capabilities and links to built-in ADC and DAC converters. Last, it features a light-load management mode and is able to handle various fault schemes for safe shut-down purposes. ... High-resolution timing units – 217 ps resolution, compensated against voltage and temperature variations – High-resolution available on all outputs, possibility to adjust duty-cycle, frequency and pulse width in the triggered one-pulse mode – 6 16-bit timing units (each one with an independent counter and 4 compare units) – 10 outputs that can be controlled by any timing unit, up to 32 set/reset sources per channel – Modular architecture to address either multiple independent converters with 1 or 2 switches or few large multi-switch topologies
🌐
STMicroelectronics Community
community.st.com › t5 › stm32-mcus-products › general-purpose-timers-what-are-the-options-for-one-pulse-slave › td-p › 112108
General Purpose Timers: what are the options for One-Pulse slave mode trigger?
September 15, 2022 - I am using STM32H7 General Purpose Timers TIM2, TIM3, TIM4, TIM5 and their respective external trigger ETR using combined RESET and TRIGGER modes and I am configuring and starting Channel4 for each to generate One-Pulse output .
🌐
STMicroelectronics Community
community.st.com › t5 › stm32-mcus-products › starting-timers-in-one-pulse-mode › td-p › 285440
Solved: Starting timers in one pulse mode - STMicroelectronics Community
April 27, 2020 - You can do it by software, or by hardware through the slave-mode controller, setting it to Trigger mode (in TIMx_SMCR.SMS). Source of this trigger may be external - one of channels 1 or 2, or ETR pin - or internal - another timer - see TIMx_SMCR.TS. ... Thank you for the answer! Will study :) ... ... Retrigger phase-shifted one pulse PWMs in master-slave setup in STM32 MCUs Embedded software 2025-12-11
🌐
Reddit
reddit.com › r/stm32 › getting complete one pulse functionality working with the hal drivers...
r/stm32 on Reddit: Getting complete One Pulse functionality working with the HAL drivers...
November 27, 2019 -

The HAL driver and STM32CubeIDE/STM32CubeMX are somewhat restricted in terms of allowing the full use of the One Pulse feature for the TIMx timers.

I noticed a few others (https://www.reddit.com/r/stm32/comments/dn3r9i/need_help_getting_onepulse_to_work_with_the_hal/) and (https://community.st.com/s/question/0D50X00009XkgopSAB/stm32cube-tim-onepulsepwmoc-configuration-issue) who had similar issues to me regarding the One Pulse TIMx features using the HAL and thought I'd write this up quickly to show what I did to get things working with the HAL.

Hopefully it helps someone, took me a few days to figure this all out.

I was trying to have TIM4 trigger TIM2 and couldn't get it working with the HAL. Turns out I had to modify some of the HAL functions since they are basically setup to ONLY work with channels 1 and 2 of a given TIMx.

For instance, HAL_TIM_OnePulse_ConfigChannel() is setup to only work with TI1FP1 or TI2FP2 usage, meaning only when you have the TIM's CH1 trigger CH2 or CH2 trigger CH1.

This can be seen in the code below which is from HAL_TIM_OnePulse_ConfigChannel():

/* Select the Trigger source */
htim->Instance->SMCR &= ~TIM_SMCR_TS;
htim->Instance->SMCR |= TIM_TS_TI1FP1;

/* Select the Slave Mode */
htim->Instance->SMCR &= ~TIM_SMCR_SMS;
htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER;

So, if you call the HAL_TIM_SlaveConfigSynchro() function BEFORE you call HAL_TIM_OnePulse_ConfigChannel() then basically the trigger input / slave mode settings would be reset.

Another thing is the HAL_TIM_OnePulse_Start() function which ONLY starts TIMx channels 1 and 2, it will not start channels 3 or 4, and in fact always starts both of them under the assumption that you are using the HAL_TIM_OnePulse_ConfigChannel() function which itself assumes using the TI1FP1 or TI2FP2 triggers.

Without going on and on, this is how I modified the HAL to allow the use of the TIMx channels 1-4 in the One Pulse mode and an example.

I added these function prototypes in stm32h7xx_hal_tim.h:

HAL_StatusTypeDef HAL_TIM_OnePulse_StartChannel(TIM_HandleTypeDef *htim, uint32_t OutputChannel);
HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannelOutput(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, uint32_t OutputChannel);

HAL_TIM_OnePulse_StartChannel() starts each channel (channels 1 to 4) individually instead of HAL_TIM_OnePulse_Start() which only starts channels 1 and 2.

HAL_TIM_OnePulse_ConfigChannelOutput() configures each channel (channels 1 to 4) individually and does not 'reset' the slave mode and trigger settings like HAL_TIM_OnePulse_ConfigChannel() does.

In stm32h7xx_hal.tim.c I added the functions:

HAL_StatusTypeDef HAL_TIM_OnePulse_StartChannel(TIM_HandleTypeDef *htim, uint32_t OutputChannel)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(OutputChannel);

  TIM_CCxChannelCmd(htim->Instance, OutputChannel, TIM_CCx_ENABLE);

  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
  {
    /* Enable the main output */
    __HAL_TIM_MOE_ENABLE(htim);
  }

  /* Return function status */
  return HAL_OK;
}

HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannelOutput(TIM_HandleTypeDef *htim,  TIM_OnePulse_InitTypeDef *sConfig, uint32_t OutputChannel)
{
  TIM_OC_InitTypeDef temp1;

  /* Check the parameters */
  assert_param(IS_TIM_OPM_CHANNELS(OutputChannel));

  /* Process Locked */
  __HAL_LOCK(htim);

  htim->State = HAL_TIM_STATE_BUSY;

  /* Extract the Output compare configuration from sConfig structure */
  temp1.OCMode = sConfig->OCMode;
  temp1.Pulse = sConfig->Pulse;
  temp1.OCPolarity = sConfig->OCPolarity;
  temp1.OCNPolarity = sConfig->OCNPolarity;
  temp1.OCIdleState = sConfig->OCIdleState;
  temp1.OCNIdleState = sConfig->OCNIdleState;

  switch (OutputChannel)
  {
    case TIM_CHANNEL_1:
    {
  	  assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));

	  TIM_OC1_SetConfig(htim->Instance, &temp1);
	  break;
    }
    case TIM_CHANNEL_2:
    {
	  assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));

	  TIM_OC2_SetConfig(htim->Instance, &temp1);
	  break;
    }
    case TIM_CHANNEL_3:
    {
  	  assert_param(IS_TIM_CC3_INSTANCE(htim->Instance));

	  TIM_OC3_SetConfig(htim->Instance, &temp1);
	  break;
    }
    case TIM_CHANNEL_4:
    {
	  assert_param(IS_TIM_CC4_INSTANCE(htim->Instance));

	  TIM_OC4_SetConfig(htim->Instance, &temp1);
	  break;
    }
    default:
	  break;
  }

  htim->State = HAL_TIM_STATE_READY;

  __HAL_UNLOCK(htim);

  return HAL_OK;
}

As an example now, to configure TIM4 in One Pulse mode, triggered by TI2FP2, operating in master/slave mode with it's TRGO set to ENABLE, and having TIM2 in slave mode, triggered by TIM4, corresponding to ITR3, and enabling/starting channels 3 and 4 of TIM2 synchronously, etc:

static void MX_TIM4_Init(void)
{
  TIM_OnePulse_InitTypeDef sConfig = {0};
  TIM_SlaveConfigTypeDef sSlaveConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim4.Instance = TIM4;
  htim4.Init.Period            = 0xFFFF;
  htim4.Init.Prescaler         = 0;
  htim4.Init.ClockDivision     = 0;
  htim4.Init.CounterMode       = TIM_COUNTERMODE_UP;
  htim4.Init.RepetitionCounter = 0;

  if (HAL_TIM_OnePulse_Init(&htim4, TIM_OPMODE_SINGLE) != HAL_OK)
  {
    Error_Handler();
  }

  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER;
  sSlaveConfig.InputTrigger = TIM_TS_TI2FP2;
  sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING;
  sSlaveConfig.TriggerFilter = 0;
  
  if (HAL_TIM_SlaveConfigSynchro(&htim4, &sSlaveConfig) != HAL_OK)
  {
    Error_Handler();
  }
  
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
  
  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

  sConfig.OCMode       = TIM_OCMODE_PWM2;
  sConfig.OCPolarity   = TIM_OCPOLARITY_HIGH;
  sConfig.Pulse        = 1000;
  sConfig.ICPolarity   = TIM_ICPOLARITY_RISING;
  sConfig.ICSelection  = TIM_ICSELECTION_DIRECTTI;
  sConfig.ICFilter     = 0;
  sConfig.OCNPolarity  = TIM_OCNPOLARITY_HIGH;
  sConfig.OCIdleState  = TIM_OCIDLESTATE_RESET;
  sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;

  if (HAL_TIM_OnePulse_ConfigChannel(&htim4, &sConfig, TIM_CHANNEL_1, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }

  if (HAL_TIM_OnePulse_StartChannel(&htim4, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
}

static void MX_TIM2_Init(void)
{
  TIM_OnePulse_InitTypeDef sConfig = {0};
  TIM_SlaveConfigTypeDef sSlaveConfig = {0};

  htim2.Instance = TIM2;
  htim2.Init.Period            = 0xFFFF;
  htim2.Init.Prescaler         = 0;
  htim2.Init.ClockDivision     = 0;
  htim2.Init.CounterMode       = TIM_COUNTERMODE_UP;
  htim2.Init.RepetitionCounter = 0;

  if (HAL_TIM_OnePulse_Init(&htim2, TIM_OPMODE_SINGLE) != HAL_OK)
  {
    Error_Handler();
  }

  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER;
  sSlaveConfig.InputTrigger = TIM_TS_ITR3;

  if (HAL_TIM_SlaveConfigSynchro(&htim2, &sSlaveConfig) != HAL_OK)
  {
    Error_Handler();
  }

  sConfig.OCMode       = TIM_OCMODE_PWM2;
  sConfig.OCPolarity   = TIM_OCPOLARITY_HIGH;
  sConfig.Pulse        = 1000;
  sConfig.ICPolarity   = TIM_ICPOLARITY_RISING;
  sConfig.ICSelection  = TIM_ICSELECTION_DIRECTTI;
  sConfig.ICFilter     = 0;
  sConfig.OCNPolarity  = TIM_OCNPOLARITY_HIGH;
  sConfig.OCIdleState  = TIM_OCIDLESTATE_RESET;
  sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  
  if (HAL_TIM_OnePulse_ConfigChannelOutput(&htim2, &sConfig, TIM_CHANNEL_3) != HAL_OK)
  {
    Error_Handler();
  }
  
  sConfig.Pulse        = 2000;
  
  if (HAL_TIM_OnePulse_ConfigChannelOutput(&htim2, &sConfig, TIM_CHANNEL_4) != HAL_OK)
  {
    Error_Handler();
  }

  if (HAL_TIM_OnePulse_StartChannel(&htim2, TIM_CHANNEL_3) != HAL_OK)
  {
    Error_Handler();
  }

  if (HAL_TIM_OnePulse_StartChannel(&htim2, TIM_CHANNEL_4) != HAL_OK)
  {
    Error_Handler();
  }
}

EDIT: I actually just used the above to have TIM1 trigger 6 other timers (7 total timers synchronized) as so:

TIM1 (using TI2FP2, PE11 (INPUT)) triggers:
TIM1, CH1, E9 (OUTPUT), using TI2FP2 (TIM1, CH2)
TIM2, CH4, PB11 (OUTPUT), using ITR0 (TIM1)
TIM3, CH3, PB0 (OUTPUT), using ITR0 (TIM1)
TIM4, CH1, PD12 (OUTPUT), using ITR0 (TIM1)
TIM5, CH1, PA0 (OUTPUT), using ITR0 (TIM1)
TIM8, CH2, PC7 (OUTPUT), using ITR0 (TIM1)
TIM15, CH2, PE6 (OUTPUT), using ITR0 (TIM1)

All operating in One Pulse mode.

Here is an image showing the pulses from a Saleae Logic 16: https://imgur.com/a/lsbKAtg (The pulses look the same because I have them all the same for testing purposes, I will soon be implementing CDC USB to allow for configuration of each of the timers through VCP)