STM32 GPIO_ReadPin funktioniert nicht

Gast #6370706
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?
Gast
@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.
Gast
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.
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 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.