Was passiert eigentlich, wenn wir die Richtung für GPIOs in Controllern festlegen?

7

Im Allgemeinen legen wir bei der Arbeit an GPIO-Pins eines Controllers / Geräts die Anweisungen für die GPIO-Pins fest. Angenommen, im LPC2148-Controller (ARM7-Core) haben wir IODIR, um die Richtung des Pins zu konfigurieren. Wir setzen das IODIR für die Ausgabe und löschen es für die Eingabe.

IODIR0 |= (1 << 26); //output
IODIR0&= ~(1 << 10); //input

Wie das Setzen / Löschen des Pins ihn als Ausgang / Eingang macht. Ich denke, es liegt an Pull-Up- und Pull-Down-Transistoren, aber ich konnte keinen bestimmten Grund schließen.

Und noch eine Frage: Variiert die Konfiguration der E / A-Richtung je nach verwendeter Architektur / CPU?

Abdul Gafoor
quelle

Antworten:

5

Ich konnte das spezifische interne Schema für den NXP-Teil im Benutzerhandbuch nicht finden , daher werde ich die Verwendung des in einem ATMEL ATMega328 gefundenen erläutern , aber sie sollten ähnlich aussehen.

Geben Sie hier die Bildbeschreibung ein

Das Bild zeigt den internen Schaltplan für einen einzelnen Pin. Der hervorgehobene Teil ist der Anschlussrichtungstyp. Wenn der Port auf Ausgang eingestellt ist (über den Datenbus, wo jeder Pin einzeln als Eingang oder Ausgang eingestellt werden kann; und über das interne Steuersignal WDx, das die Daten auf dem Datenbus zum Flip-Flop "stroht"), wird der Der Puffer ist aktiviert und beginnt, den Pin auf die Logikpegel (Spannungen) am Ausgangspin * zu bringen.

Wenn der Pin als Eingang gesetzt ist, ist der Freigabepin an diesem Puffer so konfiguriert, dass der Puffer ein hochohmiger Ausgang ist, wodurch der Pin nicht auf einen bestimmten Spannungspegel gebracht wird. Dies wird zu einer Aufgabe für die Schaltung, die mit diesem Pin in der Schaltung außerhalb des Mikrocontrollers verbunden ist. Beachten Sie, dass im Fall von Atmel beim Lesen des Logikzustands eines Pins (unterer Teil des Schaltplans) immer der tatsächliche Zustand dieses Pins gelesen wird, unabhängig davon, ob es sich um einen Eingangs- oder Ausgangsstift handelt. Durch Konfigurieren eines Pins als Eingang kann der Benutzer auch den Pull-up-Widerstand im Mikrocontroller aktivieren.

*: Ich ignoriere Open Colector und andere Arten von Pins, weil ich denke, dass dies für diese Frage nicht relevant ist. Die Arbeitsweise sollte jedoch ähnlich sein.

Wie das Setzen / Löschen des Pins ihn als Ausgang / Eingang macht. Ich denke, es liegt an Pull-Up- und Pull-Down-Transistoren, aber ich konnte keinen bestimmten Grund schließen.

Beachten Sie, dass Sie das Richtungsregister und nicht den Pin-Status selbst einstellen. Sie sind verschiedene Dinge. Das Setzen / Löschen der Pins teilt der Hardware mit, welche Spannung am Ausgang des Ausgangspuffers angelegt werden soll (wenn dies durch den Freigabepin aktiviert wird), während das Setzen / Löschen der Richtung des Pins dem Mikro mitteilt, ob der Ausgangspuffer sein wird überhaupt aktiviert oder deaktiviert.

Ricardomenzer
quelle
5

NXP scheint dies nicht zu bieten, aber das STM32F4-Benutzerhandbuch (Seite 299 ) zeigt ein Blockdiagramm eines typischen GPIO-Pins.

Wie Sie sehen können, sind die Pins mit allen Blöcken verbunden: Analog / Digital-Eingang sowie den Ausgangsabschnitten. Die Steuerregister aktivieren / deaktivieren und konfigurieren diese Blöcke, damit sie sich nicht gegenseitig stören. Es gibt auch separate Freigabesignale für interne Pull-Ups / Pull-Downs.

Die genauen Details, wie dies in Silizium implementiert wird, unterscheiden sich offensichtlich zwischen Herstellern, Architekturen und Prozessen.

GPIO-Block

Armandas
quelle
2

Beachten Sie, dass das IODIR-Register (oder wie auch immer es auf Ihrem Prozessor heißt) nur steuert, ob der Ausgabetreiber aktiviert / deaktiviert ist, um die obigen Antworten zu ergänzen (die gut sind). Der Ausgabetreiber und der Eingabetreiber sind unabhängig.

Interessant wird dies, wenn Sie den Status des Pins zurücklesen. Normalerweise stellen Sie fest, dass das Schreiben in das E / A-Register den Ausgangszustand festlegt, das Lesen aus dem E / A-Register jedoch den Eingangszustand. Sind die beiden nicht gleich? Eigentlich nicht immer, wenn noch etwas mit diesem Pin verbunden ist, das den Pin möglicherweise stärker antreibt. Insbesondere wenn der Ausgang Open-Collector / Open-Drain ist, wird der Ausgangstreiber hochohmig, wenn Sie den Ausgang auf 1 setzen, sodass der Pin-Status nicht vom Prozessor gesteuert wird.

Auf den meisten Prozessoren bedeutet dies, dass Sie eine Variable benötigen, die diesen Wert speichert, wenn Sie den Status des Ausgabetreibers verfolgen möchten, da der Prozessor Ihnen keine Möglichkeit bietet, ihn zurückzulesen.

Beachten Sie auch, dass das Hoch- / Herunterziehen völlig unabhängig davon ist, ob der Ausgang angesteuert wird. Interne Pull-Up / Down-Widerstände sind oft praktisch, wenn Sie sich nicht genau um den Widerstand kümmern, da dadurch sichergestellt wird, dass diese Pins standardmäßig den bekannten Wert erreichen. Das Verbinden von Eingängen ist fast immer eine schlechte Praxis, da sich statische Aufladung aufbauen kann, die das Gerät beschädigen kann. Pull-up / down-Widerstände stellen sicher, dass dies nicht geschieht. Sie können auch für Anwendungen verwendet werden, bei denen normalerweise ein Pull-up-Widerstand an einem Eingang vorhanden ist, z. B. ein Druckknopf, der den Eingang auf 0 V treibt. oder bei Anwendungen, bei denen normalerweise ein Pull-up-Widerstand an einem Ausgang vorhanden ist, z. B. Open-Collector- / Open-Drain-Ausgänge. Dies reduziert die Anzahl der Komponenten in Ihrem Schaltplan.

Graham
quelle