Doppel Trigger Input Catpure STM32F415?

Gast #2988229
Lesenswert?

Hallo,
ich erhalte immer einen Toppeltrigger wenn ich eine Frequenz capturen 
will. Lösche ich das Interrupt-Flag bevor ich die etwas in der ISR 
mache geht es, mache ich es danach, kommt es offensichtlich immer zu 
einem Doppeltrigger:
1
void Frequenzmessung_Init ( void )
2
{
3
  GPIO_InitTypeDef      GPIO_InitStructure;
4
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;
5
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
6
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
7
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
8
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL ;
9
  GPIO_Init( GPIOA, &GPIO_InitStructure );
10
  GPIO_PinAFConfig( GPIOA, GPIO_PinSource10, GPIO_AF_TIM1 );
11

12
  /* Timer */
13
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
14
  TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStructure;
15
  TIM_ICInitTypeDef  TIM_ICInitStructure;
16
  NVIC_InitTypeDef NVIC_InitStructure;
17

18
  TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
19
  TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
20
  TIM_TimeBase_InitStructure.TIM_Period = 0xFFFF;
21
  TIM_TimeBase_InitStructure.TIM_Prescaler = TIMER_1_PRESCALER - 1;
22
  TIM_TimeBaseInit( TIM1, &TIM_TimeBase_InitStructure );
23

24
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
25
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
26
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
27
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
28
  TIM_ICInitStructure.TIM_ICFilter = 15;
29
  TIM_ICInit( TIM1, &TIM_ICInitStructure );
30

31
  /* Timeroverflow Interrupt */
32
  TIM_ITConfig( TIM1, TIM_IT_Update, ENABLE );
33
  /* Capture Interrupt */
34
  TIM_ITConfig( TIM1,TIM_IT_CC3 , ENABLE );
35

36
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM10_IRQn;
37
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
38
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 15;
39
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 15;
40
  NVIC_Init( &NVIC_InitStructure );
41

42
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
43
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
44
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 15;
45
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 15;
46
  NVIC_Init( &NVIC_InitStructure );
47

48
  TIM_ClearITPendingBit( TIM1, TIM_IT_CC3 );
49
  TIM_ClearITPendingBit( TIM1, TIM_IT_Update );
50

51
  /* Enable Timer */
52
  TIM_Cmd( TIM1, ENABLE );
53
}
54

55
/* Frequenzmessung */
56
void TIM1_UP_TIM10_IRQHandler (void)
57
{
58
  TIM_ClearITPendingBit( TIM1, TIM_IT_Update );
59
}
60

61
void TIM1_CC_IRQHandler (void)
62
{
63
  TIM_ClearITPendingBit( TIM1, TIM_IT_CC3 );
64
  GPIOD->ODR ^= DEBUG_LED;
65
}
Also wenn ich das Flag vorher lösche, flackert die LED mit 25Hz bei 50Hz 
Eingangsfrequenz. Lösche ich es nach dem Toggeln des Pins gibt es nur 
einen kurzen Impuls an der LED (120ns), dass bedeutet also das die ISR 
2x durchlaufen wird. Warum? Das Eingangssignal ist ein sauberes Rechteck 
ohne irgendwelche Störungen.

Ich kann mir einfach nicht erklären warum?



Ingo
Gast #3018623
Lesenswert?

So, ich habe heute zufällig gelesen, dass dieses Verhalten alle 
Interrupts betrifft bzw der Kern die ISR schneller verlässt als er seine 
Register updatet. Also immer das Flag am Anfang löschen und noch etwas 
Code dahinter. Falls das immer noch zu kurz ist, dass entsprechende 
I-Flag im Register pollen bis es endlich gelöscht ist....

Hoffe es kann jemand damit was anfangen



Ingo

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