Warum muss ich zuerst einen Wert und dann die Richtung des GPIO in einem eingebetteten Prozessor festlegen?

Ich habe einen Vollzeitjob als Firmware-Ingenieur. Ich habe kürzlich eine Aufgabe erhalten, GPIO-Konfigurationen zu überprüfen und die Einstellungen nach Bedarf zu ändern. Ich habe ein paar Pins gefunden, die falsch konfiguriert waren, also habe ich sie natürlich neu konfiguriert, aber mir wurde gesagt, dass ich es in der falschen Reihenfolge gemacht habe. Hier ist, wovon ich spreche:

Vorher:
GPIO1.direction = INPUT;

Nachher :
​​GPIO1.direction = OUTPUT;
GPIO1.value = 0;

Während der Codeüberprüfung wurde mir jedoch gesagt, dass ich die Reihenfolge der Initialisierung wie folgt ändern muss:

GPIO1.value = 0;
GPIO1.direction = AUSGANG;

Mit anderen Worten, stellen Sie zuerst den Wert und dann die Richtung des Pins ein. Mir wurde auch gesagt, dass dies bei modernen Prozessoren so sein muss, da sie zwei Register verwenden, eines für die Eingabe und eines für die Ausgabe. Alte Prozessoren verwenden jedoch nur ein Register, sodass die Reihenfolge der Operationen keine Rolle spielt.
(Hinweis: Modern = ARM Cortex M3 und höher, Alt = Intel 8051)

Ich bat um eine bessere Erklärung bei der Arbeit, aber ich konnte keine gute Antwort bekommen. Deshalb habe ich mich entschlossen, hier zu fragen.

Hier also meine Fragen:

  1. Warum spielt die Reihenfolge der Initialisierung bei den neuen Prozessoren eine Rolle?
  2. Warum spielt die Reihenfolge der Initialisierung bei den alten Prozessoren keine Rolle?
  3. Über welche zwei Register sprechen sie in den modernen Prozessoren?
  4. Über welches einzelne Register sprechen sie bei den alten Prozessoren?

Wenn jemand eine Art Diagramm zur Verfügung stellen könnte, wäre das noch besser.

"Moderne" und "alte" Prozessoren sind viel zu vage, um eine nützliche Antwort darauf zu geben. Unterschiedliche Architekturen haben unterschiedliche Registereinstellungen; ohne zu wissen, über welche Sie sprechen, gibt es keine Möglichkeit, sie intelligent zu kommentieren.
@IgnacioVazquez-Abrams Nein, nicht wirklich. Es waren sehr erfahrene Ingenieure im Raum, die sagten, dass Sie Störungen auf der Leitung haben werden, wenn es auf meine Art gemacht wird.
@NickJohnson Modern = ARM Cortex M4 und höher, Alt = Intel 8051.
@BrianDrummond LOL. Sehr schöne Erklärung. Aber was ist mit den alten Prozessoren, 8051 zum Beispiel. Warum spielt das für sie keine Rolle?
Q4 wäre mit einem Datenblatt-Link einfacher zu beantworten.
Open-Drain-Ausgänge sind oft miteinander verbunden und enthalten einen Pull-up-Widerstand. In dieser Konfiguration ist es keine gute Idee, dass ein Ausgang die Leitung aktiv hoch treibt, da ein anderer Ausgang sie möglicherweise niedrig treibt.
... Nur nebenbei, das ist keine feste Regel. Wenn Sie sich einigermaßen sicher sind, dass ein anderes Gerät die Leitung nicht niedrig treibt, können Sie die Leitung für ein oder zwei Zyklen hoch treiben, bevor Sie zu High-Z gehen, um die Anstiegszeit zu verbessern.
Abhängig von Ihrer MCU-Architektur.

Antworten (3)

Der ursprüngliche 8051 verwendete sogenannte pseudo-bidirektionale Ausgangsports (Open-Drain mit Pullups), also gab es wirklich keine Portrichtungseinstellung.

Natürlich ist es für moderne echte bidirektionale Ausgangsports besser, einen bekannten Wert festzulegen, bevor der Port-Pin für die Ausgabe aktiviert wird, da Sie sonst einen Transienten am Ausgang haben könnten, der etwas Unerwünschtes bewirken könnte.

Siehe zum Beispiel meine Antwort hier .

Bearbeiten: Hier ist die E / A-Pin-Struktur für einen (relativ) modernen CMOS- Mikrocontroller :

