[STM32] Kein Update Interrupt im Timer PWM Mode

OP #6011269
Lesenswert?

Ich möchte bei einem STM32L433 den TIM16 für eine PWM konfigurieren, 
ohne direkt auf einen Ausgang zu gehen, sondern manuell im CompareMatch- 
und im Update-Interrupt meinen Code auszuführen.

Ich habe die Config für den Einstieg mit CubeMX erledigt und frage dann 
die entsprechenden IT-Bits in der IRQ ab. Zu Beginn der Main rufe ich
1
HAL_TIM_PWM_Start_IT(&htim16, TIM_CHANNEL_1);
 auf.
 Ich bekomme mit dem Code auch Compare Match Interrupts (wie gewünscht), 
allerdings treten keine Update-Interrupts auf. Kann mir jemand 
aufzeigen, wo ich entwas vergessen habe?

IRQ:
1
void TIM1_UP_TIM16_IRQHandler(void)
2
{
3
  /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 0 */
4
  
5
  if (__HAL_TIM_GET_FLAG(&htim16, TIM_FLAG_CC1) != RESET)
6
  {
7
    if (__HAL_TIM_GET_IT_SOURCE(&htim16, TIM_IT_CC1) != RESET)
8
    {
9
      // Do something
10
    }
11
  }
12
  
13
  if (__HAL_TIM_GET_FLAG(&htim16, TIM_FLAG_UPDATE) != RESET)
14
  {
15
    if (__HAL_TIM_GET_IT_SOURCE(&htim16, TIM_IT_UPDATE) != RESET)
16
    {
17
      // Do something else
18
    }
19
  }
20
  /* USER CODE END TIM1_UP_TIM16_IRQn 0 */
21

22
  HAL_TIM_IRQHandler(&htim16);
23

24
}

TIM16-Config aus Cube:
1
static void MX_TIM16_Init(void)
2
{
3
  TIM_OC_InitTypeDef sConfigOC = {0};
4
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
5

6
  htim16.Instance = TIM16;
7
  htim16.Init.Prescaler = 0;
8
  htim16.Init.CounterMode = TIM_COUNTERMODE_UP;
9
  htim16.Init.Period = 24000;  
10
  htim16.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
11
  htim16.Init.RepetitionCounter = 0;
12
  htim16.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
13
  if (HAL_TIM_Base_Init(&htim16) != HAL_OK)
14
  {
15
    Error_Handler();
16
  }
17
  if (HAL_TIM_PWM_Init(&htim16) != HAL_OK)
18
  {
19
    Error_Handler();
20
  }
21
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
22
  sConfigOC.Pulse = 12000; 
23
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
24
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
25
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
26
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
27
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
28
  if (HAL_TIM_PWM_ConfigChannel(&htim16, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
29
  {
30
    Error_Handler();
31
  }
32
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
33
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
34
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
35
  sBreakDeadTimeConfig.DeadTime = 0;
36
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
37
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
38
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
39
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim16, &sBreakDeadTimeConfig) != HAL_OK)
40
  {
41
    Error_Handler();
42
  }
43
}
Gast #6011555
Lesenswert?

A. D. schrieb:
> Wo ist das denn eine PWM-Config, wenn nur ein CompareMatch-Interrupt
> erzeugt wird aber kein Update-Interrupt?

Das ist eine Config für CubeMX-Benutzer, Informatiker, Physiker, etc. , 
die selber kein Datenblatt lesen - verstehen - und in Code umsetzen 
können.

Alle anderen nehmen sich das RefMan und implementieren und Debuggen in 
10 Minuten selber ohne in einem Forum zu fragen...

--> Soll heissen: wer es selber nicht kann, der soll auch nicht darüber 
maulen welche Einschränkungen der Anfänger-Lib hat :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren