Forum: Mikrocontroller und Digitale Elektronik STM32 Timer Interrupt Priority


von Mark W. (mark_wer)


Lesenswert?

Hallo,

ich komme grad nicht wirklich weiter und würde mich über eure Hilfe 
freuen. Ich hätte gern zwei seperate Interrupt Handler für OVF und 
Capture Interrupt mit verschiedenen Prioritäten. Im meinem Beispiel Code 
wird ja der Handler bei beiden aufgerufen und dann geprüft, welche Flag 
gesetzt wurde. Könnte man das auch in zwei seperaten Interrupts machen 
und bräuchte ich dafür TIM1 (nur bei dem gibts's anscheinend den Capture 
Handler)? Und wie genau funktioniert beim CaptureInterrupt der Filter, 
also was macht 0x01, 0x02 usw. für einen Unterschied, habe dazu bisher 
noch nichts gefunden.
1
void Init(void)
2
{
3
  GPIO_InitTypeDef GPIO_InitStructure;
4
  TIM_ICInitTypeDef TIM_ICInitStructure;
5
  NVIC_InitTypeDef NVIC_InitStructure;
6
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
7
8
  // Clock Enable
9
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
10
11
  // Clock enable
12
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
13
14
  // Config des Pins PA1 als AF-Input
15
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
16
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
17
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
18
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
19
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
20
  GPIO_Init(GPIOA, &GPIO_InitStructure);
21
22
  // Alternative-Funktion mit dem IO-Pin PA1 verbinden
23
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_TIM2);
24
25
  TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
26
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
27
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
28
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
29
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
30
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
31
32
  // Vorteiler einstellen (Vorteiler von 167 => 1MHz)
33
  TIM_PrescalerConfig(TIM2, 0, TIM_PSCReloadMode_Immediate);
34
35
  // Channel 2
36
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
37
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
38
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
39
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
40
  TIM_ICInitStructure.TIM_ICFilter = 0x0;
41
  TIM_ICInit(TIM2, &TIM_ICInitStructure);
42
43
  // Timer enable
44
  TIM_Cmd(TIM2, ENABLE);
45
46
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
47
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
48
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
49
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
50
  NVIC_Init(&NVIC_InitStructure);
51
52
  //Interrupt Enable
53
  TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
54
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
55
}
56
57
58
//-----------------------
59
// TIM2 Interrupt Handler
60
//-----------------------
61
62
void TIM2_IRQHandler(void)
63
{
64
65
  // Überprüfen ob Overflow-Flag gesetzt wurde
66
  if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
67
  {
68
    // delete Interrupt Flags
69
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
70
    //Funktion
71
    }
72
  }
73
74
  // Überprüfung ob Capture-Flag gesetzt wurde
75
  if(TIM_GetITStatus(TIM2, TIM_IT_CC2) == SET)
76
  {
77
    // delete Interrupt Flags
78
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
79
    //Funktion
80
  }
81
}

PS: Ich verwende USB-CDC-Kommunikation, die soweit auch läuft. Ich würde 
aber gern den Timer auf einer Frequenz laufen lassen, für die ich den 
CPU-Takt etwas runtertakten müsste, um einen ganzzahligen Prescaler zu 
erhalten, könnte dieses runtertakten zu Problemen mit der 
USB-Kommikation führen (Library baut auf der von ST auf)

von Mark W. (mark_wer)


Lesenswert?

Okay, könnte die meisten Probleme jetzt lösen, aber eine Frage bleibt 
noch, wo ich nirgends eine Antwort finde: Was bewirken verschiedene 
Werte bei TIM_ICFilter? Würde mich sehr über eure Hilfe freuen :) Schon 
mal danke und einen schönen Start in die Woche.

von Christopher J. (christopher_j23)


Lesenswert?

Das ist ein digitaler Filter, den man z.B. zum digitalen entprellen 
hernehmen kann. Man beeinflusst damit die Abtastfrequenz (gewissermaßen 
ein zusätzlicher Prescaler) und kann zusätzlich noch einstellen wie 
viele aufeinander folgende Events erst den Interrupt auslösen. Einfach 
mal im passenden RefMan in die Doku vom "capture/compare mode register" 
des entsprechenden Timers schauen.

von Mark W. (mark_wer)


Lesenswert?

Danke für die Hilfe, jetzt habe ich es gefunden :)

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.