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
- En el STM32CubeMx vamos al menú "Project->Settings"
- 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".
- Vamos al menú "Project->Generate Code" para exportar el proyecto para Atollic.
- Creamos un proyecto nuevo en CoIDE
- 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'".
- Nos habrá activado "COMMON ->CMSIS core", lo deseleccionamos ignorando la advertencia.
- Borramos los archivos de la carpeta que nos ha creado, "cmsis_boot" excepto la carpeta "startup" y su contenido.
- Importamos los archivos creados por el STM32CubeMx. Los podemos arrastrar al proyecto.
- 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"/>
- Desde CoIDE, vamos a la configuración del proyecto haciendo click en el botón derecho sobre la carpeta del proyecto y seleccionando "configuration"
- 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:
- 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".
- 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.
- 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".