Skip to main content
Visitor II
July 30, 2025
Question

TIM One Pulse Mode

  • July 30, 2025
  • 1 reply
  • 428 views

Hi all,

I'm trying to get one pulse mode working on the TIM1 of the STM32H755. The goal is taking a pulse from one pin as a trigger, starting the pulse, counting 32 clock cycles on another pin, and then resetting the output. This controllers tech tutorial is very close to what I'm trying to do, only he uses the internal clock. Regardless I haven't been able to get even that to work. I might be missing something but I haven't found anything in RM0399 to indicate that anything should be different. One weird thing is that TIM1_CH2 (the TI2FP2 pin) is pulling down the input, which is confirmed by there being a square wave when the wire is disconnected but it immediately vanishes when connected.  

I've attached the configuration function for TIM1 below, and in main I call  HAL_TIM_OnePulse_Start(&htim1, TIM_CHANNEL_1); right before the while loop.

static void MX_TIM1_Init(void)
{

 /* USER CODE BEGIN TIM1_Init 0 */

 /* USER CODE END TIM1_Init 0 */

 TIM_SlaveConfigTypeDef sSlaveConfig = {0};
 TIM_MasterConfigTypeDef sMasterConfig = {0};
 TIM_OC_InitTypeDef sConfigOC = {0};
 TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

 /* USER CODE BEGIN TIM1_Init 1 */

 /* USER CODE END TIM1_Init 1 */
 htim1.Instance = TIM1;
 htim1.Init.Prescaler = 64;
 htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
 htim1.Init.Period = 5000;
 htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 htim1.Init.RepetitionCounter = 0;
 htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
 if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_TIM_OC_Init(&htim1) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_TIM_OnePulse_Init(&htim1, 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(&htim1, &sSlaveConfig) != HAL_OK)
 {
 Error_Handler();
 }
 sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
 sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
 sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
 if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
 {
 Error_Handler();
 }
 sConfigOC.OCMode = TIM_OCMODE_PWM2;
 sConfigOC.Pulse = 10000;
 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
 sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
 sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
 sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
 sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
 if (HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
 {
 Error_Handler();
 }
 sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
 sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
 sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
 sBreakDeadTimeConfig.DeadTime = 0;
 sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
 sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
 sBreakDeadTimeConfig.BreakFilter = 0;
 sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;
 sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
 sBreakDeadTimeConfig.Break2Filter = 0;
 sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
 if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN TIM1_Init 2 */

 /* USER CODE END TIM1_Init 2 */
 HAL_TIM_MspPostInit(&htim1);

}

Keep in mind, I am not married to this approach at all, if there is an easier/simpler way to do this I will do that instead. I got relatively using a master timer (TIM2) to trigger a TRGO which would cause a slave timer (TIM3) to count 32 pulses, but that seems to be a dead end since I can't figure out how to make the timer send a TRGO on every incoming pulse. The only requirement is this being a primarily hardware solution, since this will eventually go on a relatively high frequency pulse (1khz)

Any guidance would be appreciated.

    This topic has been closed for replies.

    1 reply

    Super User
    July 31, 2025

    Read out and check/post content of TIM and relevant GPIO registers.

    The Cube/HAL function you are using based on its name may not do what you think it does. Cube/HAL is open source, read it. 

    JW

    noahyonrAuthor
    Visitor II
    July 31, 2025

    Since this is related to a pretty fast approaching deadline I ended up just using in code interrupts. It sucks sacrificing a core to this, so I'll probably come back to this issue later, and update this thread with a solution if I find one.