Forum: Mikrocontroller und Digitale Elektronik STM32 HAL Cube Timer interrupt -> kein Interrupt


von A. F. (elagil)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich möchte einen einfachen Aufruf einer Interruptroutine aus einem Timer 
mit PWM haben.

Dazu erzeuge ich den meisten Code mit CubeMX.
1
int main(void)
2
{
3
// ...
4
  HAL_Init();
5
  SystemClock_Config();
6
  MX_TIM3_Init();
7
  MX_NVIC_Init();
8
9
  HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_3);
10
// ...
11
}

Der PWM-Ausgang des Timers, direkt auf einen Ausgangspin gelegt, zeigt 
meine gewünschte Schaltfunktion. Wenn ich im globalen Interrupt aber 
einen Pin schalte, passiert nichts. Der Interrupt wird nicht ausgelöst.

In NVIC_Init() steht u.a.:
1
  HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
2
  HAL_NVIC_EnableIRQ(TIM3_IRQn);

Im Interrupt-Aufruf steht:
1
void TIM3_IRQHandler(void)
2
{
3
  HAL_GPIO_TogglePin(LD_0_GPIO_Port, LD_0_Pin);
4
5
  HAL_TIM_IRQHandler(&htim3);
6
}

Was könnte hier falsch sein? Im Anhang noch die Initialisierung von 
Timer 3.

Vielen Dank!

: Bearbeitet durch User
von Christian K. (the_kirsch)


Lesenswert?

ich benutze Cube nicht, aber der Code hier geht:

timer4.h:
1
#ifndef STM32F4_TIMER4_H
2
#define STM32F4_TIMER4_H
3
4
void timer4_init(void);
5
void timer4_enableInt(void);
6
7
//WEAK
8
void timer4_1sec_event1(void);
9
10
#endif /* STM32F4_TIMER4_H */

timer4.c:
1
#include <CMSIS_Device/stm32f4xx.h>
2
3
#include "timer4.h"
4
5
void TIM4_IRQHandler(void);
6
7
void TIM4_IRQHandler(void) {
8
  static int i = 0;
9
  if (TIM4->SR & TIM_SR_UIF) {
10
    i++;
11
    if (i == 125) {
12
      timer4_1sec_event1();
13
      i = 0;
14
    }
15
    TIM4->SR = ~TIM_SR_UIF;
16
  }
17
}
18
19
void timer4_init(void) {
20
  /*
21
   * GP 16-Bit Timer
22
   */
23
24
  RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
25
26
  TIM4->PSC = 840 - 1; // 84 MHz / (840) = 100 KHz
27
  TIM4->ARR = 800 - 1; // 100 KHz / (800) = 125 Hz
28
  TIM4->EGR = TIM_EGR_UG; // Generate an update event to reload the Prescaler
29
30
  TIM4->CR1 = TIM_CR1_CEN; // Edge-aligned mode; upcounter; TIM enable
31
  //TIM4->CR2;
32
  //TIM4->SMCR;
33
  //TIM4->DIER = TIM_DIER_UIE; // Enable the TIM Update interrupt
34
  //TIM4->SR;
35
  //TIM4->CCMR1;
36
  //TIM4->CCMR2;
37
  //TIM4->CCER;
38
  //TIM4->CNT;
39
  //TIM4->RCR;
40
  //TIM4->CCR1;
41
  //TIM4->CCR2;
42
  //TIM4->CCR3;
43
  //TIM4->CCR4;
44
  //TIM4->BDTR;
45
  //TIM4->DCR;
46
  //TIM4->DMAR;
47
  //TIM4->OR;
48
49
  NVIC_SetPriority(TIM4_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 6, 0));
50
  NVIC_EnableIRQ(TIM4_IRQn);
51
}
52
53
void timer4_enableInt(void) {
54
  TIM4->DIER = TIM_DIER_UIE; // Enable the TIM Update interrupt
55
}
56
57
void __attribute__ ((weak)) timer4_1sec_event1(void) {
58
}

von Christian K. (the_kirsch)


Lesenswert?

Bei dir fehlt wohl das Cube äquivalent zu dieser Zeile:


RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;

: Bearbeitet durch User
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.