Estoy tratando de enrollar mi propio dispositivo USB usando una pastilla azul STM32F103 en C con el compilador GCC arm-none-eabi, pero me he encontrado con un comportamiento extraño que estoy tratando de entender.
He creado una estructura que modela las tablas de descriptores de búfer de punto final asociadas con el periférico USB:
typedef struct _EP_BUF_DSCR {
uint32_t ADDR_TX;
uint32_t COUNT_TX;
uint32_t ADDR_RX;
uint32_t COUNT_RX;
} EP_BUF_DSCR;
Y he creado un puntero a una de estas estructuras y lo he configurado para que aborde el inicio del área de memoria de paquetes USB de la MCU:
EP_BUF_DSCR *EP0_DSCR = (EP_BUF_DSCR *) 0x40006000;
Así que ahora puedo configurar los campos ADDR_TX y ADDR_RX simplemente eliminando la referencia de los campos apropiados y asignándoles valores. Sin embargo, cuando intento hacer esto con el campo COUNT_RX, parece que no tiene ningún efecto:
// debugger memory view shows register as set to 0 after running this:
EP0_DSCR->COUNT_RX = 0x8400;
Pero puedo cambiar el valor en este registro creando un puntero directamente a él y eliminándolo:
// debugger memory view shows register set to correct value after running:
*((uint32_t *)(0x40006000 + 12)) = 0x8400;
¿Podría alguien proporcionar alguna idea de por qué sucede esto? ¿He hecho algo sin sentido, o confío involuntariamente en el comportamiento del compilador no documentado?