En anteriores post referentes al uso de OpenOCD nos dimos cuenta, que en lugar de pasar comandos al momento de invocarlo en la terminal, decidimos crear un archivo especial con terminacion .cfg que contenia dichos comandos y de esa manera nos ahorraria tener que esribirlos continuamente.

Bueno pues con el uso de gdb es probable que tambien hayas notado el uso de ciertos comandos que repetimos en cada proyecto y muy probablemente te estes preguntando si se podra haser lo mismo que con OpenOCD y de ese modo evitar la fatiga.

Recordemos un poco el anterior post de Semihosting. Una vez ya compilado nuestro programa y conectados a la tarjeta con OpenOCD, era el turno de gdb.

Damos inicio a un interesante viaje directo a las entrañas inhóspitas de los microcontroladores y su parte más importante, Su CPU. Que en este caso sera un Cortex-M0.

En esta nueva serie de posts aprenderemos a programar en ensamblador un micro con un cpu Cortex-M0, como el que tiene el micro de nuestra tarjeta Nucleos-f072rb.

Ensamblador, debes estar bromeando, eso es cosa de la prehistoria!!!!.

Mmmmm No. Es verdad que mayormente se prefiere crear programas en un lenguaje como C, pero el ensamblador no esta desfasado y mucho menos obsoleto. Elejimos ensamblador porque es la mejor manera de conocer el funcionamiento a detalle de la máquina que estas programando, y a mayor nivel de conocimiento, mayor de nivel de control y confiabilidad tendrán sobre tus programas.

No voy a entrar en detalles describiendo la arquitectura del micro y como estan constituidas sus diferentes partes, para eso existe un excelente libro que lo explica a mucho mayor detalle de lo que lo haría yo. The Definitive Guide to the ARM Cortex-M0.

Si has tenido la oportunidad de programar en C para la computadora, entonces de seguro conocerás la función printf. Esta función no es ninguna instrucción de C pero si es parte de la libreria estandar de C.

Sin entrar en mucho detalles la función printf nos permite por lo general mandar información por pantalla. En la computadora típicamente es el monitor.

Cualquier compilador decente de C para cualquier plataforma, trae esta librería estándar incluida. El compilador GNU ARM no es la excepcion y podremos, en nuestro programa utilizar la función printf. ¿Pero como?, si nuestro micro no tiene una pantalla!!.

Bueno nuestro micro no, pero la computadora que usamos para programar y debuggear si. Podemos usar el debugger ( en el caso de la tarjeta Nucleo-f072rb es el ST-Link ) para mandar la informacion de la función printf de nuestro programa a la pantalla de OpenOCD.

Crearemos un nuevo proyecto con CMSIS incluido, como en el post Primer Programa con CMSIS. Llamaremos a ese proyecto test_semihosting, y en el archivo main.c escribimos lo siguiente

Continuamos con GDB y en esta ocasion veremos como observar el contenido de las variables y de los registros. Seguiremos retomando el programa que usamos en la primera parte.

Lo primero que haremos sera modificar un poco nuestro prgrama, agregaremos unas variables que seran las que observemos. Abre el archivo main.c con tu editor favorito y modificalo de la siguiete manera

main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "stm32f072xb.h"

#define LED_PIN 5

unsigned long uno = 0; /*variable iniciada a cero*/
unsigned long dos = 2; /*variable iniciada a dos*/

int main ( void )
{
    volatile unsigned long i;
    unsigned long tres;  /*variable con valor incial indeterminado*/


    /* Enable GPIOA clock */
    RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
    /* Configure GPIOA pin 5 as output */
    GPIOA->MODER |= (1 << (LED_PIN << 1));
    /* Configure GPIOA pin 5 in max speed */
    GPIOA->OSPEEDR |= (3 << (LED_PIN << 1));

    for(;;)
    {
        /* Toggle pin 5 from port A */
        GPIOA->ODR ^= (1 << LED_PIN);
        /*incrementamos variables de prueba*/
        uno++;     /*incremento en uno*/
        dos += 2;  /*incremento en dos*/
        tres++;    /*incremnteo en uno*/
        /* simple and practical delay */
        for(i=0;i<300000;i++);
    }
}

Llegó el momento de sacar mayor provecho al programador de nuestra tarjeta y es que nos solo sirve para programar. ST-Link nos sirve para depurar nuestro programa, realizar cosas como ejecuciones paso a paso, colocar breakpoints, revisar el contenido de una variable o registro, etc.

Antes de empezar deberemos tener un proyecto con el cual trabajar, así que tomaremos el proyecto del post Primer Programa con CMSIS. Asegúrate de que compile sin errores ( puedes probarlo antes en la tarjeta ).

Bien, hora de conectarse a nuestra Nucleo-f072 usando OpenOCD

1
2
$ cd ~/test_f072 #recuerda que debemos estar en la carpeta del proyecto
$ sudo openocd -f interface/stlink-v2-1.cfg -f target/stm32f0x_stlink.cfg