Como indican otras respuestas, desea utilizar arm-none-eabi-gcc
para compilar su código.
Sin embargo, el código compilado (por sí mismo) no hace mucho bien! Necesitas convertirlo a un formato .elf o .hex. Necesitas poder cargarlo en el microcontrolador. Probablemente desee poder depurar el código en el destino.
Recomiendo usar la GNU ARM Embedded Toolchain gratuita. Es sólo la cadena de herramientas; no proporciona un IDE. Es una instalación única, e incluye:
- arm-none-eabi-gcc (para compilar código)
- arm-none-eabi-gdb (para depurar)
- arm-none-eabi-objcopy (para traducir a .hex)
- tamaño de arm-none-eabi (para obtener una lectura de la utilización de la memoria de su código)
- (más)
Lo mantienen los desarrolladores de ARM y está disponible para Windows / MacOS / Linux.
Hay un proyecto separado para el desarrollo de ARM utilizando Eclipse IDE, llamado GNU ARM Eclipse . Incluso si no desea utilizar Eclipse, le recomendamos que escanee su sitio web. Explican cómo instalar GNU ARM Embedded Toolchain, cómo configurar diferentes depuradores, etc.
Por cierto, GNU ARM Eclipse es particularmente bueno para el desarrollo de ST ARM. Ha incorporado scripts de vinculador para las diferentes familias ST, tiene vínculos con las bibliotecas periféricas estándar de ST, etc.
Finalmente, me doy cuenta de que esto pasa por alto la interfaz de programación USB personalizada presentada por Nucleo. Mi opinión personal es que deberías usar estas herramientas estándar en su lugar, principalmente porque terminarás usándolas cuando quieras transferir tu código a una placa que no sea Nucleo.
Respondiendo a su comentario, nunca he visto a.out ("salida del ensamblador") utilizado para los microcontroladores ARM. En mis proyectos, generalmente tengo muchos archivos c, cada uno de los cuales se compila en un archivo objeto. Luego, los objetos se combinan con el enlazador, que genera un archivo hexadecimal o elfo.
Aquí hay información adicional en caso de que ayude:
Mis comandos de compilación son complicados, pero son manejados por mi IDE, por lo que es transparente para mí. Aquí hay un ejemplo para main.c
:
arm-none-eabi-gcc -mcpu = cortex-m3 -mthumb -Og -fmessage-length = 0 -fsigned-char -función-secciones -fdata-secciones -ffreestanding -Wunused -Wuninitialized -Wallra -Wmissing -Declaraciones--Punto de uso -Gratis--Gratis -Galera -DeL -Acceso -Gratis -Acceso -Gratis -Acceso -Gratis -Acceso -Gr. "../include/usb" -I "../ system / include" -I "../ system / include / cmsis" -I "../ system / include / stm32f1-stdperiph" -I "../ system / STM32_USB_Device_Library / Core / inc "-I" ../ system / STM32_USB_Device_Library / Class / cdc / inc "-I" ../ system / STM32_USB_OTG_Driver / inc "-std = gnu11 -Wmissing-prot. -function-cast -MMD -MP -MF "src / main.d" -MT "src / main.o" -c -o "src / main.o" "../src/main.c"
Esto incluye el enganche a las bibliotecas periféricas estándar ("SPL"), opciones para permitir la depuración, etc. ¡Si eliminó todas las inclusiones, advertencias y cosas de SPL (¡pero en realidad no debería eliminar las advertencias!) , todavía te quedan:
arm-none-eabi-gcc -mcpu = cortex-m3 -mthumb -Og -fmessage-length = 0 -fsigned-char -función-secciones -fdata-secciones -freestanding -g3 -std = gnu11 -MMD -MP -MF "src / main.d" -MT "src / main.o" -c -o "src / main.o" "../src/main.c"
Algunos de estos pueden seguir siendo innecesarios, pero te dan una idea de lo que se necesita.
Luego, después de que se crean todos los archivos de objetos, se vinculan así:
(He simplificado el siguiente comando)
Invocando: Cross ARM C ++ Linker
arm-none-eabi-g ++ -mcpu = cortex-m3 -mthumb -Og -fmessage-length = 0 -fsigned-char -función-secciones -fdata-secciones -freestanding -g3 -T mem.ld -T libs .ld -Tections.ld -nostartfiles -Xlinker --gc -ections -L "../ ldscripts" -Wl, -Map, "MotioSens_AP.map" --specs = nano.specs -o "MotioSens_AP.elf". /src/main.o ./{my otros archivos de objetos} .o
Objetivo de construcción terminado: MotioSens_AP.elf
Algunas de las opciones de comando están duplicadas, por lo que podría ser innecesario pasar tanto al compilador como al enlazador. Nuevamente, ya que mi IDE lo maneja, realmente no he prestado atención :)
Estas complejidades en el desarrollo de ARM son una de las razones por las que comencé a usar un IDE (Eclipse, en mi caso).