Dlaczego najpierw muszę ustawić wartość, a następnie kierunek GPIO we wbudowanym procesorze?

16

Mam pełnoetatową pracę jako inżynier oprogramowania. Niedawno otrzymałem zadanie przejrzenia konfiguracji GPIO i zmiany ustawień w razie potrzeby. Znalazłem kilka pinów, które były nieprawidłowo skonfigurowane, więc naturalnie je ponownie skonfigurowałem, ale powiedziano mi, że zrobiłem to w niewłaściwej kolejności. Oto o czym mówię:

Przed:
GPIO1.direction = WEJŚCIE;

Po:
GPIO1.direction = WYJŚCIE;
GPIO1.value = 0;

Jednak podczas przeglądu kodu powiedziano mi, że muszę zmienić kolejność inicjowania na następujące:

GPIO1.value = 0;
GPIO1.direction = WYJŚCIE;

Innymi słowy, najpierw ustaw wartość, a następnie ustaw kierunek sworznia. Powiedziano mi również, że tak właśnie musi być na współczesnych procesorach, ponieważ używają dwóch rejestrów, jednego dla danych wejściowych i jednego dla danych wyjściowych, jednak stare procesory używają tylko jednego rejestru, więc kolejność operacji nie miałaby znaczenia.
(Uwaga: Nowoczesne = ARM Cortex M3 i nowsze, Stare = Intel 8051)

Poprosiłem o lepsze wyjaśnienie w pracy, ale nie mogłem uzyskać dobrej odpowiedzi. Dlatego postanowiłem zapytać tutaj.

Oto moje pytania:

  1. Dlaczego kolejność inicjalizacji ma znaczenie dla nowych procesorów?
  2. Dlaczego kolejność inicjalizacji nie ma znaczenia na starych procesorach?
  3. O jakich dwóch rejestrach mówią w nowoczesnych procesorach?
  4. O jakim pojedynczym rejestrze mówią na starych procesorach?

Gdyby ktoś mógł podać jakiś schemat, byłoby to jeszcze lepsze.

flashburn
źródło
1
„Nowoczesne” i „stare” procesory są zdecydowanie zbyt niejasne, aby udzielić użytecznej odpowiedzi. Różne architektury mają różne ustawienia rejestru; nie wiedząc, o których mówisz, nie ma możliwości inteligentnego skomentowania ich.
Nick Johnson
@ IgnacioVazquez-Abrams Nie, nie bardzo. W pokoju znajdowali się bardzo doświadczeni inżynierowie, którzy powiedzieli, że będziesz miał usterki na linii, jeśli zrobię to po swojemu.
flashburn
@NickJohnson Modern = ARM Cortex M4 i wyżej, Old = Intel 8051.
flashburn
@BrianDrummond LOL. Bardzo miłe wytłumaczenie. Ale co ze starymi procesorami, na przykład 8051. Dlaczego to nie ma dla nich znaczenia?
flashburn
2
Odpowiedź na pytanie 4 byłaby łatwiejsza za pomocą łącza do arkusza danych.
pjc50,

Odpowiedzi:

22

Oryginalny 8051 używał tak zwanych pseudokierunkowych portów wyjściowych (open-drain z pullupami), więc tak naprawdę nie było żadnego ustawienia kierunku portu.

Oczywiście w przypadku nowoczesnych prawdziwych dwukierunkowych portów wyjściowych lepiej jest ustawić znaną wartość przed włączeniem pinów portu dla danych wyjściowych, ponieważ w przeciwnym razie możesz mieć stan przejściowy na wyjściu, który mógłby zrobić coś niepożądanego.

Zobacz na przykład moją odpowiedź tutaj .

Edycja: Oto struktura pinów we / wy dla (względnie) nowoczesnego mikrokontrolera CMOS :

wprowadź opis zdjęcia tutaj

TRIS (TRIState) nazywa się DDR (rejestr kierunku danych) w wielu innych mikrach. W takim przypadku, jeśli moc wyjściowa zatrzasku TRIS jest wysoka, oba tranzystory są wyłączone, ale port można nadal odczytać.

