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

16

Tengo un trabajo a tiempo completo como ingeniero de firmware. Recientemente me dieron la tarea de revisar las configuraciones de GPIO y cambiar las configuraciones 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:
GPIO1.direction = OUTPUT;
GPIO1.value = 0;

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

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

En otras palabras, configure primero el valor y luego la dirección del pin. También me han dicho que así es como debe ser 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 importaría.
(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í.

Asi que aqui 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 viejos procesadores?

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

flashburn
fuente
1
Los procesadores "modernos" y "antiguos" son demasiado vagos para dar una respuesta útil. Diferentes arquitecturas tienen diferentes configuraciones de registro; sin saber de qué estás hablando, no hay forma de comentarlos de manera inteligente.
Nick Johnson
@ IgnacioVazquez-Abrams No, en realidad no. Hubo ingenieros muy experimentados en la sala que dijeron que tendrás problemas técnicos en la línea si se hace a mi manera.
flashburn
@NickJohnson Modern = ARM Cortex M4 y superior, Old = Intel 8051.
flashburn
@BrianDrummond LOL. Muy buena explicación. Pero qué pasa con los viejos procesadores, 8051 por ejemplo. ¿Por qué esto no les importa?
flashburn
2
Q4 sería más fácil de responder con un enlace de hoja de datos.
pjc50

Respuestas:

22

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

Por supuesto, para los puertos de salida bidireccionales verdaderos modernos es mejor tener un valor conocido establecido antes de habilitar el pin del puerto para la salida, porque 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 microcontrolador CMOS (relativamente) moderno :

ingrese la descripción de la imagen aquí

TRIS (TRIState) se llama DDR (Registro de dirección de datos) en muchos otros micros. En este caso, si la salida de retención del TRIS es alta, ambos transistores están 'apagados', pero el puerto aún puede leerse.

Aquí es una estructura pin I / O ligeramente más complejo para una nueva Microchip micro .

ingrese la descripción de la imagen aquí

Nuevamente, el pestillo TRIS desactiva la salida. Este incluye un pestillo LAT que ayuda a evitar problemas de lectura-modificación-escritura . En la serie PIC, debe escribir solo en el registro LAT (y leer desde el registro PORT).

Aquí está la circuitería interna original de los pines del puerto de E / S 8051 y CMOS 8051 (de esta fuente ):

ingrese la descripción de la imagen aquí

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

Spehro Pefhany
fuente
Gracias por la explicación. No he trabajado con hardware en mucho tiempo, así que me cuesta entender la explicación de una descripción. ¿Te importaría proporcionar imágenes? ¿Cómo se vería un hardware de configuración de pines en un procesador moderno frente a cómo se ve en 8051? Yo realmente lo apreciaría.
flashburn
¿Qué quieres decir con hardware? ¿El circuito GPIO interno del chip?
Spehro Pefhany
Eso es correcto. Algún tipo de diagrama sería realmente útil.
flashburn
16

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

Por lo tanto, hacerlo de la manera que le han recomendado evita fallas en la salida, que pueden variar de inofensivas a catastróficas, dependiendo de a qué esté conectado el pin.

Nick Johnson
fuente
Gracias. Entonces, ¿qué pasa con los viejos procesadores, por qué esto no les importa? Antiguo = Intel 8051
flashburn
No estoy familiarizado con el 8051. Según lo que dijeron sus colegas, si el mismo registro configura tanto la dirección como el valor, no importará porque el compilador optimizará las dos escrituras en una.
Nick Johnson
2
Probablemente todavía sea un buen hábito hacerlo de esta manera "nueva" para los procesadores antiguos también por la razón anterior. Diferentes orocessors pueden tener diferentes requisitos, diferentes proveedores pueden dar mejores sugerencias que otros, y diferentes compañías / empleadores / equipos pueden tener diferentes políticas sobre dichos detalles.
billt
2
de hecho ... siempre asuma que el DIO está conectado al láser orbital de la fatalidad;)
Michael
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 0y luego cambiará la dirección. En este caso, evita la posible "falla" momentánea entre el establecimiento de la dirección y el valor, lo que podría provocar un pico en ese pin. Y es cierto para todos los procesadores que tienen esa lógica, no solo los nuevos.

Eugene Sh.
fuente