Durante estas ultimas semanas he estado probando un poco más a fondo la placa STM32F0DISCOVERY, y la verdad que aunque al principio la programación se me hacia complicada, al final se basa en lo mismo que todos los microcontroladores, buscar el registro del periferico que queremos configurar en el datasheet, y asignar valores a los diferentes bits. En un principio habia pensado en hacer los programas utilizando ciertas librerias que nos da ST, pero eso haria necesario saber como funciona la libreria, sin embargo de la otra forma, tan solo he de ir al datasheet y buscar el registro que quiero. Es cierto que de esta forma, el código no queda tan simple a primera vista, pero es lo mejor si luego queremos migrar a otro microcontrolador.
El primer ejemplo que he realizado es muy básico, y se trata de un hola mundo en el que parpadea un led, en principio con una frecuencia sin determinar. Lo primero que hay que hacer es habilitar la señal de reloj para el puerto que queramos utilizar. Esto, para el puerto C lo hacemos desde el registro AHBENR poniendo el bit del GPIOC a 1. Lo siguiente es configurar el puerto, para ello, aunque existen bastantes registros, en principio solo nos vamos a fijar en 2:
- GPIOx_MODER, con el que le diremos si el pin es de entrada, salida, función alternativa (SPI, UART...), o si se va a utilizar como entrada analógica.
- GPIOx_OTYPER, mediante el cual, si el pin está configurado como salida, le decimos que tipo de salida queremos, push-pull o drenador abierto.
Una vez hemos configurado el puerto, podemos proceder a escribir en el, y esto se puede hacer 2 formas diferentes, utilizando instrucciones atomicas (se ejecutan en un ciclo de reloj), o no utilizándolas, así pues, si las queremos utilizar existe 1 registro que debemos modificar:
- GPIOx_BSRR, el cual es un registro de 32 bits que dividido en 2 partes, los 16 bits de la parte alta llamados BRx (x = nº de pin), ponen a cero el pin que seleccionemos, es decir si queremos poner el GPIOC2 a cero, pues asignaremos a este registro 0x0200, y la parte baja, llamados BSx, ponen a uno el bit seleccionado. Como he dicho, esto se realiza en una sola instrucción.
En cambio, si nos da lo mismo utilizar instrucciones atomicas que no, existen otro registro que hace la misma función que este:
- GPIOx_ODR, (Output Data Register), desde el cual podemos escribir directamente el valor que queramos en el bit correspondiente, ya sea un 1 o un 0.
En el caso de que queramos leer el valor de un pin utilizaremos el registro:
- GPIOx_IDR, (Input Data Register), el cual simplemente leemos el bit que queremos del puerto y ya está.
En el programa que os pongo a continuación, en lugar de poner directamente e valor del registro, utilizo unos defines que están en la librería stm32f0xx.h, los cuales mediante or, vamos aponiendo los diferentes bits a una o cero.
//============================================================================= // Autor: P.Trujillo // mipsandchips.blogspot.com.es // Parpadeo de los leds de la placa discovery alternativamente //============================================================================= #include "stm32f0xx.h" //============================================================================= // main function //============================================================================= int main(void) { int led_stat = 0; RCC->AHBENR |= RCC_AHBENR_GPIOCEN ; //Habilitamos el reloj para el puerto C GPIOC->MODER = GPIO_MODER_MODER8_0 | GPIO_MODER_MODER9_0; //Puerto C8 y C9 como salida GPIOC->ODR = GPIO_ODR_8|GPIO_ODR_9; while (1) { GPIOC->ODR = GPIO_ODR_8|!GPIO_ODR_9; delay(); GPIOC->ODR = !GPIO_ODR_8|GPIO_ODR_9; delay(); } } //============================================================================= // End of file //=============================================================================La función delay() en principio puede ser un simple for que genere un retardo en el procesador. Como veis no es diferente de la programación de PIC, ni de os TMS320 de TI. Seguiré poniendo más ejemplos para estos ARM pronto!
No hay comentarios:
Publicar un comentario