¿Por qué primero debo establecer un valor y luego la dirección del GPIO en un procesador integrado?

16

Tengo un trabajo de tiempo completo como ingeniero de firmware. Recientemente me han asignado una tarea para revisar las configuraciones de GPIO y cambiar la configuración según sea necesario. Encontré algunos pines que estaban configurados incorrectamente, así que naturalmente los reconfiguré, sin embargo me dijeron que lo hice en el orden incorrecto. Esto es de lo que estoy hablando:

  

Antes:
GPIO1.direction = INPUT;

     

Después de:
GPIO1.direction = SALIDA;
GPIO1.value = 0;

Sin embargo, durante la revisión del código me dijeron que debo cambiar el orden de inicialización a lo siguiente:

  

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

En otras palabras, establezca el valor primero y luego establezca la dirección del pin. También me han dicho que así es como debe estar en los procesadores modernos porque usan dos registros, uno para entrada y otro para salida, sin embargo, los procesadores antiguos usan solo un registro, por lo que el orden de las operaciones no importa.
(Nota: Moderno = ARM Cortex M3 y superior, Antiguo = Intel 8051)

Pedí una mejor explicación en el trabajo, pero no pude obtener una buena respuesta. Por eso decidí preguntar aquí.

Así que aquí están mis preguntas:

  1. ¿Por qué es importante el orden de inicialización en los nuevos procesadores?
  2. ¿Por qué el orden de inicialización no importa en los procesadores antiguos?
  3. ¿De qué dos registros están hablando en los procesadores modernos?
  4. ¿De qué registro único están hablando en los procesadores antiguos?

Si alguien pudiera proporcionar algún tipo de diagrama, eso sería aún mejor.

    
pregunta flashburn

3 respuestas

22

El 8051 original usaba los llamados puertos de salida pseudo-bidireccionales (drenaje abierto con pullups), por lo que realmente no había configuración de la dirección del puerto.

Por supuesto, para los puertos de salida bidireccionales reales y modernos, es mejor tener un valor conocido establecido antes de habilitar el pin del puerto para la salida, ya que de lo contrario podría tener un transitorio en la salida que podría hacer algo indeseable.

Vea mi respuesta Aquí , por ejemplo.

Editar: Aquí está la estructura de pines de E / S para un CMOS (relativamente) moderno microcontrolador :

TRIS(TRIState)sellamaDDR(Registrodedireccióndedatos)enmuchosotrosmicros.Enestecaso,silasalidadelpestilloTRISesalta,ambostransistoresestán'apagados',peroelpuertotodavíasepuedeleer.

AquíhayunaestructuradepinesdeE/SunpocomáscomplejaparaunMicrochipmásnuevo micro .

Nuevamente,elpestilloTRISdesactivalasalida.EsteincluyeunpestilloLATqueayudaaevitar read-modify-write cuestiones . En la serie PIC debe escribir solo en el registro LAT (y leer en el registro PORT).

Aquí se encuentran los circuitos internos del pin del puerto de E / S clásico 8051 y CMOS 8051 originales (de esta fuente ):

Hay un poco de complejidad adicional ya que hay un transistor de aceleración en paralelo con el pull-up que se enciende brevemente para superar la capacidad externa. Como puede ver, no hay ningún control TRIS / DDR. Los MOSFET de pull-up utilizados en la operación normal son 'débiles'; son lo suficientemente pequeños (Idss bajo) para que una salida externa conectada al pin pueda tirar de la línea de puerto pseudo-bidireccional hacia abajo.

    
respondido por el Spehro Pefhany
16

Si establece la dirección primero, el pin se configurará brevemente para emitir cualquiera que sea el valor de salida actual. Si establece el valor primero, esto no sucederá.

Por lo tanto, hacerlo de la manera que le recomendaron evita errores técnicos en la salida, que pueden ir desde inofensivos hasta catastróficos, dependiendo de a qué está conectado el pin.

    
respondido por el Nick Johnson
4

Suponiendo que la dirección predeterminada es una entrada (es decir, High-Z, que tiene sentido ya que no queremos que la MCU fuerce ningún valor en las líneas conectadas), este orden de configuración del puerto es preferible pero no necesario . De hecho, es necesario cuando su aplicación requiere que en el inicio el valor del puerto no sea, digamos 1 . Luego, establecerá el valor en 0 y luego cambiará la dirección. En este caso, se evita la posible "falla" momentánea entre la configuración de la dirección y el valor, lo que podría ocasionar un pico en ese pin. Y es cierto para todos los procesadores que tienen tal lógica, no solo los nuevos.

    
respondido por el Eugene Sh.

Lea otras preguntas en las etiquetas