STM32 Timer Interrupt Priority

OP #4731488
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)
#4733321
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.

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