STM32F4 Discovery. Wie kann ich den GPIO_ReadInputDataBit beschleunigen

OP #4353571
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
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.
#4353693
Wenn Du auf das "port bit set/reset register" GPIOx_BSRR als 32-Bit-Wert 
schreibst, dann kannst Du ein Bit gezielt setzen oder löschen.

Du kannst Dir eine Tabelle mit Setz/Lösch-32Bit-Werten bauen und die 
dann per DMA ausgeben.

Gruß, Stefan
Gast #4353700
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.