martes, 28 de marzo de 2017

Entradas digitales (pulsador) -ARM Cortex-M4-

Programa

/* Febrero de 2016
Tarjeta: 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 
  }
}





➤ Observaciones



- 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->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->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.
  

➤ 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: