STM32 Comprensione delle impostazioni GPIO


41

Nella libreria di periferiche standard STM32, è necessario configurare GPIO.

Ma ci sono 3 funzioni che non so come configurarle;

  • GPIO_InitStructure.GPIO_Speed
  • GPIO_InitStructure.GPIO_OType
  • GPIO_InitStructure.GPIO_PuPd

In GPIO_Speed , ci sono 4 impostazioni tra cui scegliere

GPIO_Speed_2MHz  /*!< Low speed */
GPIO_Speed_25MHz /*!< Medium speed */
GPIO_Speed_50MHz /*!< Fast speed */
GPIO_Speed_100MHz

Come faccio a sapere da quale velocità scelgo? Vi sono vantaggi o svantaggi nell'utilizzo di alta o bassa velocità? (es: consumo di energia?)

Nel GPIO_OType , ci sono 2 impostazioni tra cui scegliere

GPIO_OType_PP // Push pull
GPIO_OType_OD // Open drain

Come sapere da quale scegliere? e che cos'è lo scarico aperto e push pull?

In GPIO_PuPd , ci sono 3 impostazioni tra cui scegliere

GPIO_PuPd_NOPULL // No pull
GPIO_PuPd_UP     // Pull up
GPIO_PuPd_DOWN   // Pull down

Penso che questa impostazione sia correlata all'impostazione iniziale di push pull.


Correlati: come forzare esplicitamente la modalità "open drain" su microcontrollori che non lo supportano in modo nativo, come AVR / Arduino, PIC, ecc: electronics.stackexchange.com/a/354993/26234
Gabriel Staples

Risposte:


45
  • GPIO_PuPd (Pull-up / Pull-down)

    Nei circuiti digitali è importante che le linee di segnale non possano mai "fluttuare". Cioè, devono sempre essere in uno stato alto o basso. Quando fluttua, lo stato è indeterminato e causa alcuni diversi tipi di problemi.

    Il modo per correggere questo è aggiungere un resistore dalla linea del segnale a Vcc o Gnd. In questo modo, se la linea non viene pilotata attivamente in alto o in basso, il resistore causerà il potenziale di spostarsi a un livello noto.

    Il ARM (e altri microcontrollori) hanno circuiti integrati per farlo. In questo modo, non è necessario aggiungere un'altra parte al circuito. Se si sceglie "GPIO_PuPd_UP", ad esempio, è utile aggiungere un resistore tra la linea di segnale e Vcc.

  • GPIO_OType (Tipo di output):

    Push-Pull: questo è il tipo di output che la maggior parte delle persone considera "standard". Quando l'uscita si abbassa, viene attivamente "tirata" a terra. Al contrario, quando l'output è impostato su high, viene attivamente "spinto" verso Vcc. Semplificato, si presenta così:

    pushpull

    Un output Open-Drain, d'altra parte, è attivo solo in una direzione. Può tirare il perno verso terra, ma non può guidarlo in alto. Immagina l'immagine precedente, ma senza il MOSFET superiore. Quando non sta tirando a terra, il MOSFET è semplicemente non conduttivo, causando il galleggiamento dell'uscita:

    Scarico aperto

    Per questo tipo di uscita, è necessario aggiungere una resistenza di pull-up al circuito, che farà salire la linea quando non viene pilotata bassa. È possibile farlo con una parte esterna o impostando il valore GPIO_PuPd su GPIO_PuPd_UP.

    Il nome deriva dal fatto che lo scarico del MOSFET non è collegato internamente a nulla. Questo tipo di output è anche chiamato "open-collector" quando si utilizza un BJT invece di un MOSFET.

  • GPIO_Speed

    Fondamentalmente, questo controlla la velocità di risposta (il tempo di salita e il tempo di caduta) del segnale di uscita. Più veloce è la velocità di risposta, maggiore è il rumore irradiato dal circuito. È buona norma mantenere la velocità di risposta lenta e aumentarla solo se si ha un motivo specifico.


Grazie! per la grande risposta;), ti dispiace spiegare un po 'di più su diversi problemi quando è in stato flottante?
Tim

3
L'idea è che dimorare per un certo periodo di tempo a una tensione di ingresso intermedia può parzialmente accendere sia i FET superiori che inferiori in un blocco di ingresso e cortocircuitare parzialmente l'alimentazione attraverso di essi, con conseguente consumo di energia eccessivo o (in casi particolarmente gravi ) potenzialmente dannoso.
Chris Stratton,

@ Tim Sì, quello che Chris Stratton appena detto :)
bitsmack

3
@Tim Inoltre, quando le linee galleggiano, è molto facile perturbare i livelli di tensione. Proprio muovendo la mano in tutto il circuito può cambiare lo stato dell'ingresso, a causa delle interazioni capacitivi ...
bitsmack

1
@Tim Dipende davvero dall'applicazione. Se stai leggendo un interruttore (o pulsante), non importa. Se si interfaccia con altri componenti, dipende dall'interfaccia. Ad esempio, per le comunicazioni SPI, la linea CS è attiva-bassa. In tal caso, vorresti una resistenza pull-up, quindi il CS non si abbassa mai inavvertitamente. Potresti pensare che ciò non sia necessario se guidi sempre attivamente la linea con un microcontrollore. Ma che dire prima dell'inizializzazione del microcontrollore? O se si ripristina? La resistenza pull-up rimuove qualsiasi ambiguità ...
bitsmack

5

GPIO Speed ​​è la frequenza massima che GPIO può produrre. Impostazioni più basse possono risparmiare energia.

Il tipo di uscita è se il pin afferma alti e bassi (push pull) o se l'uscita accende il gate di un FET che è attaccato al pin in corrispondenza dello scarico (Open drain). Ciò può essere utile se è necessario un pin collegato per poter abbassare un bus senza cortocircuitare altri pin.

Le resistenze pull-up collegano l'uscita del pin alla barra di alimentazione e pull down la collega tramite una resistenza a terra. Questo, tra le altre cose, controlla la tensione del pin anche se il bit è in uno stato di alta impedenza. Questo è importante per fare cose come usare un interruttore spot per cambiare un valore di ingresso digitale. Anche con l'interruttore aperto, l'ingresso è prevedibile.

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.