viernes, 17 de marzo de 2017

Parpadeo de un LED -ARM Cortex-M4-

Programa

/* Febrero de 2016
Tarjeta: STM32 Discovery
Microcontrolador: STM32F411VET6U
IDE: IAR Embedded Workbench
Programa que produce el parpadeo cíclico del LED LD4 (verde) de la tarjeta STM32 Discovery.
*/

#include "stm32f4xx.h"
#define LED_verde 0x00001000;               // El LED verde está conectado a PD12 

void main (void) {
  RCC->AHB1ENR |= 0x00000008;           // Habilita el reloj para el puerto D
  GPIOD->MODER |= 0x01000000;           // Configura PD12 como salida


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





➤ Observaciones


- No es necesario ningún componente electrónico externo a la tarjeta Discovery, dado que se utiliza el LED verde de la misma.

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

- El programa accede a los siguientes registros: RCC_AHB1ENR, GPIOD_MODER y GPIOD_ODR.

- #include "stm32f4xx.h": ver este enlace.

- #define LED_verde 0x00001000: el número hexadecimal de esta instrucción es igual al número binario '00000000 00000000 00010000 00000000', que representa los 32 bits del registro ODR, aunque los que van del 16 al 31 no son accesibles al usuario. El único bit que tiene un valor igual a '1' es el bit 12.

- RCC->AHB1ENR |= 0x00000008: habilita el reloj para el puerto D. Con esta orden se pone a ‘1’ el bit 3 del registro AHB1ENR y se dejan los demás intactos. Es una operación OR entre el valor actual del registro AHB1ENR y el número binario '00000000 00000000 00000000 00001000'', que está expresado en hexadecimal.

- GPIOD->MODER |= 0x01000000: configura el pin PD12 del microcontrolador como salida digital. Para ello se debe escribir ‘01’ en MODER12, que son los bits 25 y 24 del registro MODER del puerto D.

- for (long int i=0; i<0x1000000; i++) {}: esta instrucción se emplea aquí como retardo.

- GPIOD->ODR ^= LED_verde: cada vez que se ejecuta esta orden se produce la conmutación del estado del LED, que se consigue mediante una operación XOR entre el contenido actual del registro ODR del puerto D y el valor de la constante LED_verde, lo cual provoca un cambio en el valor del bit 12 del registro ODR. Se emplea una operación XOR para que el único bit de ODR que cambie su estado sea el número 12. Un '1' en el mencionado bit hace que el LED verde permanezca encendido y un '0' hace que esté apagado.

- Con una orden GPIOD->OSPEEDR puede escogerse, de manera individual, la velocidad de salida de cada uno de los pines del puerto D. El valor por defecto del registro OSPEEDR del puerto D es 0x00000000, lo que quiere decir que, al no haber incluido esta orden en el programa, el modo de trabajo de PD12 es el de baja velocidad.

- GPIOD->OTYPER permitiría elegir el tipo de salida de los pines del puerto D. Su valor por defecto es 0x00000000, por tanto, al no incluir esta orden en el programa, PD12 queda configurado como una salida push-pull.


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