¿Qué sucede realmente cuando establecemos la dirección de los GPIO en los controladores?

7

Generalmente, mientras trabajamos en los pines GPIO de cualquier controlador / dispositivo, establecemos las instrucciones para los pines GPIO. Digamos que en el controlador LPC2148 (núcleo ARM7), tenemos IODIR para configurar la dirección de Pin. Configuramos el IODIR para salida y borramos para entrada.

IODIR0 |= (1 << 26); //output
IODIR0&= ~(1 << 10); //input

Cómo la configuración / eliminación del pin lo hace como salida / entrada. Creo que se debe a los transistores pull-up y pull-down pero no pude concluir una razón específica.

Y otra pregunta, ¿la configuración de la dirección de IO varía según la arquitectura / CPU que usamos?

    
pregunta Abdul Gafoor

3 respuestas

5

No pude encontrar el esquema interno específico para la parte de NXP en el Manual del usuario , por lo que Explicará usando el que se encuentra en ATMEL ATMega328 , pero deberían verse similares.

Laimagenmuestraelesquemainternodeunsolopin.Lapartemásdestacadaeslapartedelpindedireccióndelpuerto.Cuandoelpuertoseconfiguraensalida(atravésdelbusdedatos,dondesepuedeconfigurarcadapinindividualmentecomoEntradaoSalida;yatravésdelaseñaldecontrolinternoWDx,que"resalta" los datos en el bus de datos al flip-flop), el el búfer se activa y comienza a conducir el pin a los niveles lógicos (voltajes) en el pin de salida *.

Cuando el pin se establece como entrada, el pin de habilitación en ese búfer se configura para que el búfer sea una salida de alta impedancia, por lo que no conduce al pin a ningún nivel de voltaje específico. Eso se convierte en una tarea para los circuitos conectados a ese pin en el circuito fuera del microcontrolador. Tenga en cuenta que, en el caso de Atmel, la lectura del estado lógico de un pin (parte inferior del esquema) siempre lee el estado real de ese pin, no importa si se trata de un pin de entrada o salida. La configuración de un pin como entrada también permite al usuario habilitar la resistencia de pull-up dentro del microcontrolador.

*: Ignoro el colector abierto y otros tipos de pines porque creo que no es relevante para esta pregunta. Sin embargo, el funcionamiento debería ser similar.

  

Cómo la configuración / eliminación del pin lo hace como salida / entrada. Creo que se debe a los transistores pull-up y pull-down pero no pude concluir una razón específica.

Tenga en cuenta que configura el registro de dirección, no el estado del pin en sí. Son cosas diferentes. La configuración / eliminación de los pines le indica al hardware qué voltaje se debe colocar en la salida del búfer de salida (cuando está habilitado por el pin habilitado), mientras que la configuración / eliminación de la dirección del pin le indica al micro si el búfer de salida será habilitado o deshabilitado en absoluto.

    
respondido por el ricardomenzer
5

NXP no parece proporcionar esto, pero El manual del usuario de STM32F4 (página 270) muestra un diagrama de bloques de un pin GPIO típico.

Como puede ver, los pines están conectados a todos los bloques: entrada analógica / digital, así como las secciones de salida. Los registros de control habilitan / inhabilitan y configuran estos bloques para que no interfieran entre sí. También hay señales de habilitación separadas para los despliegues internos / desplegables.

Los detalles exactos de cómo se implementa esto en Silicon, obviamente, difieren entre fabricantes, arquitecturas y procesos.

    
respondido por el Armandas
2

Para agregar a las respuestas anteriores (que son buenas), tenga en cuenta que el registro IODIR (o como se llame en su procesador) solo controla si el controlador de salida está habilitado / deshabilitado. El controlador de salida y el controlador de entrada son independientes.

Donde esto se pone interesante es cuando lees el estado del pin. Por lo general, encontrará que al escribir en el registro de E / S se establece el estado de salida, pero la lectura del registro de E / S lee el estado de entrada. ¿No son los dos iguales? En realidad no siempre, si hay algo más también conectado a ese pin que podría impulsar el pin más fuertemente. En particular, si la salida es de colector abierto / drenaje abierto, el controlador de salida tiene una alta impedancia cuando configura la salida en 1, por lo que el procesador no controla el estado del pin.

En la mayoría de los procesadores, esto significa que si desea realizar un seguimiento del estado del controlador de salida, entonces necesita una variable que almacene ese valor, ya que el procesador no le ofrece una forma de volver a leerlo.

También tenga en cuenta que el pull-up / down es completamente independiente de si la salida está activada. Las resistencias internas de subida / bajada suelen ser convenientes cuando no le importa exactamente cuál es la resistencia, ya que garantiza que los pines queden por defecto en el nivel conocido. Dejar las entradas desconectadas es casi siempre una mala práctica, ya que permite la acumulación de carga estática que puede dañar el dispositivo. Las resistencias pull-up / down aseguran que esto no suceda. También se pueden usar para aplicaciones en las que normalmente tendría una resistencia de pull-up en una entrada, como un botón que impulsa la entrada a 0V; o en aplicaciones en las que normalmente tendría una resistencia de pull-up en una salida, como salidas de colector abierto / drenaje abierto. Esto reduce el recuento de componentes en su esquema. Sin embargo, si necesita un valor específico de resistencia (por ejemplo, si agrega un condensador para filtrar), un pull-up interno generalmente no es lo suficientemente preciso y necesitará una resistencia externa.

    
respondido por el Graham

Lea otras preguntas en las etiquetas