Blinky, your "Hello World!", on STM32F4-Discovery
This tutorial shows you how to create, build, and run the Blinky application on the STM32F4-Discovery board.
Prerequisites
- Meet the prerequisites listed in Project Blinky.
- Have a STM32F4-Discovery board.
- Have a USB type A to Mini-B cable.
- Install a patched version of OpenOCD 0.10.0 described in Install OpenOCD.
Create a Project
Create a new project if you do not have an existing one. You can skip this step and proceed to create the targets if you already have a project created.
Run the following commands to create a new project:
$ mkdir ~/dev $ cd ~/dev $ newt new myproj Downloading project skeleton from apache/incubator-mynewt-blinky... Installing skeleton in myproj... Project myproj successfully created. $ cd myproj $ newt install apache-mynewt-core $
Create the Targets
Create two targets for the STM32F4-Discovery 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 stm32f4disc_boot
:
$ 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
Run the following newt target
commands to create a target for the Blinky application. We name the target stm32f4disc_blinky
:
$ 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
You can run the newt target show
command to verify the target settings:
$ 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
Build the Target Executables
Run the newt build stm32f4disc_boot
command to build the bootloader:
$ 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
Run the newt build stm32f4disc_blinky
command to build the Blinky application:
$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
Sign and Create the Blinky Application Image
Run the newt create-image stm32f4disc_blinky 1.0.0
command to create and sign the application image. You may assign an arbitrary version (e.g. 1.0.0) to the image.
$newt create-image stm32f4disc_blinky 1.0.0 App image succesfully generated: ~/dev/myproj/bin/targets/stm32f4disc_blinky/app/apps/blinky/blinky.img
Connect to the Board
Connect a USB type A to Mini-B cable from your computer to the port the board indicated on the diagram:
You should see the small PWR red LED light up.
Load the Bootloader and the Blinky Application Image
Run the newt load stm32f4disc_boot
command to load the bootloader onto the board:
$newt load stm32f4disc_boot Loading bootloader
Note: If you are using Windows and get an open failed
or no device found
error, you will need to install the usb driver. Download Zadig and run it:
- Select Options > List All Devices.
- Select
STM32 STLink
from the drop down menu. - Select the
WinUSB
driver. - Click Install Driver.
- Run the
newt load stm32f4disc_boot
command again.
Note: If you are running Linux and get an open failed
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 repos/apache-mynewt-core/hw/bsp/stm32f4discovery/f4discovery.cfg
file in a text editor, and change the line:
source [find interface/stlink-v2-1.cfg]
to:
source [find interface/stlink-v2.cfg]
If you receive an error like libusb_open() failed with LIBUSB_ERROR_ACCESS
, it means that your udev
rules are not correctly set up for this device. You can find some example udev
rules for ST-LINK programmers here.
Run the newt load stm32f4disc_blinky
command to load the Blinky application image onto the board.
$newt load stm32f4disc_blinky Loading app image into slot 1
You should see the small green LD4 LED on the board blink!
Note: If the LED does not blink, try resetting your board.
If you want to erase the flash and load the image again, start a debug session, and enter mon stm32f2x mass_erase 0
at the gdb prompt:
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, 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.
$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 'gdb' 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 ("wfi"); (gdb) mon stm32f2x mass_erase 0 stm32x mass erase complete stm32x mass erase complete (gdb)