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

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