blob: 63425e61d7800afa0c7ca3e519d9f12072c6743e [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 STM32F4-Discovery - 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 STM32F4-Discovery">
<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" >
Version: 1.3.0
</option>
<option value="/v1_2_0/os/introduction" selected="selected" >
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 >
<a href="../blinky_primo/">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 class="active">
<a href="./">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 STM32F4-Discovery</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/apache/mynewt-site/blob/master/docs/os/tutorials/blinky_stm32f4disc.md"
class="icon icon-github"> Edit on GitHub</a>
</li>
</ul>
</div>
</div>
<div class="alert alert-warning">
<p>
Version 1.2.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-stm32f4-discovery">Blinky, your "Hello World!", on STM32F4-Discovery</h2>
<p>This tutorial shows you how to create, build, and run the Blinky application on the STM32F4-Discovery board.
<br></p>
<p><br></p>
<h3 id="prerequisites">Prerequisites</h3>
<ul>
<li>Meet the prerequisites listed in <a href="/os/tutorials/blinky.md">Project Blinky</a>.</li>
<li>Have a STM32F4-Discovery board.</li>
<li>Have a USB type A to Mini-B cable. </li>
<li>Install a patched version of OpenOCD 0.10.0 described in <a href="/os/get_started/cross_tools/">Install OpenOCD</a>. </li>
</ul>
<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 have a project created. </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 STM32F4-Discovery 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>stm32f4disc_boot</code>:</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt target create stm32f4disc_boot
$ newt target set stm32f4disc_boot app=@apache-mynewt-core/apps/boot
$ newt target set stm32f4disc_boot bsp=@apache-mynewt-core/hw/bsp/stm32f4discovery
$ newt target set stm32f4disc_boot 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>stm32f4disc_blinky</code>:</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt target create stm32f4disc_blinky
$ newt target set stm32f4disc_blinky app=apps/blinky
$ newt target set stm32f4disc_blinky bsp=@apache-mynewt-core/hw/bsp/stm32f4discovery
$ newt target set stm32f4disc_blinky build_profile=debug
</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/stm32f4disc_blinky
app=apps/blinky
bsp=@apache-mynewt-core/hw/bsp/stm32f4discovery
build_profile=debug
targets/stm32f4disc_boot
app=@apache-mynewt-core/apps/boot
bsp=@apache-mynewt-core/hw/bsp/stm32f4discovery
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 stm32f4disc_boot</code> command to build the bootloader:</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt build stm32f4disc_boot
Building target targets/stm32f4disc_boot
Compiling repos/apache-mynewt-core/boot/bootutil/src/image_ec.c
Compiling repos/apache-mynewt-core/boot/bootutil/src/image_ec256.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/boot/bootutil/src/image_rsa.c
Compiling repos/apache-mynewt-core/boot/bootutil/src/image_validate.c
Compiling repos/apache-mynewt-core/boot/bootutil/src/loader.c
...
Archiving sys_flash_map.a
Archiving sys_mfg.a
Archiving sys_sysinit.a
Archiving util_mem.a
Linking ~/dev/myproj/bin/targets/stm32f4disc_boot/app/apps/boot/boot.elf
Target successfully built: targets/stm32f4disc_boot
</code></pre></div>
<p><br>
Run the <code>newt build stm32f4disc_blinky</code> command to build the Blinky application:</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$newt build stm32f4disc_blinky
Building target targets/stm32f4disc_blinky
Compiling apps/blinky/src/main.c
Compiling repos/apache-mynewt-core/hw/bsp/stm32f4discovery/src/sbrk.c
Compiling repos/apache-mynewt-core/hw/bsp/stm32f4discovery/src/system_stm32f4xx.c
Compiling repos/apache-mynewt-core/hw/bsp/stm32f4discovery/src/hal_bsp.c
Assembling repos/apache-mynewt-core/hw/bsp/stm32f4discovery/src/arch/cortex_m4/startup_STM32F40x.s
Compiling repos/apache-mynewt-core/hw/cmsis-core/src/cmsis_nvic.c
Compiling repos/apache-mynewt-core/hw/drivers/uart/src/uart.c
Compiling repos/apache-mynewt-core/hw/drivers/uart/uart_hal/src/uart_hal.c
Compiling repos/apache-mynewt-core/hw/hal/src/hal_common.c
Compiling repos/apache-mynewt-core/hw/hal/src/hal_flash.c
...
Archiving sys_sysinit.a
Archiving util_mem.a
Linking ~/dev/myproj/bin/targets/stm32f4disc_blinky/app/apps/blinky/blinky.elf
Target successfully built: targets/stm32f4disc_blinky
</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 stm32f4disc_blinky 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 stm32f4disc_blinky 1.0.0
App image succesfully generated: ~/dev/myproj/bin/targets/stm32f4disc_blinky/app/apps/blinky/blinky.img
</code></pre></div>
<p><br></p>
<h3 id="connect-to-the-board">Connect to the Board</h3>
<p>Connect a USB type A to Mini-B cable from your computer to the port the board indicated on the diagram: </p>
<p><br>
<br>
<img alt="stm32f4-discovery" src="../pics/stm32f4_disc.jpg" title="Connecting computer to stm32f4disc" /></p>
<p><br></p>
<p>You should see the small PWR red LED light up.</p>
<h3 id="load-the-bootloader-and-the-blinky-application-image">Load the Bootloader and the Blinky Application Image</h3>
<p>Run the <code>newt load stm32f4disc_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 stm32f4disc_boot
Loading bootloader
</code></pre></div>
<p>Note: If you are using Windows and get an <code>open failed</code> or <code>no device found</code> error, you will need to install the usb driver. Download <a href="http://zadig.akeo.ie">Zadig</a> and run it:</p>
<ul>
<li>Select Options &gt; List All Devices.</li>
<li>Select <code>STM32 STLink</code> from the drop down menu.</li>
<li>Select the <code>WinUSB</code> driver.</li>
<li>Click Install Driver.</li>
<li>Run the <code>newt load stm32f4disc_boot</code> command again.</li>
</ul>
<p>Note: If you are running Linux and get an <code>open failed</code> message, there are two common issues with this board. If you have a board produced before mid-2016, it is likely that you have an older version of the ST-LINK programmer. To correct this, open the <code>repos/apache-mynewt-core/hw/bsp/stm32f4discovery/f4discovery.cfg</code> file in a text editor, and change the line:</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>source [find interface/stlink-v2-1.cfg]
</code></pre></div>
<p>to:</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>source [find interface/stlink-v2.cfg]
</code></pre></div>
<p>If you receive an error like <code>libusb_open() failed with LIBUSB_ERROR_ACCESS</code>, it means that your <code>udev</code> rules are not correctly set up for this device. You can find some example <code>udev</code> rules for ST-LINK programmers <a href="https://github.com/texane/stlink/tree/master/etc/udev/rules.d">here</a>.</p>
<p><br>
Run the <code>newt load stm32f4disc_blinky</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 stm32f4disc_blinky
Loading app image into slot 1
</code></pre></div>
<p>You should see the small green LD4 LED on the board blink!</p>
<p>Note: If the LED does not blink, try resetting your board.</p>
<p><br></p>
<p>If you want to erase the flash and load the image again, start a debug session, and enter <code>mon stm32f2x mass_erase 0</code> 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>
<p><br></p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$newt debug stm32f4disc_blinky
[~/dev/myproj/repos/apache-mynewt-core/hw/bsp/stm32f4discovery/stm32f4discovery_debug.sh ~/dev/myproj/repos/apache-mynewt-core/hw/bsp/stm32f4discovery ~/dev/myproj/bin/targets/stm32f4disc_blinky/app/apps/blinky/blinky]
Open On-Chip Debugger 0.10.0
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 2000 kHz
adapter_nsrst_delay: 100
none separate
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
Info : clock speed 1800 kHz
Info : STLINK v2 JTAG v25 API v2 SWIM v14 VID 0x0483 PID 0x374B
Info : using stlink api v2
Info : Target voltage: 2.881129
Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints
target halted due to debug-request, current mode: Thread
...
Reading symbols from ~/dev/myproj/bin/targets/stm32f4disc_blinky/app/apps/blinky/blinky.elf...done.
target halted due to debug-request, current mode: Thread
xPSR: 0x41000000 pc: 0x08021e90 psp: 0x20002290
Info : accepting &#39;gdb&#39; connection on tcp/3333
Info : device id = 0x10076413
Info : flash size = 1024kbytes
0x08021e90 in __WFI () at repos/apache-mynewt-core/hw/cmsis-core/src/ext/core_cmInstr.h:342
342 __ASM volatile (&quot;wfi&quot;);
(gdb) mon stm32f2x mass_erase 0
stm32x mass erase complete
stm32x mass erase complete
(gdb)
</code></pre></div>
<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>