STM32 Comprender la configuración de GPIO

En la biblioteca de periféricos estándar STM32, necesitamos configurar el GPIO.

Pero hay 3 funciones que no estoy seguro de cómo configurarlas;

  • GPIO_InitStructure.GPIO_Speed
  • GPIO_InitStructure.GPIO_OType
  • GPIO_InitStructure.GPIO_PuPd

En GPIO_Speed , hay 4 configuraciones para elegir

GPIO_Speed_2MHz  /*!< Low speed */
GPIO_Speed_25MHz /*!< Medium speed */
GPIO_Speed_50MHz /*!< Fast speed */
GPIO_Speed_100MHz

¿Cómo sé qué velocidad elijo? ¿Hay alguna ventaja o desventaja al usar alta o baja velocidad? (por ejemplo: ¿consumo de energía?)

En GPIO_OType , hay 2 configuraciones para elegir

GPIO_OType_PP // Push pull
GPIO_OType_OD // Open drain

¿Cómo saber cuál elegir? ¿Y qué es drenaje abierto y empujar y tirar?

En GPIO_PuPd , hay 3 configuraciones para elegir

GPIO_PuPd_NOPULL // No pull
GPIO_PuPd_UP     // Pull up
GPIO_PuPd_DOWN   // Pull down

Creo que esta configuración está relacionada con la configuración inicial de push pull.

Relacionado: cómo forzar explícitamente el modo de "drenaje abierto" en microcontroladores que no lo admiten de forma nativa, como AVR/Arduino, PIC, etc.: electronics.stackexchange.com/a/354993/26234

Respuestas (2)

  • GPIO_PuPd (Pull-up / Pull-down)

En los circuitos digitales, es importante que nunca se permita que las líneas de señal "floten". Es decir, necesitan estar siempre 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 está siendo impulsada activamente hacia arriba o hacia abajo, la resistencia hará que el potencial se desvíe a un nivel conocido.

El STM32 (y otros microcontroladores) tienen circuitos incorporados 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.

  • GPIO_OType (Tipo de salida):

Push-Pull: este es el tipo de salida que la mayoría de la gente considera "estándar". Cuando la salida baja, se "tira" activamente a tierra. Por el contrario, cuando la salida se establece en alta, se "empuja" activamente hacia Vcc. Simplificado, se ve así:

empujar tirar

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 llevarlo alto. Imagina la imagen anterior, pero sin el MOSFET superior. Cuando no está tirando a tierra, el MOSFET simplemente no es conductor, lo que hace que la salida flote:

drenaje abierto

Para este tipo de salida, se debe agregar una resistencia pull-up al circuito, lo que hará que la línea suba cuando no esté baja. Puede hacer esto con una parte externa o configurando 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 usa un BJT en lugar de un MOSFET.

  • GPIO_Velocidad

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 respuesta lenta y solo aumentarla si tiene una razón específica.

¡Gracias! por la gran respuesta;), ¿te importaría explicar un poco más sobre diferentes problemas cuando está en estado flotante?
La idea es que permanecer durante cualquier período de tiempo en un voltaje de entrada intermedio puede activar parcialmente los FET superior e inferior en un bloque de entrada y provocar un cortocircuito parcial en la fuente de alimentación a través de ellos, lo que resulta en un consumo de energía excesivo o (en casos especialmente severos) ) daños potenciales.
@Tim Además, cuando las líneas están flotando, es muy fácil perturbar los niveles de voltaje. Simplemente mover la mano por el circuito puede cambiar el estado de la entrada, debido a las interacciones capacitivas...
¡Última pregunta de @bitsmack! ;), ¿cuándo usar pull up o down? un escenario posible, como mencionó anteriormente, es usar pull up durante el drenaje abierto, ¿qué tal pull down? ¿Depende del hardware o no importa tirar hacia arriba o hacia abajo?
@Tim Realmente depende de la aplicación. Si está leyendo un interruptor (o botón), entonces realmente no importa. Si está interactuando con otros componentes, depende de la interfaz. Por ejemplo, para las comunicaciones SPI, la línea CS está activa en nivel bajo. En ese caso, querrá una resistencia pull-up, para que el CS nunca se apague sin darse cuenta. Puede pensar que esto es innecesario si siempre manejará activamente la línea con un microcontrolador. Pero, ¿qué pasa antes de que se inicialice el microcontrolador? O si se reinicia? La resistencia pull-up elimina cualquier ambigüedad...
No fui claro en mi último comentario a Tim. Quise decir que debería haber una resistencia pull-up externa colocada en la línea CS . Estaba tratando de demostrar el uso general de pull-up/pull-down, y no estaba tratando de implicar que un pull-up interno fuera apropiado.
ARM no vende ningún microcontrolador. Venden diseños y licencias de arquitectura de CPU. Creo que te referías a STM32. Para que conste, las CPU ARM están presentes en muchos otros chips como NXP, Microship, etc.
@Welgriv Un punto justo, gracias. lo he cambiado :)

La velocidad de GPIO es la frecuencia máxima que puede producir el GPIO. Los ajustes más bajos pueden ahorrar energía.

El tipo de salida es si el pin afirma altos y bajos (push pull) o si la salida enciende la compuerta de un FET que está conectado al pin en el drenaje (drenaje abierto). Esto puede ser conveniente si necesita algún pin adjunto para poder bajar un bus sin cortocircuitar otros pines.

Las resistencias extraíbles conectan la salida del pin al riel de alimentación y las conectan a tierra a través de una resistencia. Esto, entre otras cosas, controlará el voltaje del pin incluso si el bit está en un estado de alta impedancia. Esto es importante para hacer cosas como usar un interruptor puntual para cambiar un valor de entrada digital. Incluso con el interruptor abierto, la entrada es predecible.