Un pin GPIO è un pin 'input / output' generico. Questo è per impostazione predefinita solo alto o basso (livelli di tensione, alto come la tensione di alimentazione del microcontrollore, basso di solito a terra o 0 V). Ma i livelli di "alto" e "basso" sono generalmente indicati come tensioni in proporzione alla tensione di alimentazione. Pertanto, qualsiasi cosa al di sopra del 66% della tensione di alimentazione è considerata un livello logico "alto", il che significa che alcuni dispositivi a bassa tensione possono comunicare con dispositivi ad alta tensione purché i livelli rientrino in ciò che è considerato "alto". Un microcontrollore o ricevitore GPS a bassa potenza da 1,8–2,7 V, ad esempio, avrà difficoltà a comunicare direttamente con un microcontrollore a 5 V perché ciò che il dispositivo a bassa tensione vede come "alto" il dispositivo ad alta tensione non penserà che sia alto. Questo serve per usare GPIO come pin di input,
A volte è possibile utilizzare un pin SINGOLO per valori "analogici", configurando il pin GPIO per essere utilizzato da altri dispositivi di bordo come un convertitore "analogico a digitale" (ADC). Il pin è impostato su un canale sull'ADC e questo funge ora da input per l'ADC, non un normale pin GPIO. È quindi possibile impostare l'ADC per prelevare un campione e leggere il valore del registro dei risultati dell'ADC per numeri come 0-1024 se è una risoluzione di 10 bit.
Come qualcuno ha già detto, un pin GPIO potrebbe essere utilizzato nel software per dare l'effetto di un segnale PWM (Pulsed Width Modulation), di solito a bassa velocità per la commutazione GPIO. La maggior parte dei microcontrollori ha generatori PWM dedicati che possono essere configurati per utilizzare un pin GPIO come pin di uscita e questi sono molto veloci e molto più stabili rispetto all'utilizzo di software per controllare GPIO per generare un segnale PWM. Le PWM sono utilizzate per segnali in stile 'medio' o '%' e ti permettono di fare cose come luci fioche e controllare la velocità di un motore.
I pin GPIO sono generalmente disposti in gruppi, chiamati Ports. Nei controller di piccole dimensioni, potrebbero essere architetture a 8 bit, quindi le porte sono spesso raggruppate in molte 8 e i loro valori possono essere letti tutti contemporaneamente leggendo un 'registro dati' che rappresenta i valori logici alti / bassi di quelli perni. Allo stesso modo, è possibile impostare i pin come output e quindi scrivere 8 bit in un registro dati e il controller GPIO dei microcontrollori leggerà i valori modificati del registro e spingerà il pin in alto o tirerà il pin in basso a seconda del valore appena impostato.
Nei controller più recenti come ARM Cortex A8 e A9 come nel Raspberry Pi e BeagleBone, i loro controller GPIO e le diverse opzioni sono molto complicati. Usano un'architettura a 32 bit, quindi la maggior parte dei pin GPIO sono disposti in blocchi a 32 pin, anche se non tutti sono effettivamente utilizzabili (alcuni potrebbero essere dedicati o non abilitati). BeagleBone (su cui ho lavorato prima) ha alcune opzioni davvero fantastiche per la sua grande quantità di pin, e talvolta dovrai usare uno strumento 'pin mux', che ti consente di impostare le modalità speciali di alcuni pin per cose come PWM, acquisizione impulsi, uscite timer, ingressi canali analogici (ADC) e persino (sul BeagleBone) mappatura ai sotto-processori industriali disponibili sul core ARM, ma sono considerati processori indipendenti e necessitano di una propria mappatura dei pin per essere connesso al mondo esterno.