sábado, 10 de agosto de 2013

Cortex M4. Hi World!

Stellaris LM4F120 LaunchPad Evaluation Board (EK-LM4F120XL)
Vamos a ver como hacer un maravilloso blink LED con un ARM Cortex M4, muy poquita cosa para este dispositivo, pero el objetivo es familiarizarse un poco con el IDE Code Composer Studio de TI y con la sintaxis que utiliza para su programación quedándonos con la parte fundamental para este ejercicio (GPIO, Interrupciones).



Para hacer este pequeño ejercicio se ha usado la placa de desarrollo Stellaris LM4F120.

No voy a explicar como arrancar un nuevo proyecto en CCSv5, pero si es tu primera toma de contacto con el IDE te recomiendo una lectura a la wiki de Texas. Lo mejor y mas facil para empezar un proyecto es que copies el proyecto con el nombre "Project0" que viene con el paquete para Stellaris, todas las librerias y sus rutas están linkadas al proyecto y no vas a perder tiempo con eso.

Es importante tener el datasheet del procesador cerca para entender bien que significan las diferentes lineas de código, además no disponemos de pdf que describan las funciones, navegaremos dentro de las diferentes librerias para conocer para que sirve cada uno de los parámetros que se le pasa a la función.

Nuestra función principal será muy sencilla, solo tendrá una función de configuración, encargada de gestionar los GPIO y las INT (pines de entrada y salida y las interrupciones).

La función de interrupción será la encargada de apagar y encender el LED con los siguientes comandos. TODO lo comento para que quede autoexplicado.


NOTA: No es buena praxis hacer tareas en la función de la interrupción, pero en este caso pasamos un poco de eso.

Lo siguiente es importante porque es un poco particular, el archivo "startup_css.c" es un archivo para la configuración de las interrupciones.

1º Añadimos una función "externa" a este fichero correspondiente a "Timer0IntHandler".
2º En la tabla de vectores hay que indicar donde queremos que vaya el proceso cuando se produce una interrupción producida por el Timer0.


Una vez tenemos main y el manejador de la interrupción listos vamos a explicar la función de configuración, que tiene el siguiente aspecto.


Lo primero que yo quiese saber cuando vi la sintaxis es, que significaba cada cosa, viniendo de Microchip yo solía navegar en su extensa documentación en pdfs. La tendencia ahora es que todo quede explicado en el propio código.

Simplemente si queremos buscar que significa SYSCTL_RCG2R_R le damos al botón derecho "Open Declaration" y vemos a que dirección apunta e incluso explicaciones.

Para este caso concreto vemos que tiene una dirección específica (0x400FE108). Es hora de mirar en el datasheet del dispositivo. Los registros con una dirección base y un offset es lo que tenemos que buscar para comprender el significado del código. para este caso basta con buscar "offset 108" y encontramos el registro correpondiente. Como podemos ver si le asignamos el valor 0x00000020 activamos el puerto F que es el que vamos a utilizar para el blink, precisamente SYSCTL_RCGC2_GPIOF al que se iguala tiene ese valor (podemos comprabarlo haciendo el mismo proceso que con SYSCTL_RCG2R_R).

Para el caso de las funciones ROM_***, nos lleva a un archivo rom.h. Para encontrar que significa cada parámetro de la función vamos al archivo que contiene esa función dentro de "Includes"/../StellarisWare/Driverlib, por ejemplo, SysCtlPeripheralEnable corresponde al archivo "SysCtl.c", TimerConfigure se encuentra en el archivo "timer.c".



Una vez sabemos que buscar, como buscar y donde buscar no es más que leer leer y leer. Os dejo el proyecto para descargarlo.







No hay comentarios:

Publicar un comentario