Programando microcontrolador ARM: 5 - Blink por referencia a registros (stm32f103c8)

En este tutorial vamos a ver como podemos escribir los registros ayudándonos de la biblioteca del microcontrolador que nos ofrece el fabricante.

Además vamos a organizar un poco el código añadiendo funciones.


Registros por referencia.

Cómo ya vimos para escribir en los registros podemos pasar un numero hexadecimal que en su formato binario equivale a los bits del registro.

Por ejemplo cuando escribíamos lo siguiente.
//Reset en el pin 13. Pone el pin a 0.
GPIOC -> BSRR |= 0x20000000;

Estábamos escribiendo que 0x20000000 equivalía a escribir en el registro 0010 0000 0000 0000 0000 0000 0000 0000.

Para ir escribiendo estos registros teniamos que ir mirando en el manual de referencia que bit debíamos modificar en cada caso.
Sin embargo  gracias a la biblioteca podemos sustitur el 0x20000000 directamente por una referencia que es equivalente. Estas referencias nos permiten ademas escribir el codigo de una manera mas intuitiva y fluida.

De tal manera que el código queda de la siguiente manera.
//Reset en el pin 13. Pone el pin a 0.
GPIOC -> BSRR |= GPIO_BSRR_BR13;

Además si mantenemos el cursor sobre esta referencia el editor nos va a mostrar a que corresponde.

También si hacemos clic en la referencia mientras pulsamos la tecla CTRL, nos llevará a la parte de la biblioteca donde esta la referencia, esto nos permite observar e indagar todas las referencias que tenemos disponibles.




Organizar código.

Organizar nuestro código es una practica casi vital para desarrollar correctamente nuestro código. Cuanto mas limpio este y mas organizado mas valor tendrá nuestro trabajo, además nos ahorrara mucho tiempo a futuro, ya que un código limpio y ordenado nos permite encontrar y solucionar errores de manera mas rápida y eficiente.

Para empezar vamos a separar la declaración de pines y su configuración a una función separada que luego llamaremos en el main.

Al igual que vimos con la función que hicimos de delay necesitamos declara nuestra función al inicio.
void GPIOC_Init (void);

Una vez declarada la función ya podemos crearla y completarla, y queda de la siguiente forma
void GPIOC_Init (void)
{
    RCC -> APB2ENR |= RCC_APB2ENR_IOPEN; //Init clock Port C
    GPIOC -> CRH |= GPIO_CRH_MODE13; //Pin 13, puerto C: General purpose push-pull / 50MHz
}

De igual manera vamos a crear una función blink, que va a contener la rutina que hace parpadear el LED.

También al principio tenemos que declara la función.
void led_Blink (void);

Luego ya podemos crearla y rellenarla.
void led_Blink (void)
{
    //Pone el pin en LOW
    GPIOC -> BSRR |= GPIO_BSRR_BR13;
    delay (2000000);
    //Pone el pin en HIGH
    GPIOC -> BSRR |= GPIO_BSRR_BR13;
    delay (2000000);
}

El código completo queda de la siguiente manera. Estad atentos a todas las referencias a registros que aparecen a lo largo del código.
#include "stm32f10x.h"

// declaracion inicial de funciones
void GPIOC_Init (void);
void led_Blink (void);

void delay (long cycles);


//main
int main (void)
{
    GPIOC_Init(); //llamada a la funcion GPIOC_Init
    
    while (1)
    { //loop
        led_blink(); //llamada a la función led_blink
    }
}

//Funcion para iniciar el GPIO en el puerto C
void GPIOC_Init (void)
{
    RCC -> APB2ENR |= RCC_APB2ENR_IOPEN; //Init clock Port C
    GPIOC -> CRH |= GPIO_CRH_MODE13; //Pin 13, puerto C: General purpose push-pull / 50MHz

}

//Funcion blink para hacer parpadear el led
void led_Blink (void)
{
    //Pone el pin en LOW
    GPIOC -> BSRR |= GPIO_BSRR_BR13;
    delay (2000000);
    //Pone el pin en HIGH
    GPIOC -> BSRR |= GPIO_BSRR_BR13;
    delay (2000000);
}

//Funcion para crear un delay
void delay ( long cycles ){
    while ( cycles > 0 ){
        cycles--;
    }
}
En el siguiente tutorial vamos a ver como conectamos un LED y cómo funcionan físicamente los pines GPIO y su estructura.

Comentarios

Entradas populares de este blog

ARDUINO desde cero: 5 - Comunicación Serial

Evolucionando talado de columna: 1 - Guía laser, planificación y diseño