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.GPIOC -> BSRR |= 0x20000000;
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;
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
}
{
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);
}
{
//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);
//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_IOPCEN; //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_BS13;
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.
// declaracion inicial de funciones
void GPIOC_Init (void);
void led_Blink (void);
void delay (long cycles);
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_IOPCEN; //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_BS13;
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--;
}
}
0 comentarios:
Publicar un comentario