Forum: Mikrocontroller und Digitale Elektronik STM32 GPIO_ReadPin funktioniert nicht


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von justus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
ich bin mir nicht sicher warum das lesen meines Eingangs auf einmal 
nicht mehr funktioniert. Es geht um folgende Codezeile:
1
while (HAL_GPIO_ReadPin(BHI160_INT_GPIO_Port, BHI160_INT_Pin) == GPIO_PIN_RESET);
Der Eingang ist an die den Interrupt von meinem IMU (BHI160) 
angeschlossen.
Wenn ich die Funktion debugge bekomme ich als return Wert 
GPIO_PIN_RESET.
1
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
2
{
3
  GPIO_PinState bitstatus;
4
  /* Check the parameters */
5
  assert_param(IS_GPIO_PIN(GPIO_Pin));
6
  if((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET)
7
  {
8
    bitstatus = GPIO_PIN_SET;
9
  }
10
  else
11
  {
12
    bitstatus = GPIO_PIN_RESET;
13
  }
14
  return bitstatus;
15
}
Demnach sollte die Bedingung doch erfüllt sein und somit im code 
weitermachen, hingegen springt er immer wieder in die Funktion rein uns 
liest den Eingang aus. Das Ergebnis ist jedes mal GPIO_PIN_RESET. Aus 
testzwecken habe ich den Eingang einfach auf 3,3V angelegt, die Funktion 
liest den Eingang richtig aus und gibt GPIO_PIN_SET zurück. Warum auch 
immer springt er dann weiter und meint
1
while (HAL_GPIO_ReadPin(BHI160_INT_GPIO_Port, BHI160_INT_Pin) == GPIO_PIN_RESET);
sei erfüllt....
Irgendwie kann ich mir das nicht erklären. So habe ich meinen Eingang 
konfiguriert.
1
  /*Configure GPIO pin : BHI160_INT_Pin */
2
  GPIO_InitStruct.Pin = BHI160_INT_Pin;
3
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
4
  GPIO_InitStruct.Pull = GPIO_NOPULL;
5
  HAL_GPIO_Init(BHI160_INT_GPIO_Port, &GPIO_InitStruct);
Kann mir jemand auf die Sprünge helfen?

von Darth Moan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
@param  GPIO_Pin specifies the port bit to read.
                  This parameter can be GPIO_PIN_x where x can be 
0..15).

Die Init Struct will aber eine Bitmap der Pins also (1<<x).
Du kannst nicht das gleiche define für beides benutzen.

von justus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
mein define in der main.h
1
#define BHI160_INT_Pin GPIO_PIN_5
2
#define BHI160_INT_GPIO_Port GPIOB

Oder ich habe nicht genau verstanden was du meinst

von Darth Moan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
justus schrieb:
> GPIO_InitStruct.Pin = BHI160_INT_Pin;

justus schrieb:
> while (HAL_GPIO_ReadPin(BHI160_INT_GPIO_Port, BHI160_INT_Pin) ==
> GPIO_PIN_RESET);s

HAL_GPIO_ReadPin braucht als paramete x
Aber das GPIO_InitStruct.Pin braucht (1<<x)

In deinem Code Schnipsel ist nicht zu sehen, wie BHI160_INT_Pin
definiert ist.

von Darth Moan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ah mist das stimmt nicht. vergiss was ich geschhrieben habe

von justus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Darth Moan schrieb:
> In deinem Code Schnipsel ist nicht zu sehen, wie BHI160_INT_Pin
> definiert ist.

na genau so
#define BHI160_INT_Pin GPIO_PIN_5

von Darth Moan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
justus schrieb:
> Wenn ich die Funktion debugge bekomme ich als return Wert
> GPIO_PIN_RESET.

justus schrieb:
> while (HAL_GPIO_ReadPin(BHI160_INT_GPIO_Port, BHI160_INT_Pin) ==
> GPIO_PIN_RESET);

While führt das folgende Statement solange aus, wie die Bedingung in der 
Klammer erfüllt ist.
Da steht also "tue nichts, solange die PIN-Abfrage GPIO_PIN_RESET
zurück liefert.

Liefert die Abfrage etwas anderes als GPIO_PIN_RESET zurück, dann ist 
die
Bedingung nicht erfüllt, und die Schleife wird beendet. Dann geht es 
hinter der Schleife weiter.

von Darth Moan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Es tut mir leid, das ich zuerst so daneben gehauen habe.
Das stimmt schon alles mit den defines, kommen ja vermutlich auch aus 
dem CubeMX oder?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.