En al entrada en la que hablaba de NETMF, os comenté que existía una placa muy barata con la que se pueden hacer pruebas con este Framework. Hace una semana me llegó a casa (previo pago de 30 euros), un pedido que hice a RS, en el cual iba la susodicha placa STM32F4Discovery, además de su hermana pequeña, la STM32F0Discovery. Las dos placas montan microcontroladores ARM Cortex M, la primera de ellas como ya dije lleva un ARM CORTEX M4 (168MHz, 1MB), los cuales son el tope de gama de la serie CORTEX. La otra de las placas lleva un ARM CORTEX M0 (48MHz, 64kB), el cual se corresponde con la gama más baja de la serie. Como he dicho, el precio de las dos placas, más el iva, más los gastos de envío ha sido de 30 euros, el cual es un precio bajo comparado con casi cualquier placa de desarrollo, incluso sale más barato casi que comprar un Arduino.
Todas las placas discovery, lleva incorporado el programador/depurador STLink, lo que está realmente bien ya que tan solo debemos comprar una placa y podremos empezar a trabajar. Como es habitual, estas placas de desarrollo suelen llevar un hardware muy básico para probar los periféricos. En el caso de la STM32F0 disponemos de 2 leds de usuario, y un pulsador para utilizarlo en nuestros primeros diseños. En el caso de la STM32F4 el hardware del que dispone la placa es bastante completo. Como en el caso anterior disponemos de un pulsador de usuario, 4 leds de usuario además de 2 leds que nos indican el estado de la comunicación USB a través de un puerto USB OTG. Además de esto, dispone también de un acelerómetro (LIS302DL), un micrófono omnidireccional (MP45DT02), y un conversor analógico - digital (CS43L22), el cual va conectado a una salida de audio, con lo que solo con la placa ya podemos desarrollar varios proyectos.
En cuanto a la programación de estas placas, hasta ahora no es que haya encontrado muchos ejemplos por internet, pero hay suficientes para ir tirando. Lo primero que se debe hacer es elegir el IDE que vamos a utilizar para programarlas. En mi caso estoy utilizando Keil uVision, un IDE basado en (oh que sorpresa!) Eclipse, por lo que ya me es algo familiar, aunque poco. El mismo IDE ya nos proporciona ejemlos básicos para casi todos los ARM disponibles del mercado, y son muchisimos porque hay que tener en cuenta la gran cantidad de empresas que los implementan en sus microcontroladores. Después dentro de cada empresa, divide los ejemlos en sus diferentes placas de desarrollo. En el caso de ST podemos encontrar ejemplos para todas las placas discovery, además de otras.
Como he dicho los ejemplos que hay son muy básicos, y se limitan al típico blinky. Aquí os pongo el ejemplo básico que nos da Keil para la STM0Discovery.
void LED_Init (void) { /* Enable clock for GPIOC */ RCC->AHBENR |= (1UL << 19); /* Configure LED (PC.8..9) pins as push-pull outputs */ GPIOC->MODER &= ~((3UL << 2 * 8) | (3UL << 2 * 9)); GPIOC->MODER |= ((1UL << 2 * 8) | (1UL << 2 * 9)); GPIOC->OTYPER &= ~((1UL << 8) | (1UL << 9)); } void LED_On (uint32_t num) { if (num < LED_NUM) { GPIOC->BSRR |= (led_mask[num]); } } void LED_Off (uint32_t num) { if (num < LED_NUM) { GPIOC->BSRR |= (led_mask[num] << 16); } } int main (void) { int32_t num = -1; int32_t dir = 1; uint32_t btns = 0; SystemCoreClockSetHSI(); SystemCoreClockUpdate(); /* Get Core Clock Frequency */ if (SysTick_Config(SystemCoreClock / 1000)) { /* SysTick 1 msec interrupts */ while (1); /* Capture error */ } LED_Init(); BTN_Init(); while(1) { /* Loop forever */ btns = BTN_Get(); /* Read button states */ if (btns != (1UL << 0)) { /* Calculate 'num': 0,1,...,LED_NUM-1,LED_NUM-1,...,1,0,0,... */ num += dir; if (num == LED_NUM) { dir = -1; num = LED_NUM-1; } else if (num < 0) { dir = 1; num = 0; } LED_On (num); Delay( 50); /* Delay 50ms */ LED_Off(num); Delay(450); /* Delay 450ms */ } else { LED_Out (0x0F); Delay(10); /* Delay 10ms */ } } }Parece chino de momento. Además de los ejemplos que nos da Keil, podemos descargarnos desde la página de ST los ejemplos de periféricos para cada placa y para 4 IDEs diferentes, en el caso de la STM32F0 podeis descargar los ejemlos aquí, y para la STM32F4 aquí. En este pack si que hay ejemlos para muchos de los perifericos que dispone el CORTEX M4, GPIO, ADC, DAC, DMA Timers... Estos ejemlos hacen uso de librerias de ST, por lo que como vais a ver son bastante más sencillos. Aunque en esta ocasión el ejemplo lo he programado yo, y lo he cambiado ligeramente del que nos da ST llamado IO_Toogle.
/*
Proyecto: HolaMundo:
Archivo: main1.c
Autor: P.Trujillo
Descripción: Manejo de las salidas digitales de la placa STM32F0Discovery
*/
// Incluimos las librerias básicas
#include "stm32f0xx.h"
#include "stm32f0_discovery.h"
// Incluimos las librerias nuestras
#include "main.h"
// Programa principal
int main(){
init_discovery();
// Poner el led a 1
GPIOC->BSRR = GPIO_Pin_9; // Forma 1
//GPIO_SetBits(GPIOC, GPIO_Pin_9); // Forma 2
// Poner el led a 0
GPIOC->BRR = GPIO_Pin_9;
//GPIO_ResetBits(GPIOC, GPIO_Pin_9);
// Bucle
while(1){
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
{
GPIO_SetBits(GPIOC, GPIO_Pin_8);
GPIO_ResetBits(GPIOC, GPIO_Pin_9);
}
else
{
GPIO_ResetBits(GPIOC, GPIO_Pin_8);
GPIO_SetBits(GPIOC, GPIO_Pin_9);
}
}
}
void init_discovery(){
// Creamos una estructura del tipo GPIO_InitTypeDef para definir el puerto
GPIO_InitTypeDef GPIO_InitStructure;
// Habilitamos el reloj en el puerto GPIOC
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
// Configuramos los pines de los leds
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// Configuramos el pin del pulsador
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIO_StructInit(&GPIO_InitStructure); // establecer valores por defecto
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // PA0 es el pulsador
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // pin como entrada
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // desactivar los pull
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
En proximas entradas haré más ejemlos para poder empezar a desarrollar pequeños proyectos con los microcontroladres ARM.
No hay comentarios:
Publicar un comentario