Geben Sie hier die Bildbeschreibung ein

TRIS (TRIState) wird in vielen anderen Mikros DDR (Data Direction Register) genannt. Wenn in diesem Fall der TRIS-Latch-Ausgang hoch ist, dann sind beide Transistoren "aus", aber der Port kann immer noch gelesen werden.

Hier ist eine etwas komplexere I/O-Pin-Struktur für einen neueren Microchip micro .

Geben Sie hier die Bildbeschreibung ein

Auch hier deaktiviert der TRIS-Latch den Ausgang. Dieser enthält einen LAT -Latch, der hilft, Probleme beim Lesen, Ändern und Schreiben zu vermeiden . Bei der PIC-Serie sollten Sie nur in das LAT-Register schreiben (und aus dem PORT-Register lesen).

Hier ist die interne Schaltung des klassischen 8051- und CMOS 8051-Klassik-I / O-Port-Pins (aus dieser Quelle ):

Geben Sie hier die Bildbeschreibung ein

Es gibt ein bisschen zusätzliche Komplexität, da parallel zum Pull-up ein Beschleunigungstransistor vorhanden ist, der kurz eingeschaltet wird, um die externe Kapazität zu überwinden. Wie Sie sehen können, gibt es überhaupt keine TRIS/DDR-Steuerung. Die im Normalbetrieb verwendeten Pull-up-MOSFETs sind „schwach“ – sie sind klein genug (niedriger Idss), dass ein externer Ausgang, der mit dem Pin verbunden ist, die pseudo-bidirektionale Portleitung auf Low ziehen kann.

Danke für die Erklärung. Ich habe seit einiger Zeit nicht mehr mit Hardware gearbeitet, daher fällt es mir schwer, die Erklärung aus einer Beschreibung zu verstehen. Würden Sie gerne Bilder zur Verfügung stellen? Sagen Sie, wie würde eine Pin-Konfigurationshardware auf einem modernen Prozessor aussehen im Vergleich zu 8051? Ich würde es wirklich schätzen.
Was meinst du mit Hardware? Die interne GPIO-Schaltung des Chips?
Das ist richtig. Eine Art Diagramm wäre wirklich hilfreich.

Wenn Sie zuerst die Richtung einstellen, wird der Pin kurz so konfiguriert, dass er seinen aktuellen Ausgabewert ausgibt. Wenn Sie den Wert zuerst festlegen, wird dies nicht passieren.

Wenn Sie es also so tun, wie Sie es empfohlen haben, vermeiden Sie Störungen am Ausgang, die je nach Anschluss des Pins von harmlos bis katastrophal reichen können.

Vielen Dank. Was ist also mit den alten Prozessoren, warum spielt das für sie keine Rolle? Alt = Intel 8051
Ich bin mit dem 8051 nicht vertraut. Basierend auf dem, was Ihre Kollegen gesagt haben, spielt es keine Rolle, wenn dasselbe Register sowohl Richtung als auch Wert konfiguriert, da der Compiler die beiden Schreibvorgänge zu einem optimiert.
Es wäre wahrscheinlich immer noch eine gute Angewohnheit, dies für alte Prozessoren auf diese "neue" Weise zu tun, auch aus den oben genannten Gründen. Unterschiedliche Prozessoren können unterschiedliche Anforderungen haben, unterschiedliche Anbieter können bessere Vorschläge machen als andere, und unterschiedliche Unternehmen/Arbeitgeber/Teams können unterschiedliche Richtlinien zu solchen Details haben.
in der Tat ... gehen Sie immer davon aus, dass das DIO mit dem umlaufenden Laser of Doom verbunden ist;)

Angenommen, die Standardrichtung ist ein Eingang (dh High-Z, was sinnvoll ist, da wir nicht möchten, dass die MCU einen Wert auf die angeschlossenen Leitungen erzwingt), ist diese Reihenfolge der Einrichtung des Ports vorzuziehen, aber nicht notwendig. Es ist in der Tat notwendig, wenn Ihre Anwendung erfordert , dass der Wert des Ports beim Start nicht lautet, sagen wir 1. Dann setzen Sie den Wert auf 0und ändern dann die Richtung. In diesem Fall vermeiden Sie den möglichen vorübergehenden "Glitch" zwischen der Einstellung der Richtung und dem Wert, der zu einer Spitze an diesem Pin führen könnte. Und das gilt für alle Prozessoren mit einer solchen Logik, nicht nur für die neuen.