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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.