Um pino GPIO é um pino de 'entrada / saída de uso geral'. Por padrão, isso é apenas alto ou baixo (níveis de tensão, alta sendo a tensão de alimentação do microcontrolador, baixa geralmente sendo aterrada ou 0V). Mas os níveis de 'alto' e 'baixo' são geralmente dados em tensões como uma proporção da tensão de alimentação. Portanto, qualquer coisa geralmente acima de 66% da tensão de alimentação é considerada um nível lógico 'alto', o que significa que alguns dispositivos de baixa tensão podem conversar com dispositivos de alta tensão, desde que os níveis caiam dentro do que é considerado 'alto'. Um microcontrolador de baixa potência de 1,8–2,7V ou receptor de GPS, por exemplo, terá problemas para se comunicar diretamente com um microcontrolador de 5V, porque o que o dispositivo de baixa tensão vê como 'alto' o dispositivo de alta tensão nem pensa que é alto. Isso é para usar o GPIO como um pino de entrada,
Às vezes, você pode usar um pino ÚNICO para valores 'analógicos', configurando o pino GPIO para ser usado por outros dispositivos integrados, como um conversor 'analógico para digital' (ADC). O pino está definido como um canal no ADC e agora atua como uma entrada para o ADC, não como um pino GPIO normal. Em seguida, você pode definir o ADC para obter uma amostra e ler o valor do registro de resultados do ADC para números como 0-1024, se a resolução for de 10 bits.
Como alguém mencionou, um pino GPIO pode ser usado em software para fornecer o efeito de um sinal PWM (Pulsed Width Modulation), geralmente em baixa velocidade para alternar o GPIO. A maioria dos microcontroladores possui geradores PWM dedicados que podem ser configurados para usar um pino GPIO como pino de saída, e estes são muito rápidos e muito mais estáveis do que o uso de software para controlar o GPIO para gerar um sinal PWM. O PWM é usado para sinais no estilo 'médio' ou '%' e permite que você faça coisas como luzes fracas e controle a velocidade de um motor.
Os pinos GPIO geralmente são organizados em grupos, chamados Portas. Em controladores pequenos, eles podem ser de arquitetura de 8 bits, portanto as portas geralmente são agrupadas em lotes de 8 e seus valores podem ser lidos ao mesmo tempo, lendo um 'registro de dados' que representa os valores lógico alto / baixo desses alfinetes. Da mesma forma, você pode definir os pinos como saídas e, em seguida, gravar 8 bits em um registro de dados, e o controlador GPIO dos microcontroladores lerá os valores alterados do registro e elevará o pino ou o puxará para baixo, dependendo do valor que você acabou de definir.
Em controladores mais novos, como o ARM Cortex A8 e A9, como no Raspberry Pi e BeagleBone, seus controladores GPIO e opções diferentes são muito complicados. Eles usam uma arquitetura de 32 bits; portanto, a maioria dos pinos GPIO é organizada em blocos de 32 pinos, mesmo que nem todos sejam realmente utilizáveis (alguns podem ser dedicados ou não habilitados). O BeagleBone (no qual trabalhei antes) tem algumas opções realmente impressionantes para sua grande quantidade de pinos, e às vezes você precisará usar uma ferramenta 'pin mux', que permite configurar os modos especiais de certos pinos para coisas como PWM, captura de pulso, saídas de timer, entradas de canal analógico (ADC) e até mesmo (no BeagleBone de qualquer maneira) mapeamento para os subprocessadores industriais disponíveis no núcleo ARM, mas são considerados processadores independentes e precisam de seu próprio mapeamento de pinos. estar conectado ao mundo exterior.