| Blinky, your "Hello World!", on Arduino Zero |
| -------------------------------------------- |
| |
| .. include common.rst |
| |
| This tutorial shows you how to create, build and run the Blinky |
| application on an Arduino Zero board. |
| |
| .. contents:: |
| :local: |
| :depth: 2 |
| |
| Prerequisites |
| ~~~~~~~~~~~~~ |
| |
| - Meet the prerequisites listed in :doc:`Project Blinky <blinky>`. |
| - Have an Arduino Zero board. |
| Note: There are many flavors of Arduino. Make sure you are using an |
| Arduino Zero. See below for the versions of Arduino Zero that are |
| compatible with this tutorial. |
| - Install the :doc:`OpenOCD debugger <../../get_started/native_install/cross_tools>`. |
| |
| This tutorial uses the Arduino Zero Pro board. The tutorial has been |
| tested on the following three Arduino Zero boards - Zero, M0 Pro, and |
| Zero-Pro. |
| |
| .. figure:: ../../images/Zero_Usb_Ports.jpg |
| :alt: Arduino Zero |
| :width: 200 |
| :align: left |
| |
| .. figure:: ../../images/Arduino-M0Pro-flat.jpg |
| :alt: Arduino M0 Pro |
| :width: 160 |
| :align: left |
| |
| .. figure:: ../../images/ArduinoZeroPro-flat-org.jpg |
| :alt: Arduino Zero Pro |
| :width: 160 |
| |
| Mynewt has not been tested on Arduino M0 which has no internal debugger |
| support. |
| |
| Create a Project |
| ~~~~~~~~~~~~~~~~ |
| |
| Create a new project if you do not have an existing one. You can skip |
| this step and proceed to `Fetch External Packages`_ if |
| you already created a project. |
| |
| Run the following commands to create a new project: |
| |
| .. code-block:: console |
| |
| $ mkdir ~/dev |
| $ cd ~/dev |
| $ newt new myproj |
| Downloading project skeleton from apache/mynewt-blinky... |
| Installing skeleton in myproj... |
| Project myproj successfully created. |
| $ cd myproj |
| $ newt install |
| apache-mynewt-core |
| $ |
| |
| Fetch External Packages |
| ~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Mynewt uses source code provided directly from the chip manufacturer for |
| low level operations. Sometimes this code is licensed only for the |
| specific manufacturer of the chipset and cannot live in the Apache |
| Mynewt repository. That happens to be the case for the Arduino Zero |
| board which uses Atmel SAMD21. Runtime's github repository hosts such |
| external third-party packages and the newt tool can fetch them. |
| |
| To fetch the package with MCU support for Atmel SAMD21 for Arduino Zero |
| from the Runtime git repository, you need to add the repository to the |
| ``project.yml`` file in your base project directory. |
| |
| Here is an example ``project.yml`` file with the Arduino Zero repository |
| added. The sections with ``mynewt_arduino_zero`` that need to be added |
| to your project file are highlighted. |
| |
| **Note:** On Windows platforms: You need to set ``vers`` to ``0-dev`` |
| and use the latest master branch for both repositories. |
| |
| .. code-block:: yaml |
| :emphasize-lines: 6,14-18 |
| |
| # project.yml |
| project.name: "my_project" |
| |
| project.repositories: |
| - apache-mynewt-core |
| - mynewt_arduino_zero |
| |
| repository.apache-mynewt-core: |
| type: github |
| vers: 1-latest |
| user: apache |
| repo: mynewt-core |
| |
| repository.mynewt_arduino_zero: |
| type: github |
| vers: 1-latest |
| user: runtimeco |
| repo: mynewt_arduino_zero |
| |
| Install the project dependencies using the ``newt install`` command |
| (you can specify ``-v`` for verbose output): |
| |
| .. code-block:: console |
| |
| $ newt install |
| apache-mynewt-core |
| mynewt_arduino_zero |
| $ |
| |
| **NOTE:** If there has been a new release of a repo used in your project |
| since you last installed it, the ``1-latest`` version for the repo in |
| the ``project.yml`` file will refer to the new release and will not |
| match the installed files. In that case you will get an error message |
| saying so and you will need to run ``newt upgrade`` to overwrite the |
| existing files with the latest codebase. |
| |
| You need to create two targets for the Arduino Zero Pro board, one |
| for the bootloader and one for the Blinky application. |
| |
| Run the following ``newt target`` commands, from your project |
| directory, to create a bootloader target. We name the target |
| ``arduino_boot``. |
| |
| .. code-block:: console |
| |
| $ newt target create arduino_boot |
| $ newt target set arduino_boot bsp=@mynewt_arduino_zero/hw/bsp/arduino_zero |
| $ newt target set arduino_boot app=@apache-mynewt-core/apps/boot |
| $ newt target set arduino_boot build_profile=optimized |
| Target targets/arduino_boot successfully set target.build_profile to optimized |
| $ newt target set arduino_boot syscfg=BSP_ARDUINO_ZERO_PRO=1 |
| Target targets/arduino_boot successfully set target.syscfg to BSP_ARDUINO_ZERO_PRO=1 |
| $ |
| |
| **Note:** If you have an Arduino Zero instead of an Arduino Zero Pro or |
| Arduino M0 Pro board, replace ``BSP_ARDUINO_ZERO_PRO`` with |
| ``BSP_ARDUINO_ZERO`` in the last ``newt target set`` command. |
| |
| These commands perform the following: |
| |
| - Create a target named ``arduino_boot`` for the Arduino Zero |
| Bootloader. |
| - Set the application for the ``arduino_boot`` target to the default |
| Apache Mynewt bootloader (``@apache-mynewt-core/apps/boot``) |
| - Set the board support package for the target to |
| ``@mynewt_arduino_zero/hw/bsp/arduino_zero``. This is a reference to |
| the downloaded Arduino Zero support from Github. |
| - Use the "optimized" build profile for the ``arduino_boot`` target. |
| This instructs Newt to generate smaller and more efficient code for |
| this target. This setting is necessary due to the bootloader's strict |
| size constraints. |
| - Sets the system configuration setting for Board Support Package to |
| support the Arduino Zero Pro. |
| |
| See the :ref:`concepts` for more information on setting options. |
| |
| Create a Target for the Blinky Application |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Run the following ``newt target`` commands to create the |
| Blinky application target. We name the application target |
| ``arduino_blinky``. |
| |
| .. code-block:: console |
| |
| $ newt target create arduino_blinky |
| Target targets/arduino_blinky successfully created |
| $ newt target set arduino_blinky app=apps/blinky |
| Target targets/arduino_blinky successfully set target.app to apps/blinky |
| $ newt target set arduino_blinky bsp=@mynewt_arduino_zero/hw/bsp/arduino_zero |
| Target targets/arduino_blinky successfully set target.bsp to @mynewt_arduino_zero/hw/bsp/arduino_zero |
| $ newt target set arduino_blinky build_profile=debug |
| Target targets/arduino_blinky successfully set target.build_profile to debug |
| $ newt target set arduino_blinky syscfg=BSP_ARDUINO_ZERO_PRO=1 |
| Target targets/arduino_boot successfully set target.syscfg to BSP_ARDUINO_ZERO_PRO=1 |
| $ |
| |
| **Note:** If you have an Arduino Zero instead of a Arduino Zero Pro |
| board, replace ``BSP_ARDUINO_ZERO_PRO`` with ``BSP_ARDUINO_ZERO`` in the |
| last ``newt target set`` command. |
| |
| Build the Bootloader |
| ~~~~~~~~~~~~~~~~~~~~ |
| |
| Run the ``newt build arduino_boot`` command to build the bootloader: |
| |
| .. code-block:: console |
| |
| $ newt build arduino_boot |
| Building target targets/arduino_boot |
| Compiling bin/targets/arduino_boot/generated/src/arduino_boot-sysinit-app.c |
| Compiling repos/apache-mynewt-core/boot/bootutil/src/image_rsa.c |
| Compiling repos/apache-mynewt-core/boot/bootutil/src/image_ec.c |
| Compiling repos/apache-mynewt-core/boot/bootutil/src/image_ec256.c |
| Compiling bin/targets/arduino_boot/generated/src/arduino_boot-sysflash.c |
| Compiling repos/apache-mynewt-core/boot/bootutil/src/image_validate.c |
| Compiling repos/apache-mynewt-core/boot/bootutil/src/bootutil_misc.c |
| Compiling repos/apache-mynewt-core/apps/boot/src/boot.c |
| Compiling repos/apache-mynewt-core/crypto/mbedtls/src/arc4.c |
| Compiling repos/apache-mynewt-core/boot/bootutil/src/loader.c |
| Compiling repos/apache-mynewt-core/crypto/mbedtls/src/aes.c |
| |
| .... |
| |
| Archiving sys_mfg.a |
| Archiving sys_sysinit.a |
| Archiving util_mem.a |
| Linking ~/dev/myproj/bin/targets/arduino_boot/app/apps/boot/boot.elf |
| Target successfully built: targets/arduino_boot |
| |
| Build the Blinky Application |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Run the ``newt build arduino_blinky`` command to build the Blinky |
| application image: |
| |
| .. code-block:: console |
| |
| $ newt build arduino_blinky |
| Building target targets/arduino_blinky |
| Compiling repos/apache-mynewt-core/hw/hal/src/hal_flash.c |
| Compiling apps/blinky/src/main.c |
| Compiling repos/mynewt_arduino_zero/hw/mcu/atmel/samd21xx/src/sam0/drivers/i2s/i2s.c |
| Compiling repos/mynewt_arduino_zero/hw/bsp/arduino_zero/src/hal_bsp.c |
| Compiling repos/mynewt_arduino_zero/hw/mcu/atmel/samd21xx/src/sam0/drivers/i2s/i2s_callback.c |
| Compiling repos/mynewt_arduino_zero/hw/mcu/atmel/samd21xx/src/sam0/drivers/nvm/nvm.c |
| |
| ... |
| |
| Archiving sys_mfg.a |
| Archiving sys_sysinit.a |
| Archiving util_mem.a |
| Linking ~/dev/myproj/bin/targets/arduino_blinky/app/apps/blinky/blinky.elf |
| Target successfully built: targets/arduino_blinky |
| |
| Connect to the Board |
| ~~~~~~~~~~~~~~~~~~~~ |
| |
| Connect your computer to the Arduino Zero (from now on we'll call this |
| the target) with a Micro-USB cable through the Programming Port as shown |
| below. Mynewt will load the image onto the board and debug the target |
| through this port. You should see a green LED come on that indicates the |
| board has power. |
| |
| No external debugger is required. The Arduino Zero comes with an |
| internal debugger that can be accessed by Mynewt. |
| |
| The images below show the Arduino Zero Programming Port. |
| |
| .. figure:: ../../images/Zero_Usb_Ports.jpg |
| :alt: Arduino Zero |
| :width: 280 |
| :align: left |
| |
| .. figure:: ../../images/ArduinoZeroPro-flat-org.jpg |
| :alt: Arduino Zero Pro |
| :width: 240 |
| |
| |
| Load the Bootloader onto the Board |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Run the ``newt load arduino_boot`` command to load the bootloader onto |
| the board: |
| |
| .. code-block:: console |
| |
| $ newt load arduino_boot |
| Loading bootloader |
| $ |
| |
| The bootloader is loaded onto your board succesfully when the |
| ``newt load`` command returns to the command prompt after the |
| ``Loading bootloader`` status message. You can proceed to load and run |
| your Blinky application image (See `Run the Blinky Application`_). |
| |
| If the ``newt load`` command outputs the following error messages, you |
| will need to erase the board. |
| |
| .. code-block:: console |
| |
| $ newt load arduino_boot -v |
| Loading bootloader |
| Error: Downloading ~/dev/myproj/bin/targets/arduino_boot/app/apps/boot/boot.elf.bin to 0x0 |
| Open On-Chip Debugger 0.9.0 (2015-11-15-05:39) |
| Licensed under GNU GPL v2 |
| For bug reports, read |
| http://openocd.org/doc/doxygen/bugs.html |
| Info : only one transport option; autoselect 'swd' |
| adapter speed: 500 kHz |
| adapter_nsrst_delay: 100 |
| cortex_m reset_config sysresetreq |
| Info : CMSIS-DAP: SWD Supported |
| Info : CMSIS-DAP: JTAG Supported |
| Info : CMSIS-DAP: Interface Initialised (SWD) |
| Info : CMSIS-DAP: FW Version = 01.1F.0118 |
| Info : SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 1 TDO = 1 nTRST = 0 nRESET = 1 |
| Info : CMSIS-DAP: Interface ready |
| Info : clock speed 500 kHz |
| Info : SWD IDCODE 0x0bc11477 |
| Info : at91samd21g18.cpu: hardware has 4 breakpoints, 2 watchpoints |
| Error: Target not halted |
| |
| To erase your board, start a debug session and enter the highlighted |
| commands at the ``(gdb)`` prompts: |
| |
| **Note:** On Windows, openocd and gdb are started in separate Windows |
| Command Prompt terminals, and the terminals are automatically closed |
| when you quit gdb. In addition, the output of openocd is logged to the |
| openocd.log file in your project's base directory instead of the |
| terminal. |
| |
| .. code-block:: console |
| |
| $ newt debug arduino_blinky |
| (gdb) mon at91samd chip-erase |
| chip erased |
| chip erased |
| (gdb) x/32wx 0 |
| 0x0: 0xffffffff 0xffffffff 0xffffffff 0xffffffff |
| 0x10: 0xffffffff 0xffffffff 0xffffffff 0xffffffff |
| 0x20: 0xffffffff 0xffffffff 0xffffffff 0xffffffff |
| 0x30: 0xffffffff 0xffffffff 0xffffffff 0xffffffff |
| 0x40: 0xffffffff 0xffffffff 0xffffffff 0xffffffff |
| 0x50: 0xffffffff 0xffffffff 0xffffffff 0xffffffff |
| 0x60: 0xffffffff 0xffffffff 0xffffffff 0xffffffff |
| 0x70: 0xffffffff 0xffffffff 0xffffffff 0xffffffff |
| (gdb) q |
| |
| Run the ``newt load arduino_boot`` command again after erasing the |
| board. |
| |
| :red:`Reminder if you are using Docker`: When working with actual hardware, |
| remember that each board has an ID. If you swap boards and do not |
| refresh the USB Device Filter on the VirtualBox UI, the ID might be |
| stale and the Docker instance may not be able to see the board |
| correctly. For example, you may see an error message like |
| ``Error: unable to find CMSIS-DAP device`` when you try to load or run |
| an image on the board. In that case, you need to click on the USB link |
| in VirtualBox UI, remove the existing USB Device Filter (e.g. "Atmel |
| Corp. EDBG CMSIS-DAP[0101]") by clicking on the "Removes selected USB |
| filter" button, and add a new filter by clicking on the "Adds new USB |
| filter" button. |
| |
| Run the Blinky Application |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| After you load the bootloader successfully onto your board, you can load |
| and run the Blinky application. |
| |
| Run the ``newt run arduino_blinky 1.0.0`` command to build the |
| arduino_blinky target (if necessary), create an image with version |
| 1.0.0, load the image onto the board, and start a debugger session. |
| |
| **Note** The output of the debug session below is for Mac OS and Linux |
| platforms. On Windows, openocd and gdb are started in separate Windows |
| Command Prompt terminals. The output of openocd is logged to the |
| openocd.log file in your project's base directory and not to the |
| terminal. The openocd and gdb terminals will close automatically when |
| you quit gdb. |
| |
| .. code-block:: console |
| |
| $ newt run arduino_blinky 1.0.0 |
| App image succesfully generated: ~/dev/myproj/bin/targets/arduino_blinky/app/apps/blinky/blinky.img |
| Loading app image into slot 1 |
| [~/dev/myproj/repos/mynewt_arduino_zero/hw/bsp/arduino_zero/arduino_zero_debug.sh ~/dev/myproj/repos/mynewt_arduino_zero/hw/bsp/arduino_zero ~/dev/myproj/bin/targets/arduino_blinky/app/apps/blinky/blinky] |
| Open On-Chip Debugger 0.9.0 (2015-11-15-13:10) |
| Licensed under GNU GPL v2 |
| For bug reports, read |
| http://openocd.org/doc/doxygen/bugs.html |
| Info : only one transport option; autoselect 'swd' |
| adapter speed: 500 kHz |
| adapter_nsrst_delay: 100 |
| cortex_m reset_config sysresetreq |
| Info : CMSIS-DAP: SWD Supported |
| Info : CMSIS-DAP: JTAG Supported |
| Info : CMSIS-DAP: Interface Initialised (SWD) |
| Info : CMSIS-DAP: FW Version = 01.1F.0118 |
| Info : SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 1 TDO = 1 nTRST = 0 nRESET = 1 |
| Info : CMSIS-DAP: Interface ready |
| Info : clock speed 500 kHz |
| Info : SWD IDCODE 0x0bc11477 |
| Info : at91samd21g18.cpu: hardware has 4 breakpoints, 2 watchpoints |
| target state: halted |
| target halted due to debug-request, current mode: Thread |
| xPSR: 0x21000000 pc: 0x0000fca6 psp: 0x20002408 |
| GNU gdb (GNU Tools for ARM Embedded Processors) 7.8.0.20150604-cvs |
| Copyright (C) 2014 Free Software Foundation, Inc. |
| License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> |
| This is free software: you are free to change and redistribute it. |
| There is NO WARRANTY, to the extent permitted by law. Type "show copying" |
| and "show warranty" for details. |
| This GDB was configured as "--host=x86_64-apple-darwin10 --target=arm-none-eabi". |
| Type "show configuration" for configuration details. |
| For bug reporting instructions, please see: |
| <http://www.gnu.org/software/gdb/bugs/>. |
| Find the GDB manual and other documentation resources online at: |
| <http://www.gnu.org/software/gdb/documentation/>. |
| For help, type "help". |
| Type "apropos word" to search for commands related to "word"... |
| Reading symbols from ~/dev/myproj/bin/targets/arduino_blinky/app/apps/blinky/blinky.elf...(no debugging symbols found)...done. |
| Info : accepting 'gdb' connection on tcp/3333 |
| Info : SAMD MCU: SAMD21G18A (256KB Flash, 32KB RAM) |
| 0x0000fca6 in os_tick_idle () |
| target state: halted |
| target halted due to debug-request, current mode: Thread |
| xPSR: 0x21000000 pc: 0x000000b8 msp: 0x20008000 |
| target state: halted |
| target halted due to debug-request, current mode: Thread |
| xPSR: 0x21000000 pc: 0x000000b8 msp: 0x20008000 |
| (gdb) r |
| The "remote" target does not support "run". Try "help target" or "continue". |
| (gdb) c |
| Continuing. |
| |
| **NOTE:** The 1.0.0 is the version number to assign to the image. You |
| may assign an arbitrary version number. If you are not providing remote |
| upgrade, and are just developing locally, you can provide 1.0.0 for |
| every image version. |
| |
| If you want the image to run without the debugger connected, simply quit |
| the debugger and restart the board. The image you programmed will come |
| and run on the Arduino on next boot! |
| |
| You should see the LED blink! |