Valor de pin de un pin GPIO establecido como alta impedancia

Estoy usando una placa de descubrimiento STM32F4 y mi intención es configurar uno de sus pines GPIO en alta impedancia, lo que hice de la siguiente manera:

GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;

Según tengo entendido, para configurar un pin a alta impedancia, se debe ingresar su modo. ¿Tengo razón?

Si leo el estado de este pin, obtengo un valor de 1. No estoy seguro de si los pines de alta impedancia deben devolver un 1 o un 0. ¿Podría alguien ayudarme a entender esto?

¿El pin está conectado a algo?
Tengo un transceptor conectado a mi placa de descubrimiento. Pero incluso si elimino esto y leo el estado del pin, aún devuelve un 1. Sin embargo, otro pin configurado con la misma configuración devuelve un 0, lo que me sorprende.
Cuando intento actualizar el mismo programa en otra placa, devuelve un 0. ¿Significa que mi placa tiene un problema? @RogerRowland
No estoy muy familiarizado con la familia STM32F4, pero un pin de entrada digital que se deja flotando (desconectado) normalmente actuará como una pequeña antena. Puede oscilar hacia arriba o hacia abajo debido a algún campo estático localizado cerca. Incluso acercar la mano puede cambiar el valor. Lo importante es que si pones a tierra el pin, lee 0 y si lo subes a VCC, lee 1.
Si tuviera que configurar un pin para que tenga alta impedancia, ¿la configuración que he usado es correcta @DanLaks?
Configurar un pin desconectado como de alta impedancia es una mala idea .

Respuestas (1)

Has configurado tu pin correctamente. El pin está en modo de alta impedancia y solo tendrá la corriente de fuga como corriente de entrada (del orden de microamperios).

Leer el valor del pin te dará el valor lógico del voltaje aplicado al pin. Los niveles de voltaje que corresponden a 0 o 1 están disponibles en la hoja de datos de los dispositivos.


Por ejemplo, para el STM32F401, un voltaje de hasta (máximo) 0,35*VDD-0,04 V se considerará bajo o 0.

Un voltaje de al menos 0,4*VDD se considera alto o 1.

Entonces, si alimenta su dispositivo con 3,3 V, todo lo que esté en el pin hasta 1,115 V se considerará un 0 y todo lo que supere los 1,32 V se considerará un 1.

Sin embargo, para evitar que el pin cambie rápidamente entre los dos estados, hay una histéresis de 0,45*VDD+0,3 V. Entonces, para cambiar entre los dos estados, necesita un cambio de voltaje mayor que solo la diferencia entre 1,115 V y 1,32 V. .


Ahora, si tiene un pin desconectado y lee el valor del registro de entrada, el valor es básicamente indefinido. Podría ser 0 o 1 dependiendo de muchos factores, voltajes de pines adyacentes, EMI y otros.

El pin y la pista conectada actúan básicamente como una antena. Por lo tanto, capta todo tipo de señales y, dado que solo se requiere una pequeña carga para llevar el voltaje de 0 a 1, cambiará fácilmente entre ellos. Esto depende de la capacitancia de la pista y el pin, sin capacitores agregados, está en el rango de algunos picofaradios, que pueden cargarse e influirse fácilmente.

Esto hace que su controlador sea susceptible a perturbaciones externas. Esto puede conducir a un comportamiento errático en caso de EMI fuerte (sostenga un teléfono móvil que llama cerca de su microcontrolador), algunos dispositivos reaccionan de manera mucho más sensible, por lo que incluso mover la mano sobre él podría molestarlo.

Por eso, se considera una mejor práctica tener algún tipo de unidad activa en cada pin de entrada. O el circuito externo se asegura de que tenga un nivel definido todo el tiempo, o se utiliza una resistencia pull-up o pull-down. La mayoría de los microcontroladores tienen resistencias integradas, por lo que no se necesitan componentes externos.

Para habilitar la resistencia pull-up o pull-down en un pin, puede usar el GPIO_InitStruct.Pull. Ajústelo a GPIO_PULLUPo GPIO_PULLDOWNrespectivamente. Cuál es el correcto depende de su aplicación, por lo general, si está esperando una señal alta, habilitaría el menú desplegable para asegurarse de que no recibe una señal alta accidental. Esto también proporcionaría una lectura confiable si el pin no está conectado.

Los pines no utilizados también se pueden configurar como salida si se dejan desconectados para evitar efectos negativos.

Nota: si desea hacer un diseño enchufable, debe pensar en una protección ESD adicional para el pin.

Tal vez agregue un poco más, después de "La mayoría de los microcontroladores tienen resistencias integradas, por lo que no se necesitan componentes externos". ser explícito? Por ejemplo, "Por lo tanto, puede configurar ese pin de entrada para que se levante o se baje, lo que sea conveniente, mediante la programación de esa parte de la estructura. GPIO_InitStructEso eliminaría un problema potencial y garantizaría que lee un valor consistente".
@gbulmer terminó, no con su redacción, pero espero que también esté bien.
¡Eso es bueno! +1 Esperemos que el problema del OP se resuelva, o pueden explicar cualquier otra restricción/problema.