➤ Programa
/* Febrero de 2016Tarjeta: STM32 Discovery
Microcontrolador: STM32F411VET6U
IDE: IAR Embedded Workbench
Programa que mantiene encendidos todos los LED de la STM32 Discovery (azul,
verde, naranja y rojo) mientras se mantenga presionado el pulsador azul de la
tarjeta (B1), el cual está conectado a PA0.
- LED verde (PD12), LED naranja (PD13), LED rojo (PD14), LED azul (PD15).
*/
#include "stm32f4xx.h"
//--- Función que inicializa los puertos A y D y configura los pines que
// encienden los LED ---
void ini_B1_LED (void){
RCC->AHB1ENR |= 0x00000009; // Habilita el reloj para los puertos A y D
GPIOD->MODER |= 0x55000000; // Configura PD12, PD13, PD14 y PD15
// como salidas digitales
}
//--- Función principal del programa ---
void main (void) {
ini_B1_LED();
while (1) {
if (GPIOA->IDR & 0x00000001){ // Si el pulsador está presionado,
GPIOD->BSRRL = 0xF000; // se encienden los LED
}
else GPIOD->BSRRH = 0xF000; // Si no lo está, se apagan
}
}
- No es necesario ningún componente electrónico externo a la Discovery, pero para escribir el programa hay que tener en cuenta que el pulsador B1 está conectado a una resistencia de pull-down, como se puede apreciar en el esquema anterior.
- En el programa se accede a los siguientes registros: RCC_AHB1ENR, GPIOD_MODER, GPIOD_BSRR y GPIOD_IDR.
- RCC->AHB1ENR |= 0x00000009: escribe un '1' en los bits 0 y 3 del registro RCC_AH1ENR para habilitar el reloj del puerto A (bit 0) y el del puerto D (bit 3).
- GPIOD->BSRRL = 0xF000: escribe en los 16 bits menos significativos del registro BSRR del puerto D el número binario '1111000000000000'. Cada '1' supone poner en estado alto los pines correspondientes del puerto D, que en este caso son PD12, PD13, PD14 y PD15. Los '0' no producen ningún efecto en sus respectivos pines.
- GPIOD->BSRRH = 0xF000: escribe en los 16 bits más significativos del registro BSRR del puerto D el número binario '1111000000000000'. Cada '1' supone poner en estado bajo los pines correspondientes, que en este caso son PD12, PD13, PD14 y PD15. Los '0' no producen ningún efecto en sus respectivos pines.
- if (GPIOA->IDR & 0x00000001): al estar conectado el pulsador B1 a una resistencia de pull-down, PA0 permanecerá en estado alto mientras B1 esté pulsado; en caso contrario, PA0 estará en estado bajo. El estado de PA0 lo indica el bit 0 del registro IDR; con esta instrucción se comprueba si ese bit vale '1'.
- GPIOA->MODER &= 0xFFFFFFFC: configura PA0 como entrada digital. Pone a ‘0’ los bits 1 y 0 del registro MODER; los demás los deja intactos, puesto que efectúa una operación AND entre el contenido del registro MODER y 0xFFFFFFFC. Esta orden no es necesaria, dado que por defecto PA0 funciona como entrada digital.
- GPIOA->PUPDR &= 0xFFFFFFFC: configura PA0 para que no use ni una resistencia pull-up ni una pull-down. Esta instrucción tampoco se necesita, debido a que por defecto PA0 funciona sin estas resistencias. En este caso, no se requiere este tipo de resistencias porque el pulsador B1 de la tarjeta Discovery está conectado a una resistencia pull-down.
- Para elegir la velocidad de funcionamiento de los pines del microcontrolador, utilizados en el programa, habría que acceder al registro OSPEEDR.
- En el programa se accede a los siguientes registros: RCC_AHB1ENR, GPIOD_MODER, GPIOD_BSRR y GPIOD_IDR.
- RCC->AHB1ENR |= 0x00000009: escribe un '1' en los bits 0 y 3 del registro RCC_AH1ENR para habilitar el reloj del puerto A (bit 0) y el del puerto D (bit 3).
- GPIOD->MODER |= 0x55000000: configura los pines PD12, PD13, PD14 y PD15 del microcontrolador como salidas digitales. Para ello es necesario escribir ‘01’ en MODER12, que son los bits 25 y 24 del registro MODER del puerto D, en MODER13 (bits 26 y 27), en MODER14 (bits 28 y 29) y en MODER15 (bits 30 y 31).
- GPIOD->BSRRH = 0xF000: escribe en los 16 bits más significativos del registro BSRR del puerto D el número binario '1111000000000000'. Cada '1' supone poner en estado bajo los pines correspondientes, que en este caso son PD12, PD13, PD14 y PD15. Los '0' no producen ningún efecto en sus respectivos pines.
- if (GPIOA->IDR & 0x00000001): al estar conectado el pulsador B1 a una resistencia de pull-down, PA0 permanecerá en estado alto mientras B1 esté pulsado; en caso contrario, PA0 estará en estado bajo. El estado de PA0 lo indica el bit 0 del registro IDR; con esta instrucción se comprueba si ese bit vale '1'.
- GPIOA->MODER &= 0xFFFFFFFC: configura PA0 como entrada digital. Pone a ‘0’ los bits 1 y 0 del registro MODER; los demás los deja intactos, puesto que efectúa una operación AND entre el contenido del registro MODER y 0xFFFFFFFC. Esta orden no es necesaria, dado que por defecto PA0 funciona como entrada digital.
- GPIOA->PUPDR &= 0xFFFFFFFC: configura PA0 para que no use ni una resistencia pull-up ni una pull-down. Esta instrucción tampoco se necesita, debido a que por defecto PA0 funciona sin estas resistencias. En este caso, no se requiere este tipo de resistencias porque el pulsador B1 de la tarjeta Discovery está conectado a una resistencia pull-down.
- Para elegir la velocidad de funcionamiento de los pines del microcontrolador, utilizados en el programa, habría que acceder al registro OSPEEDR.
➤ Registros empleados
Las siguientes imágenes representan los registros utilizados en el programa y en ellas están señalados los bits que éste modifica o consulta. Para más información, ver el documento RM0383 Reference Manual.
No hay comentarios:
Los comentarios nuevos no están permitidos.