Registros de salida GPIO en el STM32

2

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?

    
pregunta Shane Snover

1 respuesta

3

El problema más obvio que veo en su código es que está escribiendo en los registros GPIO antes habilitando los relojes para los periféricos apropiados.

Los periféricos no responderán correctamente si sus relojes no se han habilitado. Habilite todos los relojes periféricos antes de intentar hacer algo con los periféricos.

Dicho todo: las diferencias entre ODR y BSRR / BRR son mínimas. Sin embargo, si solo necesita cambiar un bit, una sola escritura en BSRR (o BRR) es más rápida y utiliza menos espacio de código, que un ciclo de lectura / modificación / escritura en ODR. Sin embargo, si realmente desea establecer el estado de todo el puerto a la vez, o si necesita verificar el estado de salida actual, ODR es el camino a seguir.

    
respondido por el duskwuff

Lea otras preguntas en las etiquetas

Comentarios Recientes

F1 / 1T3 TBU Test Facility Esta sección le indicará que configure RRCOW con cualquiera de los 2 puntos de entrada auxiliar. Conectaremos esta carga útil a la siguiente línea de salida para que pueda controlar la unidad A cuando rdr9250 está conectado con una interfaz i2c de 8 puertos, o la unidad B cuando rdr9250 está conectado con una interfaz i2c de 8 puertos. Con algunas modificaciones en la secuencia de arranque de Linux, también puede conectar un sintonizador bit-monoff opcional para aproximadamente 8Mbit... Lees verder