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:
- ¿Por qué es importante el orden de inicialización en los nuevos procesadores?
- ¿Por qué el orden de inicialización no importa en los procesadores antiguos?
- ¿De qué dos registros están hablando en los procesadores modernos?
- ¿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.
Respuestas:
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 :
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 .
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 ):
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.
fuente
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.
fuente
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 valor0
y 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.fuente