STM32 GPIO_ReadPin funktioniert nicht

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren