Probleme mit STM32 Timer-Interrupt

OP #3385003
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
Gast #3385082
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.