Instalando la última versión del compilador
sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
sudo apt-get update
sudo apt-get install gcc-arm-embedded
$ arm-none-eabi-
arm-none-eabi-addr2line arm-none-eabi-elfedit arm-none-eabi-gcc-ranlib arm-none-eabi-ld.bfd arm-none-eabi-size
arm-none-eabi-ar arm-none-eabi-g++ arm-none-eabi-gcov arm-none-eabi-nm arm-none-eabi-strings
arm-none-eabi-as arm-none-eabi-gcc arm-none-eabi-gcov-tool arm-none-eabi-objcopy arm-none-eabi-strip
arm-none-eabi-c++ arm-none-eabi-gcc-5.4.1 arm-none-eabi-gdb arm-none-eabi-objdump
arm-none-eabi-c++filt arm-none-eabi-gcc-ar arm-none-eabi-gprof arm-none-eabi-ranlib
arm-none-eabi-cpp arm-none-eabi-gcc-nm arm-none-eabi-ld arm-none-eabi-readelf
En este momento la versión es la 5.4.1
$ arm-none-eabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-none-eabi-gcc
COLLECT_LTO_WRAPPER=/usr/bin/../lib/gcc/arm-none-eabi/5.4.1/lto-wrapper
Target: arm-none-eabi
Configured with: /build/gcc-arm-none-eabi-6L5Vno/gcc-arm-none-eabi-5-2016q2/src/gcc/configure --target=arm-none-eabi --prefix=/build/gcc-arm-none-eabi-6L5Vno/gcc-arm-none-eabi-5-2016q2/install-native --libexecdir=/build/gcc-arm-none-eabi-6L5Vno/gcc-arm-none-eabi-5-2016q2/install-native/lib --infodir=/build/gcc-arm-none-eabi-6L5Vno/gcc-arm-none-eabi-5-2016q2/install-native/share/doc/gcc-arm-none-eabi/info --mandir=/build/gcc-arm-none-eabi-6L5Vno/gcc-arm-none-eabi-5-2016q2/install-native/share/doc/gcc-arm-none-eabi/man --htmldir=/build/gcc-arm-none-eabi-6L5Vno/gcc-arm-none-eabi-5-2016q2/install-native/share/doc/gcc-arm-none-eabi/html --pdfdir=/build/gcc-arm-none-eabi-6L5Vno/gcc-arm-none-eabi-5-2016q2/install-native/share/doc/gcc-arm-none-eabi/pdf --enable-languages=c,c++ --enable-plugins --disable-decimal-float --disable-libffi --disable-libgomp --disable-libmudflap --disable-libquadmath --disable-libssp --disable-libstdcxx-pch --disable-nls --disable-shared --disable-threads --disable-tls --with-gnu-as --with-gnu-ld --with-newlib --with-headers=yes --with-python-dir=share/gcc-arm-none-eabi --with-sysroot=/build/gcc-arm-none-eabi-6L5Vno/gcc-arm-none-eabi-5-2016q2/install-native/arm-none-eabi --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-pkgversion='GNU Tools for ARM Embedded Processors' --with-multilib-list=armv6-m,armv7-m,armv7e-m,armv7-r,armv8-m.base,armv8-m.main
Thread model: single
gcc version 5.4.1 20160609 (release) [ARM/embedded-5-branch revision 237715] (GNU Tools for ARM Embedded Processors)
De esta forma pueden compilar para todos los fabricantes de ARM, aunque sólo he probado para TI, ST, Nordic (nrf51822) y ATMEL (sólo compilando ejemplos que vienen en el SDK - xdk-asf-3.31.0).
Y aquí viene el extra:
¿Cómo programar con Pascal tus ARM Cortex M?La respuesta es ..... con freepascal.
Nota:Lo pongo en el mismo hilo porque están ligados, ya que se necesita el arm-non-eabi- para usarlo con freepascal
http://wiki.freepascal.org/TARGET_Embeddedhttp://j-software.dk/stm32f103.phpTambién cuenta con soporte para los pic32mx y pic32mz
http://wiki.freepascal.org/TARGET_Embedded_MipselSegún la wiki de freepascal tienen un limitado soporte de microcontroladores de NXP LPC, ATMEL AT91, TI Stellares y STM32F10x.
Nota de Freepascal: "Todavía esta en desarrollo"
El primer paso es descargar la última versión de freepascal de
https://sourceforge.net/projects/lazarus/files/Lazarus%20Linux%20amd64%20DEB/Lazarus%201.6/ para x86_64
o
https://sourceforge.net/projects/lazarus/files/Lazarus%20Linux%20i386%20DEB/Lazarus%201.6/ para x86 (i386)
Los archivos a descargar son el fpc y el fpc-src, pero si quieren tener el IDE Lazarus para programar aplicaciones al estilo Delphi descargan lazarus.
Cuando terminen la descarga abren una terminal en el directorio donde fueron descargados los archivos .deb. Estando en ese directorio ejecutan
sudo dpkg -i *.deb
Ya instalado vamos a crear dos carpetas
mkdir ~/lab
En seguida en cualquier otro directorio descargamos la rama trunk de freepascal
svn co http://svn.freepascal.org/svn/fpc/trunk fpc
y compilamos
cd fpc
make clean buildbase installbase CROSSINSTALL=1 CROSSOPT="-XParm-none-eabi-" OS_TARGET=embedded CPU_TARGET=arm SUBARCH=armv7m INSTALL_PREFIX=~/lab
Esto les va a crear una serie de directorios dentro de la carpeta ~/lab que fue creada con anterioridad
.
├── bin
└── lib
└── fpc
├── 3.0.0
└── 3.1.1
├── ppcrossarm
└── units
└── arm-embedded
└── rtl
ppcrossarm es nuestro compilador. Creamos un enlace simbólico en la carpeta bin que se encuentra dentro de ~/lab/bin
ln -s ~/lab/lib/fpc/3.1.1/ppcrossarm ~/lab/bin/ppcrossarm
Para poder compilar lo más sencillo es crear otro enlace simbólico de la carpeta lib/fpc/3.1.1 a la ruta donde freepascal busca por defecto las unidades.
cd /usr/lib/fpc
sudo ln -s /home/<su_home>/lab/lib/fpc/3.1.1 3.1.1
en mi caso la última línea es
sudo ln -s /home/alex/lab/lib/fpc/3.1.1 3.1.1
Para realizar la prueba tomé prestado
el test.pas de
http://j-software.dk/stm32f103.php y el stm32f103fw.pas de
https://github.com/Turro75/stm32lazarustemplate/blob/master/stm32f103fw.pas (mas de 5000 líneas de código)
Después de unos ligeros cambios a stm32f103fw.pas para que compilara, removí la interfaz Serie de test.pas y dejé un sólo LED parpadeando.
program test;
uses stm32f103fw;
procedure RCC_Configure;
begin
RCC_DeInit;
RCC_HSEConfig(RCC_HSE_ON);
// Wait till HSE is ready
if RCC_WaitForHSEStartUp then
begin
// Enable Prefetch Buffer
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
// Flash 2 wait state
FLASH_SetLatency(FLASH_Latency_2);
// HCLK = SYSCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1);
// PCLK2 = HCLK
RCC_PCLK2Config(RCC_HCLK_Div1);
// PCLK1 = HCLK/2
RCC_PCLK1Config(RCC_HCLK_Div2);
// PLLCLK = 8MHz * 9 = 72 MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
// Enable PLL
RCC_PLLCmd(Enabled);
// Wait till PLL is ready
while RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RCC_RESET do;
// Select PLL as system clock source
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
// Wait till PLL is used as system clock source
while RCC_GetSYSCLKSource() <> $08 do;
end;
end;
procedure delay;
var i: longint;
begin
for i := 0 to 50000*9 do;
end;
var GPIO_InitStructure: TGPIO_InitTypeDef;
begin
RCC_Configure;
// Enable clocks
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLED);
GPIO_InitStructure.GPIO_Pin := GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed := GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode := GPIO_Mode_Out_PP;
GPIO_Init(PortB, GPIO_InitStructure);
while true do
begin
GPIO_SetBits(PortB, GPIO_Pin_9);
delay;
GPIO_ResetBits(PortB, GPIO_Pin_9);
delay;
end;
end.
Para compilar el proyecto
~/lab/bin/ppcarm -Parm -Tembedded -Cparmv7m -Wpstm32f103x8 -XParm-none-eabi- -OoNOSTACKFRAME hello.pas
Y si todo ha ido bien veremos en la salida
Free Pascal Compiler version 3.1.1 [2016/06/27] for arm
Copyright (c) 1993-2016 by Florian Klaempfl and others
Target OS: Embedded
Compiling hello.pas
Assembling test
Linking hello
STM32F10X_MD
71 lines compiled, 0.1 sec, 2844 bytes code, 89 bytes data