Los bits son altos en los pines deshabilitados (STM32)

0

Por alguna razón tengo muchos bits con valor 1, incluso si se supone que están desactivados. Intenté depurarlo con algunos LED y el depurador de uVision de Keil. uC is STM32F103 La situación es:
Tengo 2 pines configurados como salida y 1 como entrada.

GPIOA->CRL = 0x00000228;

Cuando intento leer el registro IDR (que contiene valores de entrada, al que se accede con GPIOA- > IDR) espero obtener algo como 0x00000001 o todos los ceros si la entrada es baja. Pero por alguna razón recibo 0x0000BF01, lo que significa que tengo estas cosas en la entrada - 1011111100000001, que obviamente no tengo ya que ni siquiera uso estos pines.

Lo que intenté:
De la hoja de datos encontré que el estado de reinicio para los pines es 4 = 0100. Así que lo intenté

GPIOA->CRL = 0x44444228;

Esto me dio valores en IDR 0x0000BFF8, aún no se ha encontrado.
Luego traté de restablecer manualmente el registro CRH

GPIOA->CRH = 0x44444444;

Esto tampoco cambió nada.

A veces sale 0x0000B000 ... No lo sé, tal vez sea un poco aleatorio (¿captación de ruido?).

¿Cuál puede ser el problema? ¿Asigno algo de manera incorrecta?

Básicamente, este es todo mi código principal, mientras que acabo de acceder a GPIO- > IDR:

RCC->APB2ENR|=RCC_APB2ENR_IOPAEN; // Enable IOPA
GPIOA->CRL = 0x44444228;
GPIOA->CRH = 0x44444444;

Y sí, sé que puedo usar la biblioteca std_periph, mi pregunta es saber por qué suceden las cosas de esa manera, no para encontrar una solución alternativa.

SOLUCIÓN
El texto a continuación es válido para stm32f103, no estoy seguro acerca de otros stm32s.
Resultó que los pines 12,13,14,15 en el puerto A son para señales de señales JTAG y CAN, por lo que son "reservados" y no se pueden utilizar, a menos que se vuelva a asignar JTAG a otro lugar. Básicamente, no use los pines 12 a 15 en el puerto A, puede ignorarlo al enmascarar el registro necesario o en caso de que quiera leer bits específicos std_peripgh gpio library tiene GPIO_ReadInputDataBit (GPIOx, uint16_t GPIO_Pin), donde también puede números de pin juntos.
La forma en que lo descubrí es que siempre eran los mismos bits, simplemente borré todo el chip con STM32 ST-LINK Utility y comprobé si estos bits volvían a ser altos, y de hecho eran altos.
¡ADEMÁS! Los pines 3 y 4 en el puerto B también están reservados para SWO y NJTRST y también tienen una posición alta en el chip recién borrado, por lo que supongo que es mejor NO usar PB3 y PB4.

    
pregunta ScienceSamovar

1 respuesta

0

Probablemente necesitamos más información para ayudar completamente. Sin embargo, ...

El 'valor de restablecimiento' de 0x44444444 es el valor que los registros están establecidos para cuando se reinicia el hardware. No es necesariamente el valor de configuración del puerto lo que necesita.

Consulte RM008 Manual de referencia ... STM32F103xx ... avanzado basado en ARM MCU de 32 bits Sección 9.2

El código está configurando todos los pines del puerto a:
"CNFy: 01: Entrada flotante (estado de restablecimiento)"
"MODEy: 00: Modo de entrada (estado de restablecimiento)"

Por lo tanto, todos los pines, excepto los tres inferiores están configurados para la entrada, sin un pull-up o pull-down específico. Por lo tanto, un pin conectado a una señal, o que tiene una carga aleatoria, puede estar en 0 o 1.

Es normal enmascarar los datos de los pines no utilizados de un puerto para que solo se utilicen los valores necesarios. Esto ayuda si, por ejemplo, se cambia su hardware y se activan nuevos pines para algún otro propósito.

Enmascara el IDR, de modo que solo se usa el valor de los pines que son entradas activas, antes de usar el valor de registro de datos de entrada de puerto.

Puede considerar la posibilidad de configurar la resistencia desplegable en todos los otros pines para que sea más fácil ver lo que está sucediendo con las entradas activas. Sin embargo, eso tiene algún riesgo; por ejemplo, si esos pines de entrada se conectan a una señal alta o Vcc.

Si observa el código fuente de la biblioteca de periféricos estándar, mostrará una secuencia de accesos de registros que lo inicializan correctamente.

Eso podría proporcionar suficiente información para que continúes tu aprendizaje.

Posiblemente, más fácil de leer es la fuente de libmaple Leaflabs para la placa de desarrollo Maple STM32F103.

O investigue en stm32duino.com, que está trabajando en su actualización a libmample.
O mira un puerto de libmaple por un ex-miembro de LeafLabs en rambutan.cc

EDITAR: cuando configuró los bits de CRL en '8 = 1000 (menú desplegable de entrada)' ¿también configuró el registro ODR en 0? De acuerdo con la tabla 20 en la sección 9.1, la ODR determina si el proveedor es un desplegable o un desplegable.

EDIT2: ¡Bien hecho! Una buena obra de detective.
Los pines JTAG (PA13, PA14, PA15, PB3, PB4) pueden liberarse para el uso normal de GPIO estableciendo un valor en AFIO_MAPR, pero tendería a dejar esos pines como JTAG / SWJ-DP.
AFAIK PA11 y PA12 son pines normales, por lo que si no se usan CAN, USB, TIM1 y USART1, están disponibles para GPIO normal.

    
respondido por el gbulmer

Lea otras preguntas en las etiquetas