Forum: Mikrocontroller und Digitale Elektronik stm32 interrupt im callback deaktivieren gpio abfragen


von Paul G. (paul_g210) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hi

Ich (Anfänger) versuche gerade meinen ADAS1000 via SPI (HAL) zu 
überreden Daten zu streamen (an mein Blue Pill Board).

Der ADAS1000 hat einen DRDY PIN der mir anzeigt wenn Daten fertig zum 
auslesen sind, dann schaltet der Pin auf LOW und bleibt solange LOW bis 
ich alle Daten ausgelesen habe und dann geht er wieder auf HIGH während 
er die nächsten Daten generiert...

Dann habe ich den DRDY Pin an PB1 gehangen und diesen als GPIOI_EXT1 
konfiguriert und ein Callback in main.c geschrieben. Der Interrupt löst 
auch brav und richtig aus.

Im Callback muss ich nun (solange DRDY noch LOW ist) weiter NOP's senden 
bis ich auf das HEADER WORD stoße (0x80000000) das mir anzeigt das die 
nächsten drei WORD's meine Daten sind.

Meine Frage ist nun, wie kann ich nun PB1 weiter abfragen ob es LOW 
bekommt wärend ich im Callback bin und PB1 ja als Interrupt konfiguriert 
ist?

Muss/kann ich dann PB1 im Callback wieder als GPIO-IN rekonfigurieren 
und dann einfach HAL_GPIO_READ abfragen und am ende wieder auf 
GPIOI_EXT1 zurückstellen?

Mein Callback sieht so aus:
1
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
2
{
3
  if(GPIO_Pin == DRDY_Pin)
4
  {
5
    // hier PB1 als GPIO-IN konfigurieren
6
    while(HAL_GPIO_ReadPin(DRDY_GPIO_Port, DRDY_Pin != GPIO_PIN_SET))  // solange LOW ist...
7
      {
8
  HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_RESET);
9
  HAL_SPI_TransmitReceive(&hspi1, NOP, rxBuffer, 4, timeOut);
10
  HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_SET);
11
  if(rxBuffer[0] == 0x80)   //  ... nach 0x80 header suchen und ...
12
  {
13
                    // ...daten auswerten
14
  }
15
      }
16
    // hier PB1 als GPIOI_EXT1 konfigurieren
17
   }
18
   else
19
   {
20
     __NOP();
21
   }
22
}

Würde man das so machen oder ist das Blödsinn?

von pegel (Gast)


Lesenswert?

Du kannst die Trigger Flanke an PB1 umschalten und mit einem Flag bzw. 
der Abfrage von PB1 arbeiten.

Man kann PB1 auch auf Interrupt auf beiden Flanken konfigurieren.

von W.S. (Gast)


Lesenswert?

Paul G. schrieb:
> Der ADAS1000 hat einen DRDY PIN der mir anzeigt wenn Daten fertig zum
> auslesen sind, dann schaltet der Pin auf LOW und bleibt solange LOW bis
> ich alle Daten ausgelesen habe und dann geht er wieder auf HIGH während
> er die nächsten Daten generiert...
> ...

> Im Callback muss ich nun (solange DRDY noch LOW ist) weiter NOP's senden
> bis ich auf das HEADER WORD stoße

Wieso mußt du NOP's senden? Soweit ich das aus deinen Worten sehe (ohne 
den ADAS... zu kennen), brauchst du ja bloß die anstehenden Daten zu 
lesen und in einen Ringpuffer zu stopfen, bis dein DRDY wieder auf High 
geht. Anschließend kannst du in aller Ruhe die Daten aus dem Ringpuffer 
durchsehen, was du davon haben willst.

Und wozu eine Callback-Funktion? Nur, um das HAL-Zeugs von ST zu 
benutzen? Wenn du es selber tust, dann weißt du wenigstens, was da im 
eigentlichen Interrupt passiert.

W.S.

von Paul G. (paul_g210) Benutzerseite


Lesenswert?

W.S. schrieb:
> Wieso mußt du NOP's senden?
1
"...When the configuration is complete, the user can begin reading frames by issuing a read command to the frame header register (see Table 54). The ADAS1000/ADAS1000-1/ADAS1000-2 continue to make frames available until another register address is written (read or write command). To continue reading frame data, continue to write all zeros on SDI, which is a write of the NOP register (Address 0x00). A frame is interrupted only when another read or write command is issued.
2
(Seite 55 Data Frames/Packets)

W.S. schrieb:
> Und wozu eine Callback-Funktion?

Weil ich gerade erst in das Thema eingestiegen bin und mir dachte, 
fängste erstma mit dem HAL zeug an und wenns nötig wird kannste ja 
tiefer eintauchen...

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.