cancel
Showing results for 
Search instead for 
Did you mean: 

STM32 PWM 2 phase

HA.5
Associate III

i have a question my friends, i did PWM for 2 Phase, it works correct and good, but after i stop my Timer Master and Slave in order to have Delay, i mean with HAL_ TIM_PWM_STOP, doesn't work my timer slave any more, can you help me about that?

Here are my codes, and my Tim3 works only one time and not permanently.

HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);

HAL_TIM_OC_Start(&htim2, TIM_CHANNEL_4);

HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);

HAL_Delay(200);

HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_3);

HAL_TIM_OC_Stop(&htim2, TIM_CHANNEL_4);

HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_2);

HAL_Delay(200);

5 REPLIES 5

Read out and check/compare TIM registers before the first start and before the second start.

You may be better off not using Cube/HAL in this case, as Cube's authors probably did not anticipate your mode of usage.

JW

Thanks for your answer, here are my Timer functions, what do yo mean exactly should i check here?

static void MX_TIM2_Init(void)

{

 TIM_MasterConfigTypeDef sMasterConfig = {0};

 TIM_OC_InitTypeDef sConfigOC = {0};

 htim2.Instance = TIM2;

 htim2.Init.Prescaler = 0;

 htim2.Init.CounterMode = TIM_COUNTERMODE_UP;

 htim2.Init.Period = 8000;

 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

 htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

 if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)

 {

   Error_Handler();

 }

 if (HAL_TIM_OC_Init(&htim2) != HAL_OK)

 {

   Error_Handler();

 }

 sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC4REF;

 sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

 if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)

 {

   Error_Handler();

 }

 sConfigOC.OCMode = TIM_OCMODE_PWM1;

 sConfigOC.Pulse = 4000;

 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

 sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

 if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)

 {

   Error_Handler();

 }

 sConfigOC.OCMode = TIM_OCMODE_ACTIVE;

 sConfigOC.Pulse = 2000;

 if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)

 {

   Error_Handler();

 }

 HAL_TIM_MspPostInit(&htim2);

}

static void MX_TIM3_Init(void)

{

 TIM_SlaveConfigTypeDef sSlaveConfig = {0};

 TIM_MasterConfigTypeDef sMasterConfig = {0};

 TIM_OC_InitTypeDef sConfigOC = {0};

 htim3.Instance = TIM3;

 htim3.Init.Prescaler = 0;

 htim3.Init.CounterMode = TIM_COUNTERMODE_UP;

 htim3.Init.Period = 8000;

 htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

 htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

 if (HAL_TIM_Base_Init(&htim3) != HAL_OK)

 {

   Error_Handler();

 }

 if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)

 {

   Error_Handler();

 }

 sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER;

 sSlaveConfig.InputTrigger = TIM_TS_ITR1;

 if (HAL_TIM_SlaveConfigSynchro(&htim3, &sSlaveConfig) != HAL_OK)

 {

   Error_Handler();

 }

 sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

 sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

 if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)

 {

   Error_Handler();

 }

 sConfigOC.OCMode = TIM_OCMODE_PWM1;

 sConfigOC.Pulse = 4000;

 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

 sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

 if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)

 {

   Error_Handler();

 }

 HAL_TIM_MspPostInit(&htim3);

}

I mean, in debugger, read out the timers registers content, and compare working/non-working cases.

Then check the differences against the registers description in Reference Manual.

Cube/HAL is good only to the point when it works out of the box. Anything unusual means to go through the "hard" way, i.e. reading the manual and actually understanding what the individual functions do.

Or, maybe somebody who is versed in Cube/HAL will chime in with an easy solution.

JW

Joe WILLIAMS
ST Employee

Hi Ha.5

Your question has been routed to the online support team. A case has been created and you'll be contacted shortly.

Kind Regards

Joe WILLIAMS

STMicro Support

Hi Joe,

Thank you very much, i am waiting for that, because even when i use interrupt and not delay, i still have this problem and i don't understand it why!

Best Regards

HA