STM32F4 Discovery. Wie kann ich den GPIO_ReadInputDataBit beschleunigen

OP #4353571
Lesenswert?
• ▲
▼
Hallo,
Ich bin Anfänger mit dem STM32 und arbeite gerade an einem Projekt in 
dem ich ein 2,4 MHz Signal auf logisch 1 und 0 abtasten muss.
Meine erste Idee war es einen Timer-Interrupt alle 2,4 MHz zu 
konfigurieren. In dieser sollte unter anderem das Signal mit 
GPIO_ReadInputDataBit eingelesen werden.

Mein IRQHandler:

void TIM3_IRQHandler()
{  TIM_ClearITPendingBit(TIM3, TIM_IT_Update);

//Sendet einen Datenstring mit 2,4 MHz. Die ersten 9 Zeichen von buf
  if (buf[a]=='0')
  {GPIO_ResetBits(GPIOE,GPIO_Pin_15);
  }
  if (buf[a]=='1')
  {GPIO_SetBits(GPIOE,GPIO_Pin_15);
  }

//Liest Datenbits ein (2,4 MHz). Antwort vom gesendeten Datenstring
  if(buf[0]=='P'&& buf[1]=='R' && a > 9)
  {
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1))
    {BufRead[x] = 1;
    }else
    {BufRead[x] = 0;
    }
  x++;
  }
  a++;

  // Ende von Datenstring
  if (a==44 )
  {
  //--> Timer ausschalten
  }
}



Prinzipiell funktioniert das, allerdings benötigt die Abarbeitung der 
Interruptroutine länger als 1/2400000 Sekunden.
Kann man das Einlesen auf irgend eine weise beschleunigen? -->Compiler 
ist schon auf Opitmizate Most(-03)eingestellt.
#4353627
Lesenswert?
• ▲
▼
man kann das beschleunigen, indem man statt
1
GPIO_ResetBits(GPIOE,GPIO_Pin_15);
einfach
1
GPIOE->BSRRH = 0x80
schreibt.

umgekehrt dann für
1
GPIO_SetBits(GPIOE,GPIO_Pin_15);
einfach
1
GPIOE->BSRRL = 0x80
schreiben.


und statt
1
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1);
schreibt man
1
GPIOA->IDR & 0x02

Ich war nie ein Fan der STM Libraries. Zu ineffizient.
Gast #4353700
Lesenswert?
• ▲
▼
Little B. schrieb:
> Ich war nie ein Fan der STM Libraries. Zu ineffizient.

Dann kompiliere halt mit LTO, dann merkst du keinen Unterschied mehr.

@TO
Weißt du was ein Interrupt für einen Overhead mit sich bringt? Schau mal 
das Assemblerlisting an, um ein Gefühl dafür zu bekommen. Dazu kommen 
nochmal ~20 Takte allein für den Core. Wer Interrupts im MHz-Bereich 
nutzt, sollte genau wissen was da passiert. Bei deinem Programm lastet 
der Interrupt den ganzen Controller aus. Das eigentliche Programm kommt 
kaum noch zum Zuge. Wie Stefan schrieb, ist bei solchen Sachen 
eigentlich immer DMA die Lösung.

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.