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.
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_PULLUP
bzw. GPIO_PULLDOWN
ein. 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.
GPIO_InitStruct
Struktur programmieren. Das würde ein potenzielles Problem beseitigen und sicherstellen, dass er einen konsistenten Wert liest."
Roger Rowland
smyslow
smyslow
Dan Laks
smyslow
CL.