Forum: Mikrocontroller und Digitale Elektronik STM32F3 Timer Interrupt hängt


von Bert S. (kautschuck)


Lesenswert?

Hallo

Ich habe ein Problem mit dem STM32F3 Discovery und zwar funktioniert der 
Timer interrupt nicht. Sobald der Interrupt aktiviert ist und ich mit 
dem Debugger zum nächsten Befehl weiter gehe, dann hängt der Debugger in 
einer Endlosschleife. Jemand eine Idee?

TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //geht nicht
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE); //geht, aber der uC hängt dann 
trotzdem  wenn ich TIM_Cmd(TIM2, ENABLE); ausführe

Code:
1
int main(void)
2
{
3
4
  SystemInit();
5
6
  initTimer();
7
8
  //LED init
9
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
10
  GPIO_InitTypeDef GPIO_InitStructure;
11
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
12
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
13
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
14
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
15
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
16
  GPIO_Init(GPIOA, &GPIO_InitStructure);
17
18
  while(1) {
19
    GPIO_ResetBits(GPIOA, GPIO_Pin_6);
20
    for(int i=0;i<100000;i++);
21
    GPIO_SetBits(GPIOA, GPIO_Pin_6);
22
    for(int i=0;i<100000;i++);
23
  }
24
}
25
26
void TIM2_IRQHandler(void) {
27
  if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
28
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
29
30
  }
31
}
32
33
void initTimer() {
34
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
35
36
    NVIC_InitTypeDef NVIC_InitStructure;
37
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
38
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
39
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
40
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
41
    NVIC_Init(&NVIC_InitStructure);
42
43
    TIM_TimeBaseInitTypeDef TIM2Init;
44
45
    TIM2Init.TIM_Prescaler = 10;
46
    TIM2Init.TIM_Period = 2000;
47
    TIM2Init.TIM_ClockDivision = TIM_CKD_DIV1;
48
    TIM2Init.TIM_CounterMode = TIM_CounterMode_Up;
49
    TIM2Init.TIM_RepetitionCounter = 1;
50
    TIM_TimeBaseInit(TIM2, &TIM2Init);
51
52
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //Hängt bei diesem Befehl
53
54
    //Timer
55
    TIM_Cmd(TIM2, ENABLE);
56
}

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ich sehe aber in deiner main() den Aufruf von timerInit() gar nicht?

Bert S. schrieb:
> TIM2Init.TIM_RepetitionCounter = 1;

Wenn der Timer kontinuierlich laufen soll, stell das mal auf 0.

von Bert S. (kautschuck)


Lesenswert?

Matthias S. schrieb:
> Ich sehe aber in deiner main() den Aufruf von timerInit() gar nicht?
>
> Bert S. schrieb:
>> TIM2Init.TIM_RepetitionCounter = 1;
>
> Wenn der Timer kontinuierlich laufen soll, stell das mal auf 0.

Ups ja, habe ich beim löschen eines Kommentars mitgelöscht.

Matthias S. schrieb:
> Wenn der Timer kontinuierlich laufen soll, stell das mal auf 0.

Habe ich gemacht, aber trotzdem hängt sich der uC nach 
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE) auf.

Edit: Ich habe noch ein TIM_ClearITPendingBit(TIM2, TIM_IT_Update); vor
IM_ITConfig(TIM2, TIM_IT_Update, ENABLE) gesetzt, jetzt hängt sich der 
uC erst nach TIM_Cmd(TIM2, ENABLE); auf. Die Interrupt Routine wird aber 
nie aufgerufen.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Bert S. schrieb:
> for(int i=0;i<100000;i++);

Ich kann mir zwar nicht vorstellen, das das was hiermit zu tun hat, aber 
int kann alles mögliche sein, und wenn es ein 16 bit int ist, dann 
passen 100000 da nicht rein. Benutze lieber solche Dinge wie 'uint32_t', 
dann weisst du immer, wie lang die Variable wirklich ist.
Ansonsten rate ich dir, nochmal mit den Prioritäten beim NVIC 
rumzuspielen, also z.B. mal beide

Bert S. schrieb:
> NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
>     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;

z.B. auf null zu stellen. Das ist dann zwar die höchste Priorität, aber 
probieren schadet nicht.

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.