blob: 53dedac45685e513bfff94c71669d4ddabd64945 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- This is broken by doc revisioning.
-->
<link rel="shortcut icon" href="../../../img/favicon.ico">
<title>Blinky on Arduino Primo - Apache Mynewt</title>
<link href="../../../css/bootstrap-3.0.3.min.css" rel="stylesheet">
<link rel="stylesheet" href="../../../css/highlight.css">
<link href="../../../css/base.css" rel="stylesheet">
<link href="../../../css/custom.css" rel="stylesheet">
<link href="../../../css/v2.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
<script>
(function(i, s, o, g, r, a, m) {
i["GoogleAnalyticsObject"] = r;
(i[r] =
i[r] ||
function() {
(i[r].q = i[r].q || []).push(arguments);
}),
(i[r].l = 1 * new Date());
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, "script", "//www.google-analytics.com/analytics.js", "ga");
ga("create", "UA-72162311-1", "auto");
ga("send", "pageview");
</script>
</head>
<body class="Blinky on Arduino Primo">
<div class="container">
<div class="row v2-main-banner">
<a class="logo-cell" href="/">
<img class="logo" src="/img/logo.png">
</a>
<div class="tagline-cell">
<h4 class="tagline">An OS to build, deploy and securely manage billions of devices</h4>
</div>
<div class="news-cell">
<div class="well">
<h4>Latest News:</h4> <a href="/download">Apache Mynewt 1.12.0, Apache NimBLE 1.7.0 </a> released (April 4, 2024)
</div>
</div>
</div>
</div>
<nav id="navbar" class="navbar navbar-inverse affix-top" data-spy="affix" data-offset-top="150" role="navigation">
<div class="container">
<!-- Collapsed navigation -->
<div class="navbar-header">
<!-- Expander button -->
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<!-- Expanded navigation -->
<div class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav navbar-right">
<li
class=""
>
<a href="/"><i class="fa fa-home" style="font-size: larger;"></i></a>
</li>
<li
class="important"
>
<a href="/quick-start/">Quick Start</a>
</li>
<li
class=""
>
<a href="/about/">About</a>
</li>
<li
class=""
>
<a href="/talks/">Talks</a>
</li>
<li
class="active"
>
<a href="/documentation/">Documentation</a>
</li>
<li
class=""
>
<a href="/download/">Download</a>
</li>
<li
class=""
>
<a href="/community/">Community</a>
</li>
<li
class=""
>
<a href="/events/">Events</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container">
<div class="row">
<div class="col-md-3 v2-sidebar sidebar-container"><div id="docSidebar" class="hidden-print" role="complementary">
<div class="top">
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<div class="form-group">
<input type="text" name="q" class="form-control" placeholder="Search documentation" />
</div>
</form>
</div>
</div>
<ul class="toc-nav">
<li class="doc-version"><select class="form-control" onchange="if (this.value) window.location.href=this.value">
<option value="/latest">
Version: master
</option>
<option value="/v1_12_0/" >
Version: 1.12.0
</option>
<option value="/v1_11_0/" >
Version: 1.11.0
</option>
<option value="/v1_10_0/" >
Version: 1.10.0
</option>
<option value="/v1_9_0/" >
Version: 1.9.0
</option>
<option value="/v1_8_0/" >
Version: 1.8.0
</option>
<option value="/v1_7_0/" >
Version: 1.7.0
</option>
<option value="/v1_6_0/" >
Version: 1.6.0
</option>
<option value="/v1_5_0/" >
Version: 1.5.0
</option>
<option value="/v1_4_0/" >
Version: 1.4.0
</option>
<option value="/v1_3_0/os/introduction" selected="selected" >
Version: 1.3.0
</option>
<option value="/v1_2_0/os/introduction" >
Version: 1.2.0
</option>
<option value="/v1_1_0/os/introduction" >
Version: 1.1.0
</option>
<option value="/v1_0_0/os/introduction" >
Version: 1.0.0
</option>
<option value="/v0_9_0/os/introduction" >
Version: 0.9.0
</option>
</select></li>
<li ><a href="../../introduction/">Mynewt Documentation</a>
<ul>
<li ><a href="../../get_started/get_started/">Basic Setup</a>
</li>
<li >
<a href="../../get_started/vocabulary/">Concepts</a>
</li>
<li ><a href="../tutorials/">Tutorials</a>
<ul>
<li ><a href="../blinky/">Project Blinky</a>
<ul>
<li >
<a href="../arduino_zero/">Blinky on Arduino Zero</a>
</li>
<li class="active">
<a href="./">Blinky on Arduino Primo</a>
</li>
<li >
<a href="../olimex/">Blinky on Olimex</a>
</li>
<li >
<a href="../nRF52/">Blinky on nRF52 DK</a>
</li>
<li >
<a href="../rbnano2/">Blinky on RedBear Nano 2</a>
</li>
<li >
<a href="../blinky_stm32f4disc/">Blinky on STM32F4-Discovery</a>
</li>
<li >
<a href="../blinky_console/">Add Console and Shell to Blinky</a>
</li>
</ul>
</li>
<li ><a href="../repo/add_repos/">Work with repositories</a>
</li>
<li ><a href="../project-slinky/">Project Slinky for Remote Comms</a>
</li>
<li><a href="
../ble_bare_bones/
">Bluetooth Low Energy</a>
</li>
<li><a href="
../lora/lorawanapp/
">LoRa</a>
</li>
<li><a href="
../event_queue/
">OS Fundamentals</a>
</li>
<li><a href="
../add_newtmgr/
">Remote Device Management</a>
</li>
<li><a href="
../sensors/sensors/
">Sensors</a>
</li>
<li><a href="
../segger_rtt/
">Tooling</a>
</li>
<li><a href="
../codesize/
">Other</a>
</li>
</ul>
</li>
<li ><a href="../../os_user_guide/">OS User Guide</a>
</li>
<li><a href="
../../../network/ble/ble_intro/
">BLE User Guide</a>
</li>
<li ><a href="../../../newt/newt_intro/">Newt Tool Guide</a>
</li>
<li ><a href="../../../newtmgr/overview/">Newt Manager Guide</a>
</li>
<li >
<a href="../../../known_issues/">Known Issues</a>
</li>
</ul>
</li>
<li><a href="
../../../newt/install/prev_releases/
">Appendix</a>
</li>
</ul>
</div></div>
<div class="col-md-9" role="main">
<div class="doc-header">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="/documentation/">Docs</a></li>
<li>&raquo; <a href="os/tutorials/blinky/">Project Blinky</a></li>
<li>&raquo; <a href="os/tutorials/tutorials/">Tutorials</a></li>
<li>&raquo; <a href="os/introduction/">Mynewt Documentation</a></li>
<li>&raquo; Blinky on Arduino Primo</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/apache/mynewt-site/blob/master/docs/os/tutorials/blinky_primo.md"
class="icon icon-github"> Edit on GitHub</a>
</li>
</ul>
</div>
</div>
<div class="alert alert-warning">
<p>
Version 1.3.0 is not the most recent version of the Apache Mynewt
documentation. Click <a href="/latest">here</a> to read the latest
version.
</p>
</div>
<h2 id="blinky-your-hello-world-on-arduino-primo">Blinky, your "Hello World!", on Arduino Primo</h2>
<p>This tutorial shows you how to create, build, and run the Blinky application on an Arduino Primo board.</p>
<p>Note that the Mynewt OS will run on the nRF52 chip in the Arduino Primo board. However, the board support package for the Arduino Primo is different from the nRF52 dev kit board support package.
<br></p>
<h3 id="prerequisites">Prerequisites</h3>
<ul>
<li>Meet the the prerequisites listed in <a href="/os/tutorials/blinky.md">Project Blinky</a>.</li>
<li>Have an Arduino Primo board.</li>
<li>Install a debugger. Choose one of the two options below: Option 1 requires additional hardware but very easy to set up. </li>
</ul>
<p><br></p>
<h5 id="option-1">Option 1</h5>
<ul>
<li><a href="https://www.segger.com/jlink-debug-probes.html">Segger J-Link Debug Probe</a> - any model (this tutorial has been tested with J-Link EDU and J-Link Pro)</li>
<li><a href="https://www.segger.com/jlink-adapters.html#CM_9pin">J-Link 9 pin Cortex-M Adapter</a> that allows JTAG, SWD and SWO connections between J-Link and Cortex M based target hardware systems</li>
<li>Install the <a href="https://www.segger.com/jlink-software.html">Segger JLINK Software and documentation pack</a>. </li>
</ul>
<h5 id="option-2">Option 2</h5>
<p>This board requires a patch version of OpenOCD 0.10.0 that is in development. See <a href="/os/get_started/cross_tools.md">Install OpenOCD</a> instructions to install it if you do not have this version installed.</p>
<p>You can now use openocd to upload to Arduino Primo board via the USB port itself.</p>
<h3 id="create-a-project">Create a Project</h3>
<p>Create a new project if you do not have an existing one. You can skip this step and proceed to <a href="#create_targets">create the targets</a> if you already created a project.</p>
<p>Run the following commands to create a new project:</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code> $ 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
$
</code></pre></div>
<p><br></p>
<h3 id="create-the-targets"><a name="create_targets"></a>Create the Targets</h3>
<p>Create two targets for the Arduino Primo board - one for the bootloader and one for the Blinky application.</p>
<p>Run the following <code>newt target</code> commands, from your project directory, to create a bootloader target. We name the target <code>primo_boot</code>.</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt target create primo_boot
$ newt target set primo_boot app=@apache-mynewt-core/apps/boot bsp=@apache-mynewt-core/hw/bsp/arduino_primo_nrf52 build_profile=optimized
</code></pre></div>
<p><br>
Run the following <code>newt target</code> commands to create a target for the Blinky application. We name the target <code>primoblinky</code>.</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt target create primoblinky
$ newt target set primoblinky app=apps/blinky bsp=@apache-mynewt-core/hw/bsp/arduino_primo_nrf52 build_profile=debug
</code></pre></div>
<p><br>
If you are using openocd, run the following <code>newt target set</code> commands:</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt target set primoblinky syscfg=OPENOCD_DEBUG=1
$ newt target set primo_boot syscfg=OPENOCD_DEBUG=1
</code></pre></div>
<p><br>
You can run the <code>newt target show</code> command to verify the target settings:</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt target show
targets/my_blinky_sim
app=apps/blinky
bsp=@apache-mynewt-core/hw/bsp/native
build_profile=debug
targets/primo_boot
app=@apache-mynewt-core/apps/boot
bsp=@apache-mynewt-core/hw/bsp/arduino_primo_nrf52
build_profile=optimized
targets/primoblinky
app=@apache-mynewt-core/apps/blinky
bsp=@apache-mynewt-core/hw/bsp/arduino_primo_nrf52
build_profile=optimized
</code></pre></div>
<p><br></p>
<h3 id="build-the-target-executables">Build the Target Executables</h3>
<p>Run the <code>newt build primo_boot</code> command to build the bootloader:</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt build primo_boot
Building target targets/primo_boot
Compiling repos/apache-mynewt-core/boot/bootutil/src/image_rsa.c
Compiling repos/apache-mynewt-core/boot/bootutil/src/image_ec256.c
Compiling repos/apache-mynewt-core/crypto/mbedtls/src/aes.c
Compiling repos/apache-mynewt-core/apps/boot/src/boot.c
Compiling repos/apache-mynewt-core/boot/bootutil/src/image_ec.c
Compiling repos/apache-mynewt-core/boot/bootutil/src/loader.c
Compiling repos/apache-mynewt-core/boot/bootutil/src/bootutil_misc.c
...
Archiving sys_mfg.a
Archiving sys_sysinit.a
Archiving util_mem.a
Linking ~/dev/myproj/bin/targets/primo_boot/app/apps/boot/boot.elf
Target successfully built: targets/primo_boot
</code></pre></div>
<p><br>
Run the <code>newt build primoblinky</code> command to build the Blinky application:</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt build primoblinky
Building target targets/primoblinky
Compiling repos/apache-mynewt-core/hw/drivers/uart/src/uart.c
Assembling repos/apache-mynewt-core/hw/bsp/arduino_primo_nrf52/src/arch/cortex_m4/gcc_startup_nrf52.s
Compiling repos/apache-mynewt-core/hw/bsp/arduino_primo_nrf52/src/sbrk.c
Compiling repos/apache-mynewt-core/hw/cmsis-core/src/cmsis_nvic.c
Assembling repos/apache-mynewt-core/hw/bsp/arduino_primo_nrf52/src/arch/cortex_m4/gcc_startup_nrf52_split.s
Compiling apps/blinky/src/main.c
Compiling repos/apache-mynewt-core/hw/drivers/uart/uart_bitbang/src/uart_bitbang.c
Compiling repos/apache-mynewt-core/hw/bsp/arduino_primo_nrf52/src/hal_bsp.c
Archiving sys_mfg.a
Archiving sys_sysinit.a
Archiving util_mem.a
Linking ~/dev/myproj/bin/targets/primoblinky/app/apps/blinky/blinky.elf
Target successfully built: targets/primoblinky
</code></pre></div>
<p><br></p>
<h3 id="sign-and-create-the-blinky-application-image">Sign and Create the Blinky Application Image</h3>
<p>Run the <code>newt create-image primoblinky 1.0.0</code> command to create and sign the application image. You may assign an arbitrary version (e.g. 1.0.0) to the image.</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt create-image primoblinky 1.0.0
App image succesfully generated: ~/dev/myproj/bin/targets/primoblinky/app/apps/blinky/blinky.img
</code></pre></div>
<p><br></p>
<h3 id="connect-to-the-board">Connect to the Board</h3>
<ul>
<li>Connect a micro USB cable to the Arduino Primo board and to your computer's USB port.</li>
<li>If you are using the Segger J-Link debug probe, connect the debug probe to the JTAG port on the Primo board using the Jlink 9-pin adapter and cable. Note that there are two JTAG ports on the board. Use the one nearest to the reset button as shown in the picture. </li>
</ul>
<p><img alt="J-Link debug probe to Arduino" src="../pics/primo-jlink.jpg" title="Connecting J-Link debug probe to Arduino Primo" /></p>
<p><strong>Note:</strong> If you are using the OpenOCD debugger, you do not need to attach this connector. </p>
<h3 id="load-the-bootloader">Load the Bootloader</h3>
<p>Run the <code>newt load primo_boot</code> command to load the bootloader onto the board:</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt load primo_boot
Loading bootloader
$
</code></pre></div>
<p><strong>Note:</strong> If you are using OpenOCD on a Windows platform and you get an <code>unable to find CMSIS-DAP device</code> error, you will need to download and install the mbed Windows serial port driver from <a href="https://developer.mbed.org/handbook/Windows-serial-configuration">https://developer.mbed.org/handbook/Windows-serial-configuration</a>. Follow the instructions from the site to install the driver. Here are some additional notes about the installation:</p>
<ol>
<li>The instructions indicate that the mbed Windows serial port driver is not required for Windows 10. If you are using Windows 10 and get the <code>unable to find CMSIS-DAP device</code> error, we recommend that you install the driver.</li>
<li>
<p>If the driver installation fails, we recommend that you download and install the Arduino Primo CMSIS-DAP driver. Perform the following steps: </p>
<ul>
<li>Download the <a href="https://github.com/runtimeco/openocd-binaries/raw/master/arduino_primo_drivers.zip">Arduino Primo CMSIS-DAP driver</a> and extract the zip file.</li>
<li>Start Device Manager.</li>
<li>Select <strong>Other Devices</strong> &gt; <strong>CMSIS-DAP CDC</strong> &gt; <strong>Properties</strong> &gt; <strong>Drivers</strong> &gt; <strong>Update Driver...</strong>.</li>
<li>Select <strong>Browse my computer for driver software</strong>.</li>
<li>Select the Arduino Driver folder where extracted the drivers to (check the include subfolders). Click <strong>Next</strong> to install the driver.</li>
</ul>
</li>
</ol>
<p>Run the <code>newt load primo_boot</code> command again.</p>
<p><br></p>
<h3 id="load-the-blinky-application-image">Load the Blinky Application Image</h3>
<p>Run the <code>newt load primoblinky</code> command to load the Blinky application image onto the board.</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt load primoblinky
Loading app image into slot 1
$
</code></pre></div>
<p>You should see the orange LED (L13), below the ON LED, on the board blink!</p>
<p>Note: If the LED does not blink, try resetting the board.</p>
<p><br></p>
<h3 id="erase-flash">Erase Flash</h3>
<p>If you want to erase the flash and load the image again, use JLinkExe and issue the <code>erase</code> command when you are using the Jlink debug probe: </p>
<p><strong>Note:</strong> On Windows: Run the <code>jlink</code> command with the same arguments from a Windows Command Prompt terminal.
<br></p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ JLinkExe -device nRF52 -speed 4000 -if SWD
SEGGER J-Link Commander V5.12c (Compiled Apr 21 2016 16:05:51)
DLL version V5.12c, compiled Apr 21 2016 16:05:45
Connecting to J-Link via USB...O.K.
Firmware: J-Link OB-SAM3U128-V2-NordicSemi compiled Mar 15 2016 18:03:17
Hardware version: V1.00
S/N: 682863966
VTref = 3.300V
Type &quot;connect&quot; to establish a target connection, &#39;?&#39; for help
J-Link&gt;erase
Cortex-M4 identified.
Erasing device (0;?i?)...
Comparing flash [100%] Done.
Erasing flash [100%] Done.
Verifying flash [100%] Done.
J-Link: Flash download: Total time needed: 0.363s (Prepare: 0.093s, Compare: 0.000s, Erase: 0.262s, Program: 0.000s, Verify: 0.000s, Restore: 0.008s)
Erasing done.
J-Link&gt;exit
$
</code></pre></div>
<p><br></p>
<p>If you are using the OpenOCD debugger, run the <code>newt debug primoblinky</code> command and issue the highlighted command at the (gdb) prompt:</p>
<p><strong>Note:</strong> 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, 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.</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$newt debug primoblinky
[~/dev/myproj/repos/apache-mynewt-core/hw/bsp/arduino_primo_nrf52/primo_debug.sh ~/dev/myproj/repos/apache-mynewt-core/hw/bsp/arduino_primo_nrf52 ~/dev/myproj/bin/targets/primoblinky/app/apps/blinky/blinky]
Open On-Chip Debugger 0.10.0-dev-snapshot (2017-03-28-11:24)
...
os_tick_idle (ticks=128)
at repos/apache-mynewt-core/hw/mcu/nordic/nrf52xxx/src/hal_os_tick.c:200
warning: Source file is more recent than executable.
200 if (ticks &gt; 0) {
<span style="background-color: #ffffcc">(gdb) mon nrf52 mass_erase
</span></code></pre></div>
<p><br></p>
<div class="row">
<ul class="nav nav-pills" style="margin-bottom: 10px">
<li>
</li>
<li class="pull-right">
</li>
</ul>
</div>
<footer class="row">
<div class="col-xs-12">
<p class="copyright">Apache Mynewt is available under Apache License, version 2.0.</p>
</div>
<div class="col-xs-12">
<div class="logos">
<a href="https://www.apache.org/">
<img src="/img/asf_logo_wide_small.png" alt="Apache" title="Apache">
</a>
<p>
Copyright © 2015-2021 The Apache Software Foundation.<br>
<small class="footnote">
Apache Mynewt, Mynewt, Apache, the Apache feather logo, and the Apache Mynewt
project logo are either registered trademarks or trademarks of the Apache
Software Foundation in the United States and other countries.
</small>
</p>
<a href="">
<img src="https://www.countit.com/images/add_to_slack.png" alt="Slack Icon" title="Join our Slack Community" />
</a>
</div>
</div>
<a href="https://www.apache.org/licenses/">
<button class="button-footer-asf">
License
</button>
</a>
<a href="https://www.apache.org/foundation/sponsorship.html">
<button class="button-footer-asf">
Sponsorship
</button>
</a>
<a href="https://www.apache.org/foundation/thanks.html">
<button class="button-footer-asf">
Thanks
</button>
</a>
<a href="https://www.apache.org/security/">
<button class="button-footer-asf">
Security
</button>
</a>
<a href="https://apache.org/events/current-event">
<button class="button-footer-asf">
ASF Events
</button>
</a>
</footer>
</div>
</div>
</div>
<script src="../../../js/jquery-1.10.2.min.js"></script>
<script src="../../../js/bootstrap-3.0.3.min.js"></script>
<script src="../../../js/highlight.pack.js"></script>
<script src="../../../js/base.js"></script>
<script src="../../../js/custom.js"></script>
<script src="search/main.js"></script>
</body>
</html>