STM32 Comprensión de la configuración de GPIO

41

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é de qué velocidad elijo? ¿Hay alguna ventaja o desventaja al usar alta velocidad 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 el drenaje abierto y push pull?

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.

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

Respuestas:

45
  • 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, 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.

  • 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, es activamente "tirada" 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 conducirlo alto. Imagine 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, 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.

  • GPIO_Speed

    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.

bitsmack
fuente
¡Gracias! para la gran respuesta;), ¿te importaría explicar un poco más sobre diferentes problemas cuando está en estado flotante?
Tim
3
La idea es que la vivienda durante cualquier período de tiempo con un voltaje de entrada intermedio puede encender parcialmente los FET superiores e inferiores en un bloque de entrada y acortar parcialmente la fuente de alimentación a través de ellos, lo que resulta en un consumo excesivo de energía o (en casos especialmente severos ) potencialmente daños.
Chris Stratton
@Tim Sí, lo que Chris Stratton acaba de decir :)
bitsmack
3
@Tim También, cuando las líneas están flotando, es muy fácil perturbar los niveles de voltaje. Simplemente moviendo la mano alrededor del circuito puede cambiar el estado de la entrada, debido a las interacciones capacitivas ...
bitsmack
1
@Tim Realmente depende de la aplicación. Si estás 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-baja. En ese caso, querrías una resistencia pull-up, por lo que el CS nunca baja sin darse cuenta. Puede pensar que esto es innecesario si siempre maneja activamente la línea con un microcontrolador. ¿Pero qué pasa antes de que el microcontrolador se inicialice? O si se restablece? La resistencia pull-up elimina cualquier ambigüedad ...
bitsmack 03 de
5

GPIO Speed ​​es la frecuencia máxima que GPIO puede producir. Una configuración más baja puede ahorrar energía.

El tipo de salida es si el pasador establece altos y bajos (push pull), o si la salida enciende la puerta de un FET que está unido al pasador en el drenaje (drenaje abierto). Esto puede ser conveniente si necesita cualquier pin conectado para poder tirar de un bus bajo sin cortocircuito en otros pines.

Las resistencias hacia arriba conectan la salida del pin al riel de alimentación y hacia abajo la conecta 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 de punto para cambiar un valor de entrada digital. Incluso con el interruptor abierto, la entrada es predecible.

Scott Seidman
fuente