====== 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/]]