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:
Wenn jemand eine Art Diagramm zur Verfügung stellen könnte, wäre das noch besser.
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 :
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 .
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 ):
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.
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.
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 0
und ä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.
Nick Johnson
Blitzbrand
Blitzbrand
Blitzbrand
pjc50
Tut
Tut
MathieuL