Estoy leyendo la hoja de datos de un chip ARM Cortex, específicamente el capítulo GPIO. Finalmente, quiero configurar varios pines GPIO para usarlos en modo "Función alternativa" para acceso de lectura / escritura a SRAM.
De todos los registros GPIO disponibles, no entiendo dos: GPIO_PUPDR
y GPIO_OTYPE
que son respectivamente el "registro pull-up / pull-down" y el "registro de tipo de salida".
Porque GPIO_PUPDR
tengo tres opciones:
- Sin pull-up o pull-down
- Levantar
- Derribar
Porque GPIO_0TYPE
tengo dos opciones:
- Salida push-pull
- Salida de drenaje abierto
¿Cuál es la diferencia entre todas las diferentes configuraciones y cuál sería la más adecuada para la comunicación SRAM?
La documentación de la placa en la que estoy trabajando está disponible aquí (consulte la página 24 para ver los esquemas de SRAM). El manual de referencia para el chip ARM está disponible aquí (consulte las páginas 145 y 146 para ver los registros GPIO).
fuente
Respuestas:
Esta respuesta es general para procesadores y periféricos, y tiene un comentario específico de SRAM al final, que probablemente sea pertinente para su RAM y CPU específicas.
Los pines de salida pueden manejarse en tres modos diferentes:
Los pines de entrada pueden ser una entrada de puerta con:
También hay un modo de entrada activada por Schmitt donde el pin de entrada se tira con un pull-up débil a un estado inicial. Cuando se deja solo, persiste en su estado, pero puede ser llevado a un nuevo estado con un esfuerzo mínimo.
El drenaje abierto es útil cuando se conectan múltiples compuertas o pasadores con un pull-up (externo o interno). Si todos los pines son altos, todos son circuitos abiertos y el pull-up impulsa los pines hacia arriba. Si algún alfiler está bajo, todos caen cuando se atan. Esta configuración forma efectivamente una
AND
puerta.Al conducir una SRAM, es probable que desee conducir las líneas de datos o las líneas de dirección de manera alta o baja de la manera más sólida y rápida posible, de modo que se necesite una unidad activa hacia arriba y hacia abajo, por lo que se indica push-pull. En algunos casos con múltiples RAMs, es posible que desee hacer algo inteligente y combinar líneas, donde otro modo puede ser más adecuado.
Con la SRAM con entradas de datos de la SRAM si la RAM IC siempre está confirmando datos, entonces un pin sin pull-up probablemente esté bien, ya que la RAM siempre establece el nivel y esto minimiza la carga. Si las líneas de datos de RAM a veces son de circuito abierto o tristadas, necesitará los pines de entrada para poder establecer su propio estado válido. En comunicaciones de muy alta velocidad, es posible que desee utilizar un pull-up y aa pull-down para que la resistencia efectiva paralela sea la resistencia de terminación, y el voltaje inactivo del bus lo establecen las dos resistencias, pero esto es algo especializado.
fuente
Encontré esta respuesta de STM32 Comprensión de la configuración de GPIO
En los circuitos digitales, es importante que nunca se permita que las líneas de señal "floten". Es decir, siempre deben estar en un estado alto o bajo. Cuando flota, el estado es indeterminado y causa algunos tipos diferentes de problemas.
La forma de corregir esto es agregar una resistencia desde la línea de señal a Vcc o Gnd. De esa manera, si la línea no se conduce activamente hacia arriba o hacia abajo, la resistencia hará que el potencial se desplace a un nivel conocido.
El ARM (y otros microcontroladores) tienen circuitos integrados para hacer esto. De esa manera, no necesita agregar otra parte a su circuito. Si elige "GPIO_PuPd_UP", por ejemplo, es equivalente a agregar una resistencia entre la línea de señal y Vcc.
Push-Pull: este es el tipo de salida que la mayoría de la gente considera "estándar". Cuando la salida baja, es activamente "tirada" a tierra. Por el contrario, cuando la salida se establece en alta, se "empuja" activamente hacia Vcc. Simplificado, se ve así:
Una salida de drenaje abierto, por otro lado, solo está activa en una dirección. Puede tirar del pasador hacia el suelo, pero no puede conducirlo alto. Imagine la imagen anterior, pero sin el MOSFET superior. Cuando no está tirando a tierra, el MOSFET (lado inferior) simplemente no es conductor, lo que hace que la salida flote.
Para este tipo de salida, debe haber una resistencia pull-up agregada al circuito, lo que provocará que la línea suba cuando no se maneje bajo. Puede hacer esto con una parte externa, o estableciendo el valor GPIO_PuPd en GPIO_PuPd_UP.
El nombre proviene del hecho de que el drenaje del MOSFET no está conectado internamente a nada. Este tipo de salida también se denomina "colector abierto" cuando se utiliza un BJT en lugar de un MOSFET.
Básicamente, esto controla la velocidad de respuesta (el tiempo de subida y el tiempo de caída) de la señal de salida. Cuanto más rápida sea la velocidad de respuesta, más ruido se irradia desde el circuito. Es una buena práctica mantener la velocidad de rotación lenta y solo aumentarla si tiene una razón específica.
fuente
Un pequeño bit de tid más: para los microcontroladores que no tienen un modo de "drenaje abierto" explícito, como las placas basadas en AVR y Arduino ATmega328 como el Uno, este modo de "drenaje abierto" se puede simular escribiendo una función de envoltura que simplemente establece un pin en "Salida BAJA" cuando lo envía
0
y que configura el pin como "Entrada BAJA" (modo de alta impedancia, resistencia de pullup interna NO activada) cuando lo envía a1
. De esta manera obtienes el mismo efecto. Estos modernos microcontroladores ARM-core de 32 bits solo tienen muchas más opciones, eso es todo.Además, p146 del Manual de referencia STM32 vinculado a los estados anteriores lo siguiente [mis adiciones están entre corchetes] :
En el código Arduino, esa "función de envoltura" podría implementarse así:
O simplificado:
Tenga en cuenta que para encender la resistencia pullup interna en un Arduino puede hacer:
O (lo mismo):
Lectura adicional:
fuente