はじめに
前回は、wolfBootをNUCLEO-F401REで動作させる準備を行ったので、
今回は、NUCLEO-F401REでwolfBootを動作させてみます。
使用機器
機器 | バージョン |
---|---|
STM32CubeIDE | 1.14.0 |
STM32CubeProgrammer | 2.14.0 |
NUCLEO-F401RE | - |
手順
実行ファイルの作成
wolfBootの実行ファイルにデバッグ情報を追加するためにコンフィグレーションファイルを編集します。
ルートディレクトリにコピーしたコンフィグレーションファイル .config に
DEBUG?=1
を追加します。
ARCH?=ARM
TARGET?=stm32f401
DEBUG?=1
(以下省略)
再度makeします。
wolfBoot $> make clean
wolfBoot $> make
wolfBootの書き込み
STM32CubeProgrammerを使用してwolfBootをNUCLEO-F401REに書き込みます。
書き込むファイルはwolfBoot/factory.binです。
STM32CubeProgrammerとNUCLEO-F401REを接続します。
Erasing & Programmingウィンドウに移動してfactory.binをNUCLEO-F401REに書き込みます。
Start address 0x08000000
として、Start Programmingボタンを押します。
書き込みが完了したら、STM32CubeProgrammerとNUCLEO-F401REを切断します。
プロジェクトの作成
STM32CubeIDEでプロジェクトを作成します。
STM32CubeIDEのメニューから
File -> New -> STM32 Project を選択します。
Target Selectionというウィンドウが表示されるので、NUCLEO-F401REに搭載されているマイコンを選択します。
MCU/MPU Selectorタブで、PRODUCT INFOのSeriesでSTM32F4をチェックします。
MCUs/MPUs Listの中にあるSTM32F401RET6を選択して、Nextボタンを押します。
STM32 Projectウィンドウが表示されるので、Project Nameを入力します。
Targeted Project TypeのEmptyを選択して、Finishボタンを押します。
作成したプロジェクトを使用して、NUCLEO-F401REに接続します。
パソコンにNUCLEO-F401REを接続して、プロジェクトを右クリックして、Debug AsからSTM32 C/C++ Applicationを選択します。
Edit Configurationウィンドウが表示されるので、OKボタン押します。
接続できたらNUCLEO-F401REから切断します。
実行の準備
wolfBootをSTM32CubeIDEで動作させるために必要なファイルを登録します。
必要となるファイルは下記になります。
- wolfBoot/wolfboot.elf
- test-app/image.elf
- wolfBoot/src
boot_arm.c image.c keystore.c loader.c spi_flash.c string.c update_flash.c - wolfBoot/test-app
startup_arm.c app_stm32f401.c led.c system.c timer.c
led.h system.h timer.h - lib/wolfssl/wolfcrypt/src
ed25519.c fe_low_mem.c ge_low_mem.c misc.c sha256.c sha512.c
wolfBootからSTM32CubeIDEで作成したプロジェクトのディレクトリに必要なファイルをコピーします。
wolfBoot
├─ Debug
│ ├─ wolfboot.elf
│ └─ image.elf
├─ Inc
│ ├─ image.h
│ ├─ loader.h
│ ├─ spi_flash.h
│ └─ target.h
├─ Src
│ ├─ boot_arm.c
│ ├─ image.c
│ ├─ keystore.c
│ ├─ libwolfboot.c
│ ├─ loader.c
│ ├─ spi_flash.c
│ ├─ startup_arm.c
│ ├─ string.c
│ └─ update_flash.c
├─ lib
│ ├─ ed25519.c
│ ├─ fe_low_mem.c
│ ├─ ge_low_mem.c
│ ├─ misc.c
│ ├─ sha256.c
│ └─ sha512.c
├─ test-app
│ ├─ app_stm32f401.c
│ ├─ led.c
│ ├─ led.h
│ ├─ system.c
│ ├─ system.h
│ ├─ timer.c
│ └─ timer.h
デバッグの設定
wolfBootをNUCLEO-F401REで、実行するためのデバッグの設定を行います。
プロジェクトを右クリックして、Debug AsからDebug Configurationsを選択します。
Debug Configurationsウィンドウが表示されるので、Mainタブの設定を行います。
C/C++ Applicationを先ほどDebugディレクトリに登録したwolfboot.elfとします。
また、ビルドは必要ないので、Disable auto buildをチェックします。
プロジェクト名をwolfBootとしたため、デフォルトで作成されるelfファイルのファイル名がwolfBoot.elfとなっています。
WSL2のUbuntuでmakeして作成されるelfファイルのファイル名はwolfboot.elfとなります。
大文字のBと小文字のbのみの違いとなります。
紛らわしいのでプロジェクト名を考えて付けるべきでした。
次にStartupタブに移動します。
プロジェクトを作成したときにデフォルトで登録されているelfファイルは使用しません。
デフォルトで登録されているelfファイルを選択して、Editボタンを押します。
Add/Editウィンドウが表示されるので、DownloadとLoad symbolsのチェックを外して、OKボタンを押します。
Startupタブで、Load Image and Symbolsリストの設定がDownloadとLoad symbolsがfalseになっていることを確認します。
続いて、wolfBootの実行ファイルを追加します。Addボタンを押します。
プロジェクトのDebugフォルダに登録したwolfboot.elfを追加します。
Program pathをDebug/wolfboot.elfとします。
Load symbolsのみをチェックして、OKボタンを押します。
STM32CubeProgrammerでfactory.binを書き込んでいるため、Downloadのチェックは外します。
続けてプロジェクトのDebugフォルダに登録したimage.elfを追加します。
Program pathをDebug/image.elfとします。
Load symbolsのみをチェックして、OKボタンを押します。
Load Image and Symbolsリストの設定が下表のようになっていることを確認します。
File | Build | Download | Load symbols |
---|---|---|---|
Debug/image.elf | false | false | true |
Debug/wolfboot.elf | false | false | true |
Debug/wolfBoot.elf | false | false | false |
Set breakpoint at: mainをSet breakpoint at: isr_resetとします。
Debugボタンを押すと、NUCLEO-F401REでwolfBootのデバッグが始まります。
ソースフィルが見つからないとのメッセージが出ると思いますので、Locate Fileをクリックして、先に登録したファイルから指定されたファイルを選択します。
下記の場合は、Srcディレクトリに登録したboot_arm.cを選択します。
編集後記
NUCLEO-F401REで、wolfBootを動作させる環境が整ったので、これからは、どのような処理が行われているのかを理解していきたいと思います。