Forum: Mikrocontroller und Digitale Elektronik Doppel Trigger Input Catpure STM32F415?


von Ingo (Gast)


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

von Ingo (Gast)


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

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.