Forum: Mikrocontroller und Digitale Elektronik [STM32] Kein Update Interrupt im Timer PWM Mode


von A. D. (egsler)


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
}

von Mike R. (thesealion)


Lesenswert?

Auf den ersten Blick würde ich behaupten die HAL sieht das nicht vor.

Du wirst also den entsprechenden Update Interrupt selber aktivieren 
müssen.
1
/* Enable the TIM Update interrupt */
2
__HAL_TIM_ENABLE_IT(&htim16, TIM_IT_UPDATE);

von A. D. (egsler)


Lesenswert?

Ach was, so klappts wirklich.
Wo ist das denn eine PWM-Config, wenn nur ein CompareMatch-Interrupt 
erzeugt wird aber kein Update-Interrupt?

von Dennis (Gast)


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 :-)

von pegel (Gast)


Lesenswert?

Mike R. schrieb:
> Auf den ersten Blick

Genau, auf den Ersten.

Deshalb schaue ich auch zwei mal hin, bevor ich den Fehler bei anderen 
vermute.

In diesem Fall:

HAL_TIM_Base_Start_IT

veranlasst alles Nötige.

von Mike R. (thesealion)


Lesenswert?

pegel schrieb:
> In diesem Fall:
>
1
> HAL_TIM_Base_Start_IT
2
>
>
> veranlasst alles Nötige.

Dann wird aber der CompareMatch Interrupt nicht aktiviert, den gibt es 
nur bei
1
HAL_TIM_PWM_Start_IT()

von pegel (Gast)


Lesenswert?

Sind verschiedene Dinge. Also beide nehmen.

So wie in den Beispielen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.