Si has probado la herramienta STM32CubeMX te habrás enamorado de ella. Simplifica muchísimo toda la configuración inicial del código.

El problema viene a la hora de exportar el proyecto (ver manual del STM32CubeMX) si no dispones de un entorno de pago.

Este post es para ayudar a exportar cualquier proyecto de GCC al entorno libre CoIDE de CooCox. En este ejemplo es un proyecto de TrueStudio.

Pasos

  1. En el STM32CubeMx vamos al menú "Project->Settings"
  2. Elegimos el Toolchain "Atollic TrueStudio" y seleccionamos la opción de copiar sólo las librerías necesarias en la pestaña de "Code Generator".
  3. Vamos al menú "Project->Generate Code" para exportar el proyecto para Atollic.
  4. Creamos un proyecto nuevo en CoIDE
  5. Desde el CoIDE, añadimos los repositorios "BOOT -> CMSIS BOOT" y "COMMON -> C Library". Este último puede que no sea necesario, pero hay veces que quita errores de compilación del tipo "sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'".
  6. Nos habrá activado "COMMON ->CMSIS core", lo deseleccionamos ignorando la advertencia.
  7. Borramos los archivos de la carpeta que nos ha creado, "cmsis_boot" excepto la carpeta "startup" y su contenido.
  8. Importamos los archivos creados por el STM32CubeMx. Los podemos arrastrar al proyecto.
  9. En la carpeta donde hayamos exportado el proyecto de Atollic, buscamos el archivo  ".cproject" dentro de la carpeta TrueSTUDIO y lo editamos. Realizamos un búsqueda del texto "com.atollic.truestudio.gcc.symbols.defined" (podemos dejar las comillas), hasta que nos aparezca algo como:
    <option id="com.atollic.truestudio.gcc.symbols.defined.661170442" superClass="com.atollic.truestudio.gcc.symbols.defined" valueType="definedSymbols">
           <listOptionValue builtIn="false" value="USE_STDPERIPH_DRIVER"/>
           <listOptionValue builtIn="false" value=""/>
           <listOptionValue builtIn="false" value="STM32F40XX"/>
           <listOptionValue builtIn="false" value="test_file_settings"/>
  10. Desde CoIDE, vamos a la configuración del proyecto haciendo click en el botón derecho sobre la carpeta del proyecto y seleccionando "configuration"
  11. En la pestaña "Compile" hacemos click en el botón "add" de "Defined Simbols" y ponemos todos los elementos del archivo ".cproject" (uno por cada vez que le demos a "add"). En el ejemplo anterior, crearíamos USE_STDPERIPH_DRIVER, STM32F40XX y test_file_settings.

Una vez hecho esto, ya nos debería compilar el proyecto.

Posibles Errores

Strexb y strexh

Si nos da el error Error: registers may not be the same -- `strexb r3,r2,[r3]'  y/o Error: registers may not be the same -- `strexh r3,r2,[r3]' se debe a que el archivo "core_cm3" no está actualizado. Para ello, en repositorios, vuelve a activar "COMMON ->CMSIS core" y elimina la carpeta con los archivos originales.

Otra opción es modificar el archivo "core_cm3.c". Para ello realiza un búsqueda de strexb o de strexh hasta que encuentres algo así:

/**
 * @brief  STR Exclusive (8 bit)
 *
 * @param  value  value to store
 * @param  *addr  address pointer
 * @return        successful / failed
 *
 * Exclusive STR command for 8 bit values
 */
uint32_t __STREXB(uint8_t value, uint8_t *addr)
{
   uint32_t result=0;
   __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
   return(result);
}
/**
 * @brief  STR Exclusive (16 bit)
 *
 * @param  value  value to store
 * @param  *addr  address pointer
 * @return        successful / failed
 *
 * Exclusive STR command for 16 bit values
 */
uint32_t __STREXH(uint16_t value, uint16_t *addr)
{
   uint32_t result=0;
   __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
   return(result);
}

Lo que hay que hacer es añadir el "&" que está en negrita en el "=&r"

Puede que siga dando un error de múltiples definiciones de varias funciones terminadas en "Handler". Comenta las funciones en los archivos terminados en "_it.c" e "_it.h".

Unknown type name

Si os sale el error "error: unknown type name 'uint32_t'", o cualquier otro tipo de variable, puede ser por:

  1. No haber incluido las librerías de C en el proyecto: Vamos a la configuración del proyecto, para ello clic con el botón derecho sobre el proyecto, "Configuration". Hacemos click en la pestaña "Link" y en el desplegable "library:" seleccionamos "Use base C library".
  2. No haber incluido la libería "stdint.h" en el archivo: añadimos #include <stdint.h> al principio del archivo que nos esté dando error.
  3. No haber definido la versión de C: Vamos a la configuración del proyecto, para ello clic con el botón derecho sobre el proyecto, "Configuration". Hacemos click en la pestaña "Compile" y, o bien activamos la casilla "Support C++" si hay directivas de C++, o bien, escribimos "-std=c99" sin las comillas en la barra "Misc Controls" si es C del 99 (o el que sea).

Errores de instrucciones

Cuando sale el error:

Error: selected processor does not support Thumb mode `vstmdbeq r0!,{s16-s31}'
Error: instruction not allowed in IT block -- `stmdb r0!,{r4-r11,r14}'
Error: selected processor does not support Thumb mode `vldmiaeq r0!,{s16-s31}'
Error: instruction not allowed in IT block -- `msr psp,r0'

Se debe a que tenemos que activar las instrucciones en coma flotante en el compilador: Vamos a la configuración del proyecto, para ello clic con el botón derecho sobre el proyecto, "Configuration". Hacemos click en la pestaña "Compile" y escribimos "-mfloat-abi=softfp" sin las comillas en la barra "Misc Controls" o activamos el tipo de FPU que queramos en el desplegable "FPU" de "Options".