Perché devo prima impostare un valore e quindi la direzione del GPIO in un processore incorporato?


16

Ho un lavoro a tempo pieno come ingegnere del firmware. Recentemente mi è stato assegnato un compito di rivedere le configurazioni GPIO e modificare le impostazioni secondo necessità. Ho trovato alcuni pin che sono stati configurati in modo errato, quindi naturalmente li ho riconfigurati, tuttavia mi è stato detto che l'ho fatto nell'ordine sbagliato. Ecco di cosa sto parlando:

Prima:
GPIO1.direction = INPUT;

Dopo:
GPIO1.direction = OUTPUT;
GPIO1.value = 0;

Tuttavia durante la revisione del codice mi è stato detto che devo cambiare l'ordine di inizializzazione nel modo seguente:

GPIO1.value = 0;
GPIO1.direction = OUTPUT;

In altre parole, imposta prima il valore e poi imposta la direzione del pin. Mi è stato anche detto che è così che deve essere sui processori moderni perché usano due registri, uno per l'input e uno per l'output, tuttavia i vecchi processori usano solo un registro, quindi l'ordine delle operazioni non avrebbe importanza.
(Nota: moderno = ARM Cortex M3 e versioni successive, vecchio = Intel 8051)

Ho chiesto una spiegazione migliore al lavoro, ma non sono riuscito a ottenere una buona risposta. Ecco perché ho deciso di chiedere qui.

Quindi, ecco le mie domande:

  1. Perché l'ordine di inizializzazione è importante per i nuovi processori?
  2. Perché l'ordine di inizializzazione non ha importanza per i vecchi processori?
  3. Di quali due registri stanno parlando nei moderni processori?
  4. Di quale registro unico stanno parlando sui vecchi processori?

Se qualcuno potesse fornire una sorta di diagramma, sarebbe ancora meglio.


1
I processori "moderni" e "vecchi" sono troppo vaghi per dare una risposta utile. Architetture diverse hanno impostazioni di registro diverse; senza sapere di chi stai parlando non c'è modo di commentarli in modo intelligente.
Nick Johnson,

@ IgnacioVazquez-Abrams No, non proprio. Nella stanza c'erano ingegneri di grande esperienza che dicevano che avresti avuto problemi sulla linea se fosse stato fatto a modo mio.
flashburn

@NickJohnson Modern = ARM Cortex M4 e versioni successive, Old = Intel 8051.
flashburn

@BrianDrummond LOL. Spiegazione molto bella. Ma per quanto riguarda i vecchi processori, ad esempio 8051. Perché questo non ha importanza per loro?
flashburn

2
Q4 sarebbe più facile rispondere con un collegamento alla scheda tecnica.
pjc50,

Risposte:


22

L'originale 8051 utilizzava le cosiddette porte di uscita pseudo-bidirezionali (open-drain con pullup), quindi non c'era davvero alcuna impostazione della direzione delle porte.

Naturalmente per le moderne porte di output bidirezionali reali è meglio avere un valore noto impostato prima di abilitare il pin della porta per l'output, perché altrimenti si potrebbe avere un transitorio sull'output che potrebbe fare qualcosa di indesiderabile.

Vedi la mia risposta qui , per esempio.

Modifica: ecco la struttura dei pin I / O per un microcontrollore CMOS (relativamente) moderno :

inserisci qui la descrizione dell'immagine

TRIS (TRIState) è chiamato DDR (Data Direction Register) in molti altri micro. In questo caso, se l'uscita del latch TRIS è alta, entrambi i transistor sono "off", ma la porta può ancora essere letta.

Ecco una struttura dei pin I / O leggermente più complessa per un microchip Micro più recente .

inserisci qui la descrizione dell'immagine

Ancora una volta, il latch TRIS disabilita l'output. Questo include un blocco LAT che aiuta a evitare problemi di lettura-modifica-scrittura . Sulla serie PIC è necessario scrivere solo nel registro LAT (e leggere dal registro PORT).

Ecco i circuiti interni del pin della porta I / O classica 8051 e CMOS 8051 (da questa fonte ):

inserisci qui la descrizione dell'immagine

C'è un po 'di complessità in più in quanto esiste un transistor di accelerazione in parallelo con il pull-up che viene brevemente attivato per superare la capacità esterna. Come puoi vedere, non esiste alcun controllo TRIS / DDR. I MOSFET pull-up utilizzati nel normale funzionamento sono "deboli": sono abbastanza piccoli (Idss bassi) che un'uscita esterna collegata al pin può abbassare la linea di porta pseudo-bidirezionale.


Grazie per la spiegazione. Non lavoro con l'hardware da un po ', quindi faccio fatica a capire la spiegazione da una descrizione. Ti dispiacerebbe fornire immagini? Dire come sarebbe un hardware di configurazione pin su un processore moderno rispetto a come appare su 8051? Lo apprezzerei molto.
flashburn

Cosa intendi per hardware? I circuiti GPIO interni del chip?
Spehro Pefhany,

È corretto. Una sorta di diagramma sarebbe davvero utile.
flashburn

16

Se si imposta prima la direzione, il pin verrà brevemente configurato per l'uscita qualunque sia il suo valore di uscita attuale. Se si imposta prima il valore, ciò non accadrà.

Quindi, farlo nel modo che ti è stato consigliato evita i difetti sull'uscita, che possono variare da innocui a catastrofici, a seconda di ciò a cui è collegato il pin.


Grazie. E i vecchi processori, perché questo non ha importanza per loro? Vecchio = Intel 8051
flash burn

Non ho familiarità con l'8051. In base a ciò che hanno detto i tuoi colleghi, se lo stesso registro configura sia la direzione che il valore, non importa perché il compilatore ottimizzerà le due scritture in una.
Nick Johnson,

2
sarebbe probabilmente ancora una buona abitudine farlo in questo modo "nuovo" per i vecchi processori anche per la ragione sopra. Orocessori diversi possono avere requisiti diversi, diversi fornitori possono fornire suggerimenti migliori di altri e diverse aziende / datori di lavoro / team possono avere politiche diverse su tali dettagli.
addebitato il

2
anzi ... supponiamo sempre che il DIO sia collegato al laser orbitante del destino;)
Michael,

4

Supponendo che la direzione predefinita sia un input (cioè High-Z, il che ha senso poiché non vogliamo che l'MCU imponga alcun valore sulle linee collegate), questo ordine di impostazione della porta è preferibile ma non necessario. È infatti necessario quando l'applicazione richiede che all'avvio il valore della porta non sia, diciamo 1. Quindi imposterai il valore su 0e poi cambierai la direzione. In questo caso si evita il possibile "glitch" momentaneo tra l'impostazione della direzione e il valore, che potrebbe provocare un picco su quel perno. Ed è vero per tutti i processori che hanno una tale logica, non solo quelli nuovi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.