viernes, 17 de marzo de 2017

Parpadeo de 4 LED -ARM Cortex-M4-

Programa

/* Febrero de 2016
Tarjeta: STM32 Discovery
Microcontrolador: STM32F411VET6U
IDE: IAR Embedded Workbench
Programa que produce el parpadeo cíclico de los cuatro LED de la  tarjeta
STM32 Discovery.
*/

#include "stm32f4xx.h"
#define LED_discovery 0x0000F000;  // LED verde (PD12), LED naranja (PD13),
                                                               // LED rojo (PD14), LED azul (PD15)

void main (void)  {      
  RCC->AHB1ENR |= 0x00000008;     // Habilita el reloj para el puerto D
  GPIOD->MODER |= 0x55000000;     // Config. PD12, PD13, PD14 y PD15 como salidas

  while (1) {
    for (long int i=0; i<0x1000000; i++) {};      // Retardo
    GPIOD->ODR ^= LED_discovery;             // Conmuta el estado de los LED
   }
}




➤ Observaciones


- No es necesario ningún componente electrónico externo a la Discovery, dado que se utilizan los cuatro LED de la tarjeta.

- Para no complicar el programa, el retardo utilizado se realiza con un bucle for. Las cuestiones relativas a la señal de reloj del microcontrolador se explican en esta entrada del blog y la forma de generar un retardo, de una manera más adecuada, se detalla en esta otra.

- En el programa se accede a los siguientes registros: RCC_AHB1ENR, GPIOD_MODER y GPIOD_ODR. 

- #define LED_discovery 0x0000F000: el número hexadecimal de esta instrucción es igual al número binario '00000000 00000000 11110000 00000000', que representa los 32 bits del registro ODR, aunque los que van del 16 al 31 no son accesibles al usuario. Los bits 12, 13, 14 y 15 del registro tienen un valor igual a '1'.

- 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->ODR ^= LED_discovery: cada vez que se ejecuta esta orden se produce la conmutación del estado del LED, que se consigue efectuando una operación XOR entre el contenido actual del registro ODR y el valor de la constante LED_discovery.

- Ver las explicaciones de la anterior entrada del blog . 
 

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