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


16

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:

  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. Von welchen zwei Registern sprechen die modernen Prozessoren?
  4. Ü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.


1
"Moderne" und "alte" Prozessoren sind viel zu vage, um eine nützliche Antwort darauf zu geben. Unterschiedliche Architekturen haben unterschiedliche Registereinstellungen. Ohne zu wissen, von welchen du sprichst, gibt es keine Möglichkeit, sie intelligent zu kommentieren.
Nick Johnson

@ IgnacioVazquez-Abrams Nein, eigentlich nicht. Es waren sehr erfahrene Ingenieure im Raum, die sagten, dass Sie Störungen in der Leitung haben werden, wenn dies nach meinem Dafürhalten erfolgt.
Flashburn

@ NickJohnson Modern = ARM Cortex M4 und höher, Old = Intel 8051.
Flashburn

@ BrianDrummond LOL. Sehr schöne Erklärung. Aber was ist mit den alten Prozessoren, 8051 zum Beispiel. Warum ist das für sie nicht wichtig?
Flashburn

2
Q4 wäre einfacher mit einem Datenblattlink zu beantworten.
PJC50

Antworten:


22

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 :

Bildbeschreibung hier eingeben

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 .

Bildbeschreibung hier eingeben

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 ):

Bildbeschreibung hier eingeben

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.


Danke für die Erklärung. Ich habe eine Weile nicht mehr mit Hardware gearbeitet, daher kann ich die Erklärung aus einer Beschreibung nur schwer verstehen. Würde es Ihnen etwas ausmachen, Bilder zur Verfügung zu stellen? Sagen Sie, wie würde eine Pin-Konfigurationshardware auf einem modernen Prozessor aussehen, im Vergleich zu 8051? Ich würde dies sehr begrüssen.
Flashburn

Was meinst du mit Hardware? Die interne GPIO-Schaltung des Chips?
Spehro Pefhany

Das ist richtig. Eine Art Diagramm wäre wirklich hilfreich.
Flashburn

16

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.


Vielen Dank. Was ist mit den alten Prozessoren, warum ist das für sie nicht wichtig? Alt = Intel 8051
Flashburn

Ich bin mit dem 8051 nicht vertraut. Basierend auf den Aussagen Ihrer Kollegen spielt es keine Rolle, wenn dasselbe Register sowohl Richtung als auch Wert konfiguriert, da der Compiler die beiden Schreibvorgänge in einem optimiert.
Nick Johnson

2
Es wäre wahrscheinlich immer noch eine gute Angewohnheit, dies auf "neue" Weise für alte Prozessoren zu tun, auch aus dem oben genannten Grund. Verschiedene Orocessors haben möglicherweise unterschiedliche Anforderungen, verschiedene Anbieter unterbreiten möglicherweise bessere Vorschläge als andere, und verschiedene Unternehmen / Arbeitgeber / Teams haben möglicherweise unterschiedliche Richtlinien zu solchen Details.
Billt

2
in der Tat ... immer davon ausgehen, dass der DIO mit dem umlaufenden Laser des Untergangs verbunden ist;)
Michael

4

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 auf 0und ä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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.