====== Programación ARM Cortex-M ======
Desarrollo software en microcontroladores ARM Cortex-M sobre las plataformas de ST:
* [[pub:stm32f3disco|STM32F3 Discovery]]
* [[pub:stm32f4disco|STM32F4 Discovery]]
* [[pub:stm32f429idisco|STM32F429ZI Discovery]]
* [[pub:stm32l4disco|STM32L476 Discovery]]
Se describen aquí los siguientes procesos:
- [[pub:armst#instalacion_de_herramientas|Instalación de herramientas]]
- [[pub:armst#manejo_de_herramientas|Manejo básico de herramientas]]
- [[pub:armst#ejemplos_de_programacion|Ejemplos de programación]]
y ejemplos:
* [[pub:stm32-vcp|STM32F429IDisco: USB-VCP]]
===== 1. Instalación de herramientas =====
El proceso de instalación descrito parte de un sistema operativo Linux basado en Debian.
Si bien no se descarta la posibilidad de instalación y ejecución correcta de las herramientas en sistemas operatiovs Windows, no se relata aquí y se recomienda la forma descrita sobre un sistema dedicado o máquina virtual tipo VirtualBox como la proporcionada **[[pub:dglab|aquí]]** que incluye todas las herramientas preinstaladas.
==== 1.1. IDE ====
El entorno de desarrollo a utilizar es **Eclipse IDE** con herramientas de desarrollo para **C/C++** denominado **Eclipse CDT**:\\
[[http://www.eclipse.org/cdt/|http://www.eclipse.org/cdt/]]\\
Descargar de la ubicación anterior e instalar en una carpeta independiente, p.ej. ''/opt/Arm/eclipse''
Como requisito para ejecutar correctamente Eclipse, y la herramienta STM32CubeMX que utilizaremos después, es necesario tener instalado **Oracle Java Runtime Environment (JRE) 7 or 8** en la versión de 32bit o 64bit que corresponda, puede utilizarse alternativamente en Linux OpenJDK en la correspondiente versión compatible:\\
[[http://www.java.com|http://www.java.com]]\\
==== 1.2. ARM plugin ====
Para programar en C/C++ con Eclipse IDE en microprocesadores ARM Cortex-M necesitamos instalar un plugin específico de Eclipse, siguiendo los siguiente pasos:
* Opción de menú Help → Install New Software…
* Ventana Install → botón Add…
* Caja Name: ''GNU ARM Eclipse Plug-ins''
* Caja Location: ''[[http://gnuarmeclipse.sourceforge.net/updates|http://gnuarmeclipse.sourceforge.net/updates]]''
* Botón OK
* En la ventana de salida, seleccionar todos e instalar con botón Next
Más info y tutorial en [[http://gnuarmeclipse.github.io/plugins/install/|http://gnuarmeclipse.github.io/plugins/install/]]
==== 1.3. ARM toolchain ====
Se recomienda utilizar el conjunto de herramientas de desarrollo **GNU Tools for ARM Embedded Processors** en su última versión desde:\\
[[http://launchpad.net/gcc-arm-embedded]]\\
Nota importante: recordar la ruta de instalación asignada para indicar en el asistente de Eclipse, p.ej. ''/opt/Arm/gcc'' !!
==== 1.4. Depurador ====
Utilizaremos como herramienta de depuración **OpenOCD** en su última versión desde:\\
[[http://openocd.sourceforge.net/]]\\
Nota importante: recordar la ruta de instalación asignada, p.ej. ''/opt/Arm/openocd'' !!\\
A continuación establecer **permisos** para conexión de la tajeta por el puerto USB mediante archivo de reglas en ''/etc/udev/rules.d'' , p.ej.:
sudo cp /opt/Arm/openocd/0.9.0/contrib/99-openocd.rules \
/etc/udev/rules.d/
sudo udevadm control --reload-rules
Configurar Eclipse para operar con OpenOCD:
* Menú Preferences → Run/Debug → String Substitutions
* Caja openocd_path, botón Edit…
* Caja Value: ruta al archivo binario openocd en al ruta guardada de la instalación, p.ej. ''/opt/openocd/0.9.0/bin''
* Caja openocd_executable: nombre del ejecutable, p.ej. ''openocd''
* Botón OK
==== 1.5. Emulador ====
Es posible realizar la emulación del procesador ARM Cortex M3 con la herramienta QEMU, instalando ésta desde:\\
[[https://sourceforge.net/projects/gnuarmeclipse/files/QEMU/GNU%20Linux/]]\\
Nota importante: recordar la ruta de instalación asignada, p.ej. ''/opt/Arm/qemu'' !!\\
Configurar Eclipse para operar con QEMU:
* Menú Preferences → Run/Debug → QEMU
* Caja openocd_path, botón Edit…
* Caja Executable: nombre del ejecutable, p.ej. ''qemu''
* Caja Folder: carpeta del ejecutable, p.ej. ''/opt/Arm/qemu/bin''
* Botón Apply → OK
==== 1.6. Generador de código STM32CubeMX ====
Instalación de herramienta STM32Cube desde:\\
[[http://www.st.com/stm32cube]][[http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1533/PF259242?sc=stm32cube#|STM32CubeMX v.4.8.0]]\\
También como plugin de Eclipse:\\
[[http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1533/PF257931|STSW-STM32095]]
==== 1.7. Programador ST-LINKv2 ====
La programación directa en flash de archivos binarios puede realizarse con la utilidad de ST para programación y depuración en circuito [[http://www.st.com/web/catalog/tools/FM146/CL1984/SC720/SS1450/PF251168|ST-LINK/V2]], que en Linux tiene su correspondiente utilidad compatible descargable desde:\\
[[https://github.com/texane/stlink|https://github.com/texane/stlink]]\\
Como requisito es necesario instalar librerías con dependencia de USB 1.0, para compilar el código fuente y posteriormente reglas para el acceso a la tarjeta, todo junto sería:
sudo apt-get install libusb-1.0-0-dev git pkg-config
git clone https://github.com/texane/stlink stlink.git
cd stlink.git
./autogen.sh
./configure
make
sudo make install
sudo cp *.rules /etc/udev/rules.d
sudo restart udev
==== 1.8. Uso de herramientas en máquina virtual con VirtualBox ====
Se han detectado problemas en el uso de la herramientas que requieren el uso de dispositivos conectados a puertos USB, para tareas de depuración y grabación esenciales, que impiden la captura de dichos dispositivo en el sistema huesped Linux bajo sistema principal Windows 7.
Para solucionar este problema se recomienda:
* En la configuración de la máquina virtual, apartado USB, agregar un filtro USB vacio sin más propiedades que las de defecto.
* Ejecutar la máquina virtual con permisos de administrador.
==== 1.9. System Workbench for STM32 ====
Este entorno integrado libre de desarrollo incluye las herramientas anteriormente descritas en una sola instalación con unos scripts de asistencia en el desarrollo. Las herramientas incluidas son:
* Base de datos de dispositivos STM32 y librerías
* Editor de código (Eclipse Luna)
* Generación de guión de enlazado (Linker script)
* Building tools (GCC-based cross compiler, assembler, linker)
* Debugging tools (OpenOCD, GDB)
* Flash programing tools
* Documentación
Descargas en:
* 32 bits: [[http://www.ac6-tools.com/downloads/SW4STM32/install_sw4stm32_linux_32bits-latest.run|Linux 32 bits ]][[http://www.ac6-tools.com/downloads/SW4STM32/install_sw4stm32_win_32bits-latest.exe|Windows 7 32 bits]]
* 64 bits: [[http://www.ac6-tools.com/downloads/SW4STM32/install_sw4stm32_linux_64bits-latest.run|Linux 64 bits ]][[http://www.ac6-tools.com/downloads/SW4STM32/install_sw4stm32_win_64bits-latest.exe|Windows 7 64 bits]]
==== 1.10. STM32CubeMX ====
Se trata de una herramienta gráfica de configuración, que genera el código en lenguaje C de inicialización necesario, para un sistema basado en plataformas hardware de STM32, mediante asistentes gráficos.\\
El código generado se utilizará a modo de plantilla dentro de Eclipse para construir la aplicación final, a partir de las librerías comunes configuradas en ambos entornos.\\
* Información y descarga en: [[http://www.st.com/stm32cube-pr2|http://www.st.com/stm32cube-pr2]]\\
* Tutorial de diseño con STM32CubeMX incluyendo **FreeRTOS** en: [[http://www.freertos.org/FreeRTOS-Plus/BSP_Solutions/st/STM32CubeMX.html]]\\
==== 1.11. ARM/uClinux ====
Un conjunto de herramientas para compilar código ARM bajo uClinux si pretendemos incluir este sistema operativo en una plataforma STM32 como la STM32F429I-Disco.
=== Toolchain ===
Se ha probado con éxito la versión siguiente de Mentor Graphics (evitar SourceryG++ arm-2011.03):\\
[[https://sourcery.mentor.com/public/gnu_toolchain/arm-uclinuxeabi/arm-2010q1-189-arm-uclinuxeabi-i686-pc-linux-gnu.tar.bz2|arm-2010q1-189-arm-uclinuxeabi-i686-pc-linux-gnu.tar.bz2]]\\
Instalación:
tar jxvf arm-2010q1-189-arm-uclinuxeabi-i686-pc-linux-gnu.tar.bz2
export PATH=`pwd`/arm-2010q1/bin:$PATH
=== U-Boot, uClinux, BusyBox ===
git clone https://github.com/robutest/u-boot.git
git clone https://github.com/robutest/uclinux.git
wget http://busybox.net/downloads/busybox-1.22.1.tar.bz2
==== 1.10. STM32CubeMX ====
Se trata de una herramienta gráfica de configuración, que genera el código en lenguaje C de inicialización necesario, para un sistema basado en plataformas hardware de STM32, mediante asistentes gráficos.\\
El código generado se utilizará a modo de plantilla dentro de Eclipse para construir la aplicación final, a partir de las librerías comunes configuradas en ambos entornos.
* Información y descarga en: [[http://www.st.com/stm32cube-pr2|http://www.st.com/stm32cube-pr2]]
* Tutorial de diseño con STM32CubeMX incluyendo **FreeRTOS** en: [[http://www.freertos.org/FreeRTOS-Plus/BSP_Solutions/st/STM32CubeMX.html|http://www.freertos.org/FreeRTOS-Plus/BSP_Solutions/st/STM32CubeMX.html]]
==== 1.11. ARM/uClinux ====
Un conjunto de herramientas para compilar código ARM bajo uClinux si pretendemos incluir este sistema operativo en una plataforma STM32 como la STM32F429I-Disco.
=== Toolchain ===
Se ha probado con éxito la versión siguiente de Mentor Graphics (evitar SourceryG arm-2011.03): \\ [[https://sourcery.mentor.com/public/gnu_toolchain/arm-uclinuxeabi/arm-2010q1-189-arm-uclinuxeabi-i686-pc-linux-gnu.tar.bz2|arm-2010q1-189-arm-uclinuxeabi-i686-pc-linux-gnu.tar.bz2]] \\
Instalación:
tar jxvf arm-2010q1-189-arm-uclinuxeabi-i686-pc-linux-gnu.tar.bz2
export PATH=`pwd`/arm-2010q1/bin:$PATH
=== U-Boot, uClinux, BusyBox ===
git clone https://github.com/robutest/u-boot.git
git clone https://github.com/robutest/uclinux.git
wget http://busybox.net/downloads/busybox-1.22.1.tar.bz2
=== stm32f429-linux-builder ===
git clone https://github.com/jserv/stm32f429-linux-builder
make
make install
==== 1.12. Con Matlab/Simulink ====
[[http://www.st.com/en/development-tools/stm32-mat-target.html]]
[[http://es.mathworks.com/matlabcentral/fileexchange/43093-embedded-coder-support-package-for-stmicroelectronics-discovery-boards]]
[[https://es.mathworks.com/help/supportpkg/stmicroelectronicsstm32f4discovery/examples.html]]
[[https://es.mathworks.com/help/supportpkg/stmicroelectronicsstm32f4discovery/examples/getting-started-with-embedded-coder-support-package-for-stmicroelectronics-stm32-discovery-boards.html]]
[[https://es.mathworks.com/help/supportpkg/stmicroelectronicsstm32f4discovery/examples/parametric-audio-equalizer-for-stm32-discovery-boards.html]]
[[https://www.youtube.com/watch?v=qNWsp3TyI1Y]]
===== 2. Manejo de herramientas =====
Tutorial de uso en [[:pub:dglab#stm32|dglab 1.0]] de CubeMX SW4STM32 (EclipseCDT Ac6)
===== 3. Ejemplos de programación =====
==== 3.0. Componentes y capas de firmware ====
{{:pub:e22644e6c535646941072c74cb7829c0.png?direct&800}}
De acuerdo a esta figura, habría que añadir a un nuevo proyecto C los archivos fuente generados por la herramienta CubeMX, más los necesarios dependientes de la plataforma/tarjeta:
* ''startup_stm32f4xx.S'', si existe en la carpeta de fuentes del proyecto, con ''.S'' no .s para Eclipse
* ''stm32f4_discovery*'' (.h y .c) de ''Drivers/BSP/STM32F4-Discovery/''
* **componentes** del **BSP**, p.ej. acelerómetro, audio, etc. (.h y .c) **específicos** de ''Drivers/BSP/Components/'' y **comunes** de ''Drivers/BSP/Components/Common/''
* **componentes** de **Middleware**, p.ej. USB, audio, etc. (.h y .c) específicos de ST de ''Middlewares/ST/STM32_USB_Device_Library/*''
===== Referencias =====
[[http://stm32f4-discovery.com/|http://stm32f4-discovery.com/]] \\
[[http://armcortexm.blogs.upv.es/|http://armcortexm.blogs.upv.es/]]