Mostrando entradas con la etiqueta entradas digitales. Mostrar todas las entradas
Mostrando entradas con la etiqueta entradas digitales. Mostrar todas las entradas

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.