Ich habe einen Vollzeitjob als Firmware-Ingenieur. Vor kurzem wurde mir die Aufgabe übertragen, die 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 mitgeteilt, dass die Reihenfolge der Initialisierung wie folgt geändert werden muss:
GPIO1.value = 0;
GPIO1.direction = OUTPUT;
Mit anderen Worten, stellen Sie zuerst den Wert und dann die Richtung des Stifts ein. Mir wurde auch gesagt, dass dies bei den modernen Prozessoren so sein muss, da sie zwei Register verwenden, eines für die Eingabe und eines für die Ausgabe, wobei jedoch alte Prozessoren nur ein Register verwenden, 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 beschlossen, hier zu fragen.
Also hier sind meine Fragen:
- Warum spielt die Reihenfolge der Initialisierung bei den neuen Prozessoren eine Rolle?
- Warum spielt die Reihenfolge der Initialisierung bei den alten Prozessoren keine Rolle?
- Von welchen zwei Registern sprechen die modernen Prozessoren?
- Über welches einzelne Register sprechen sie auf den alten Prozessoren?
Wenn jemand eine Art Diagramm zur Verfügung stellen könnte, wäre das sogar noch besser.
Antworten:
Das Original 8051 verwendete sogenannte pseudo-bidirektionale Ausgangsports (Open-Drain mit Pullups), so dass es wirklich keine Einstellung der Portrichtung gab.
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 sonst ein Transient auf dem Ausgang auftreten kann, der unerwünschte Auswirkungen hat.
Siehe meine Antwort hier zum Beispiel.
Edit: Hier ist die I / O-Pin-Struktur für einen (relativ) modernen CMOS- Mikrocontroller :
TRIS (TRIState) wird in vielen anderen Mikros als DDR (Data Direction Register) bezeichnet. In diesem Fall sind, wenn der TRIS-Latch-Ausgang hoch ist, beide Transistoren "aus", aber der Port kann weiterhin 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, mit dem Lese-, Änderungs- und Schreibprobleme vermieden werden . Bei der PIC-Serie sollten Sie nur in das LAT-Register schreiben (und aus dem PORT-Register lesen).
Hier ist die interne Pin-Beschaltung des originalen 8051- und CMOS 8051-E / A-Anschlusses (von dieser Quelle ):
Die zusätzliche Komplexität besteht darin, dass parallel zum Pull-up ein Beschleunigungstransistor vorhanden ist, der kurz eingeschaltet wird, um die externe Kapazität zu überwinden. Wie Sie sehen, gibt es überhaupt keine TRIS / DDR-Steuerung. Die im Normalbetrieb verwendeten Pull-up-MOSFETs sind "schwach" - sie sind klein genug (low Idss), dass ein an den Pin angeschlossener externer Ausgang die pseudo-bidirektionale Portleitung auf low ziehen kann.
quelle
Wenn Sie zuerst die Richtung einstellen, wird der Pin kurzzeitig so konfiguriert, dass er unabhängig von seinem aktuellen Ausgabewert ausgibt. Wenn Sie den Wert zuerst festlegen, wird dies nicht passieren.
Wenn Sie es also so machen, wie Sie es empfohlen haben, vermeiden Sie Störungen am Ausgang, die je nach Anschluss des Pins harmlos bis katastrophal sein können.
quelle
Vorausgesetzt, die Standardrichtung ist ein Eingang (dh High-Z, was sinnvoll ist, da die MCU keinen Wert auf die angeschlossenen Leitungen erzwingen soll), ist diese Reihenfolge des Einrichtens des Ports vorzuziehen, aber nicht erforderlich. Es ist in der Tat notwendig, wenn Ihre Anwendung erfordert, dass beim Start der Wert des Ports nicht zum Beispiel ist
1
. Dann setzen Sie den Wert auf0
und ändern dann die Richtung. In diesem Fall vermeiden Sie den möglichen "Störimpuls" zwischen der Einstellung der Richtung und dem Wert, der zu einer Spitze an diesem Stift führen kann. Und das gilt für alle Prozessoren, die eine solche Logik haben, nicht nur für die neuen.quelle