Forum: Mikrocontroller und Digitale Elektronik STM32 GPIO_ReadPin funktioniert nicht


von justus (Gast)


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)


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)


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)


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)


Lesenswert?

Ah mist das stimmt nicht. vergiss was ich geschhrieben habe

von justus (Gast)


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)


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)


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?

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.