Oto nieco bardziej złożona struktura pinów we / wy dla nowszego Microchip micro .

wprowadź opis zdjęcia tutaj

Ponownie zatrzask TRIS wyłącza wyjście. Ten zawiera zatrzask LAT, który pomaga uniknąć problemów z odczytem, ​​modyfikacją i zapisem . W serii PIC powinieneś pisać tylko do rejestru LAT (i czytać z rejestru PORT).

Oto oryginalne obwody wewnętrzne portów we / wy 8051 i CMOS 8051 classic (z tego źródła ):

wprowadź opis zdjęcia tutaj

Trochę dodatkowej złożoności polega na tym, że równolegle do tranzystora przyspieszenia jest dołączany tranzystor przyspieszający, aby przezwyciężyć zewnętrzną pojemność. Jak widać, w ogóle nie ma kontroli TRIS / DDR. Podciągane tranzystory MOSFET używane podczas normalnej pracy są „słabe” - są na tyle małe (niskie Idss), że zewnętrzne wyjście podłączone do pinu może podciągnąć niską linię portu pseudo dwukierunkowego.

Spehro Pefhany
źródło
Dziękuję za wyjaśnienie. Od jakiegoś czasu nie pracowałem ze sprzętem, więc trudno mi zrozumieć wyjaśnienie z opisu. Czy miałbyś coś przeciwko dostarczaniu zdjęć? Powiedz, jak wyglądałby sprzęt do konfiguracji pinów na nowoczesnym procesorze, a jak na 8051? Byłbym bardzo wdzięczny.
flashburn
Co rozumiesz przez sprzęt? Wewnętrzny układ GPIO układu?
Spehro Pefhany
To jest poprawne. Jakiś schemat byłby naprawdę pomocny.
flashburn
16

Jeśli najpierw ustawisz kierunek, kołek zostanie na krótko skonfigurowany do wyjścia niezależnie od jego bieżącej wartości wyjściowej. Jeśli najpierw ustawisz wartość, tak się nie stanie.

Robiąc to tak, jak zalecono, unika się trzasków na wyjściu, które mogą wahać się od nieszkodliwych do katastrofalnych, w zależności od tego, do czego podłączony jest pin.

Nick Johnson
źródło
Dzięki. A co ze starymi procesorami, dlaczego to nie ma dla nich znaczenia? Stary = Intel 8051
flashburn
Nie znam 8051. Na podstawie tego, co powiedzieli twoi koledzy, jeśli ten sam rejestr konfiguruje zarówno kierunek, jak i wartość, nie będzie to miało znaczenia, ponieważ kompilator zoptymalizuje dwa zapisy w jednym.
Nick Johnson
2
prawdopodobnie nadal dobrym nawykiem byłoby robienie tego w „nowy” sposób dla starych procesorów również z powyższych powodów. Różni orocessorzy mogą mieć inne wymagania, różni dostawcy mogą dawać lepsze sugestie niż inni, a różne firmy / pracodawcy / zespoły mogą mieć inne zasady dotyczące takich szczegółów.
Billt
2
rzeczywiście ... zawsze zakładaj, że DIO jest połączone z orbitującym laserem zagłady;)
Michael
4

Zakładając, że domyślnym kierunkiem jest wejście (tj. High-Z, co ma sens, ponieważ nie chcemy, aby MCU wymuszało jakąkolwiek wartość na podłączonych liniach), ta kolejność konfigurowania portu jest preferowana, ale nie konieczna. Jest to w rzeczywistości konieczne, gdy twoja aplikacja wymaga, aby przy uruchomieniu wartość portu nie była, powiedzmy, wartością 1. Następnie ustaw wartość na, 0a następnie zmień kierunek. W takim przypadku unikasz możliwej chwilowej „usterki” między ustawieniem kierunku a wartością, co mogłoby spowodować skok na tej szpilce. Dotyczy to wszystkich procesorów o takiej logice, nie tylko nowych.

Eugene Sh.
źródło