Hola, actualmente estoy intentando escribir un programa simple utilizando la placa de desarrollo Nucleo STM32, basada en el STM32F334R8. La aplicación configura los puertos GPIO A y C y lee el estado del botón. Si se presiona el botón, se enciende el LED. Si no, lo apaga.
De la documentación de ST ( STM Nucleo 64 ) He verificado que el botón está conectado al Pin C13 y el LED2 está conectado al Pin A5 .
En la hoja de datos, he estado leyendo los registros del GPIO ( Long STM32F334 Hoja de datos ) y ver que hay tres que parecen estar relacionado con la salida; ODR, BSRR y BRR.
Al implementar la aplicación mencionada anteriormente, lo primero que pensé fue escribir el estado del pin GPIO para el LED de salida usando ODR, de este modo:
SET_BIT(GPIOA->ODR, GPIO_ODR_5);
CLEAR_BIT(GPIOA->ODR, GPIO_ODR_5);
Esto no parece funcionar. Se detectaron mis pulsaciones de botón, ya que pude verificar esto en el depurador al verlo siguiendo diferentes caminos. Aquí está mi código de configuración para el GPIO:
// set one to input
CLEAR_BIT(GPIOC->MODER, GPIO_MODER_MODER13_0);
CLEAR_BIT(GPIOC->MODER, GPIO_MODER_MODER13_1);
// set another to output
SET_BIT(GPIOA->MODER, GPIO_MODER_MODER5_0);
CLEAR_BIT(GPIOA->MODER, GPIO_MODER_MODER5_1);
// set output to push-pull
CLEAR_BIT(GPIOA->OTYPER, GPIO_OTYPER_OT_5);
// set input with pull-up
SET_BIT(GPIOC->PUPDR, GPIO_PUPDR_PUPDR13_1);
CLEAR_BIT(GPIOC->PUPDR, GPIO_PUPDR_PUPDR13_0);
// enable GPIOA and GPIOC clock
SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOAEN);
SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOCEN);
También vi una pieza de código de ejemplo que funcionaba en mi placa y que utiliza los bits BSRR y BRR, como por ejemplo:
// set output high
SET_BIT(GPIOA->BSRR, GPIO_BSRR_BS_5);
// set output low
SET_BIT(GPIOA->BRR, GPIO_BRR_BR_5);
... Pero esto no funcionó.
No estoy seguro de entender la diferencia entre los tres registros y sus funciones.
¿Cuáles son los casos de uso para cada uno? ¿Cuál es el adecuado para mi aplicación?