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?
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_PULLUP
o GPIO_PULLDOWN
respectivamente. 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.
GPIO_InitStruct
Eso eliminaría un problema potencial y garantizaría que lee un valor consistente".
Rogelio Rowland
smyslov
smyslov
dan laks
smyslov
CL.