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.