Forum: Mikrocontroller und Digitale Elektronik Probleme mit STM32 Timer-Interrupt


von Jens K. (mister232)


Lesenswert?

Hallo Leute,

habe mal eine Frage. Ich habe ein ganz einfach Programm auf meinem 
STM32VL-Discovery, mit welchem ich mich ein wenig an den Timer 
anfreunden wollte. Ich habe den Timer und den GPIO-Pin für die grüne LED 
wie folgt initialisiert.
1
  // Activate clock for timer 2
2
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
3
  GPIO_InitTypeDef GPIO_InitStructure;
4
5
  // Enable clock for Port C
6
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
7
8
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;
9
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
10
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
11
  GPIO_Init(GPIOC, &GPIO_InitStructure);
12
13
  // Configure timer 2
14
  TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStructure;
15
  TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
16
  TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
17
  TIM_TimeBase_InitStructure.TIM_Period = 2400;
18
  TIM_TimeBase_InitStructure.TIM_Prescaler = 10000;
19
  TIM_TimeBaseInit(TIM2, &TIM_TimeBase_InitStructure);
20
21
  // Disable TIM2 peripheral
22
  TIM_Cmd(TIM2, DISABLE);
23
24
  // Initialize interrupt for timer 2
25
  NVIC_InitTypeDef NVIC_InitStructure;
26
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
27
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
28
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
29
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
30
  NVIC_Init(&NVIC_InitStructure);
31
32
  TIM2 -> CNT = 0x00;
33
34
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
Das Problem ist nun, obwohl die Timer Peripherie ausgeschaltet ist, wird 
der Timer-Interrupt gleich nach der Initialisierung einmal ausgelöst. 
Danach funktioniert alles wie es soll. Durch
1
TIM_Cmd(TIM2, DISABLE);
und
1
TIM_Cmd(TIM2, ENABLE);
kann ich den Timer ein- und ausschalten. Wie bekomme ich aber diesen 
Auslöser ganz zu Anfang weg? Ist meine Initialisierung vielleicht 
falsch?

Gruß
Mister232

von Dr. Sommer (Gast)


Lesenswert?

Versuche mal:
1
TIM2->SR = ~1;
Nach Einschalten des Timers, vor Einschalten des Interrupts.

von Jens K. (mister232)


Lesenswert?

Super, danke es funktioniert!

Kannst du mir evtl. noch kurz erläutern was der Befehl bewirkt?

Gruß
Mister232

von Dr. Sommer (Gast)


Lesenswert?

Nach dem Starten des Timer setzt die StdPeripheral Library vermutlich 
das Update Flag, um die Shadow Register des Timers mit den Werten der 
Puffer-Register zu laden. Das setzen des Flags setzt aber eben auch das 
UIF Flag was den Update Interrupt aufruft; o.g. Befehl löscht das UIF 
Flag aber vor einschalten des Interrupts wieder, so dass er gar nicht 
aufgerufen werden kann.

von Jens K. (mister232)


Lesenswert?

Okay, danke nochmal.

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.