Pin-Wert eines GPIO-Pins als hochohmig eingestellt

Ich verwende ein STM32F4-Discovery-Board und möchte einen seiner GPIO-Pins auf hohe Impedanz setzen, was ich wie folgt getan habe:

GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;

Nach meinem Verständnis muss sein Modus eingegeben werden, um einen Pin mit hoher Impedanz zu konfigurieren. Habe ich recht?

Wenn ich den Status dieses Pins lese, erhalte ich einen Wert von 1. Ich bin mir nicht sicher, ob die Pins bei hoher Impedanz eine 1 oder 0 zurückgeben sollten. Könnte mir bitte jemand helfen, dies zu verstehen.

Ist der Pin mit irgendetwas verbunden?
Ich habe einen Transceiver an mein Discovery Board angeschlossen. Aber selbst wenn ich dies entferne und den Pin-Status lese, gibt es immer noch eine 1 zurück. Ein anderer Pin, der mit derselben Konfiguration konfiguriert ist, gibt jedoch eine 0 zurück, was mich überrascht.
Wenn ich versuche, dasselbe Programm auf einem anderen Board zu flashen, wird eine 0 zurückgegeben. Bedeutet das, dass mein Board ein Problem hat? @RogerRowland
Ich bin mit der STM32F4-Familie nicht sehr vertraut, aber ein digitaler Eingangspin, der schwebend (nicht angeschlossen) bleibt, verhält sich normalerweise wie eine winzige Antenne. Es kann aufgrund eines lokalisierten statischen Feldes in der Nähe hoch oder niedrig schwingen. Selbst wenn Sie Ihre Hand in die Nähe halten, kann sich der Wert ändern. Wichtig ist, wenn Sie den Pin erden, lautet er 0 und wenn Sie ihn auf VCC ziehen, lautet er 1.
Wenn ich einen Pin so konfigurieren würde, dass er eine hohe Impedanz hat, ist die Konfiguration, die ich verwendet habe, richtig @DanLaks?
Einen unbeschalteten Pin als hochohmig zu konfigurieren ist keine gute Idee .

Antworten (1)

Sie haben Ihre PIN richtig konfiguriert. Der Pin befindet sich im Hochimpedanzmodus und hat nur den Leckstrom als Eingangsstrom (in der Größenordnung von Mikroampere).

Wenn Sie den Wert des Pins ablesen, erhalten Sie den logischen Wert der an den Pin angelegten Spannung. Die Spannungspegel, die einer 0 oder 1 entsprechen, finden Sie im Datenblatt der Geräte.


Zum Beispiel wird für den STM32F401 eine Spannung von bis zu (maximal) 0,35 * VDD-0,04 V als niedrig oder 0 angesehen.

Eine Spannung von mindestens 0,4 * VDD gilt als hoch oder 1.

Wenn Sie also Ihr Gerät mit 3,3 V versorgen, wird alles am Pin bis 1,115 V als 0 und alles über 1,32 V als 1 betrachtet.

Um jedoch zu verhindern, dass der Pin schnell zwischen den beiden Zuständen umschaltet, gibt es eine Hysterese von 0,45 * VDD + 0,3 V. Um zwischen den beiden Zuständen umzuschalten, benötigen Sie also eine größere Spannungsänderung als nur die Differenz zwischen 1,115 V und 1,32 V .


Wenn Sie nun einen nicht verbundenen Pin haben und den Wert des Eingangsregisters lesen, ist der Wert im Grunde undefiniert. Es kann entweder 0 oder 1 sein, abhängig von vielen Faktoren, benachbarten Pin-Spannungen, EMI und anderen.

Der Stift und die angeschlossene Spur wirken im Grunde wie eine Antenne. Somit nimmt es alle Arten von Signalen auf und da nur eine winzige Ladung erforderlich ist, um die Spannung von 0 auf 1 zu bringen, schaltet es leicht zwischen ihnen um. Diese ist abhängig von der Kapazität von Leiterbahn und Pin, ohne zusätzliche Kondensatoren liegt sie im Bereich einiger Pikofarad, die leicht aufgeladen und beeinflusst werden können.

Dies macht Ihre Steuerung anfällig für externe Störungen. Dies kann bei starker EMI zu unberechenbarem Verhalten führen (halten Sie ein anrufendes Mobiltelefon in die Nähe Ihres Mikrocontrollers), einige Geräte reagieren viel empfindlicher, so dass selbst ein Handbewegungen darüber stören könnte.

Aus diesem Grund wird es als bewährte Methode angesehen, an jedem Eingangspin eine Form von aktiver Ansteuerung zu haben. Entweder sorgt die externe Beschaltung dafür, dass dieser immer einen definierten Pegel hat, oder es wird ein Pull-up- oder Pull-down-Widerstand verwendet. Die meisten Mikrocontroller haben eingebaute Widerstände, sodass keine externen Komponenten erforderlich sind.

Um den Pull-up- oder Pull-down-Widerstand an einem Pin zu aktivieren, können Sie die GPIO_InitStruct.Pull. Stellen Sie es auf GPIO_PULLUPbzw. GPIO_PULLDOWNein. Welches das Richtige ist, hängt von Ihrer Anwendung ab. Wenn Sie normalerweise auf ein hohes Signal warten, würden Sie den Pulldown aktivieren, um sicherzustellen, dass Sie nicht versehentlich ein hohes Signal erhalten. Dies würde auch einen zuverlässigen Messwert liefern, wenn der Stift nicht angeschlossen ist.

Unbenutzte Pins können auch als Ausgang konfiguriert werden, wenn sie nicht angeschlossen sind, um die negativen Auswirkungen zu vermeiden.

Hinweis: Wenn Sie ein steckbares Design machen möchten, sollten Sie über einen zusätzlichen ESD-Schutz für den Pin nachdenken.

Fügen Sie vielleicht ein bisschen mehr hinzu, nach "Die meisten Mikrocontroller haben eingebaute Widerstände, daher sind keine externen Komponenten erforderlich." explizit sein? ZB "Daher könnten Sie diesen Eingangspin so konfigurieren, dass er hochgezogen oder heruntergezogen wird, was immer bequem ist, indem Sie diesen Teil der GPIO_InitStructStruktur programmieren. Das würde ein potenzielles Problem beseitigen und sicherstellen, dass er einen konsistenten Wert liest."
@gbulmer fertig, nicht mit deiner Formulierung, aber hoffentlich auch gut.
Das ist gut! +1 Hoffentlich ist das Problem des OP gelöst, oder sie können andere Einschränkungen / Probleme erklären.