wolfBootを使ってみた

# はじめに
[前回](https://qiita.com/AkimotoMasane/items/c89f2083a8eaf9adfea6)は、wolfBootをNUCLEO-F401REで動作させる準備を行ったので、
今回は、NUCLEO-F401REでwolfBootを動作させてみます。

# 使用機器
|機器               |バージョン|
|:------------------|:--------|
|STM32CubeIDE       |1.14.0   |
|STM32CubeProgrammer|2.14.0   |
|NUCLEO-F401RE      |-        |

# 手順
### 実行ファイルの作成
wolfBootの実行ファイルにデバッグ情報を追加するためにコンフィグレーションファイルを編集します。
ルートディレクトリにコピーしたコンフィグレーションファイル .config に
DEBUG?=1
を追加します。
```:.config
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を切断します。
![書き込み1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/453567c6-b77c-5522-fd5a-8b9b85954afd.png)

### プロジェクトの作成
STM32CubeIDEでプロジェクトを作成します。
STM32CubeIDEのメニューから
File -> New -> STM32 Project を選択します。
![手順1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/39229350-8f22-9b42-e726-8b971c217f97.png)

**Target Selection**というウィンドウが表示されるので、NUCLEO-F401REに搭載されているマイコンを選択します。
**MCU/MPU Selector**タブで、**PRODUCT INFO**のSeriesで**STM32F4**をチェックします。
**MCUs/MPUs List**の中にある**STM32F401RET6**を選択して、**Next**ボタンを押します。
![手順2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/8b290df2-9209-55b9-4be1-494260714cf1.png)

**STM32 Project**ウィンドウが表示されるので、**Project Name**を入力します。
**Targeted Project Type**の**Empty**を選択して、**Finish**ボタンを押します。
![手順3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/c69dc73f-5062-92d9-a014-b7a788bf7e59.png)

作成したプロジェクトを使用して、NUCLEO-F401REに接続します。
パソコンにNUCLEO-F401REを接続して、プロジェクトを右クリックして、**Debug As**から**STM32 C/C++ Application**を選択します。
![手順5](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/990c8794-e230-acfb-214b-9402c975b0a8.png)

**Edit Configuration**ウィンドウが表示されるので、**OK**ボタン押します。
接続できたらNUCLEO-F401REから切断します。
![手順6](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/1bf07eb7-18e0-b41e-dccf-a7928b31cb7d.png)

### 実行の準備
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**を選択します。
![debug1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/a53e82a2-4917-da9a-c20e-6fbf68f4f5e7.png)

**Debug Configurations**ウィンドウが表示されるので、**Main**タブの設定を行います。
C/C++ Applicationを先ほどDebugディレクトリに登録した**wolfboot.elf**とします。
また、ビルドは必要ないので、**Disable auto build**をチェックします。

:::note warn
プロジェクト名をwolfBootとしたため、デフォルトで作成されるelfファイルのファイル名がwolfBoot.elfとなっています。
WSL2のUbuntuでmakeして作成されるelfファイルのファイル名はwolfboot.elfとなります。
大文字のBと小文字のbのみの違いとなります。
紛らわしいのでプロジェクト名を考えて付けるべきでした。
:::

![debug2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/a3ec7d22-23bf-1baf-9fe9-bc8747457939.png)

次に**Startup**タブに移動します。
プロジェクトを作成したときにデフォルトで登録されているelfファイルは使用しません。
デフォルトで登録されているelfファイルを選択して、**Edit**ボタンを押します。
![debug3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/1cf5bfc5-d10f-7a81-c660-c9ff4f2874e8.png)

**Add/Edit**ウィンドウが表示されるので、**Download**と**Load symbols**のチェックを外して、**OK**ボタンを押します。
![debug4](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/88f801cb-bdce-8399-fc12-8411a54f07a8.png)

**Startup**タブで、Load Image and Symbolsリストの設定が**Download**と**Load symbols**が**false**になっていることを確認します。
続いて、wolfBootの実行ファイルを追加します。**Add**ボタンを押します。
![debug5](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/a04bab35-0ffe-b550-6c71-078ba4903b51.png)

プロジェクトのDebugフォルダに登録した**wolfboot.elf**を追加します。
**Program path**を**Debug/wolfboot.elf**とします。
**Load symbols**のみをチェックして、**OK**ボタンを押します。

:::note warn
STM32CubeProgrammerでfactory.binを書き込んでいるため、**Download**のチェックは外します。
:::

![debug6](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/7475f167-daa4-df03-9fcc-ff211a997842.png)

続けてプロジェクトのDebugフォルダに登録した**image.elf**を追加します。
**Program path**を**Debug/image.elf**とします。
**Load symbols**のみをチェックして、**OK**ボタンを押します。

![debug7](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/fca860f9-fa7f-33a2-64e0-735392881152.png)

**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のデバッグが始まります。

![debug8](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/157573f6-79ed-ee05-1d31-aff1db32e48a.png)

ソースフィルが見つからないとのメッセージが出ると思いますので、**Locate File**をクリックして、先に登録したファイルから指定されたファイルを選択します。
下記の場合は、Srcディレクトリに登録したboot_arm.cを選択します。
![debug9](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/cb353148-b878-807f-d421-79007caa7e8e.png)

# 編集後記
NUCLEO-F401REで、wolfBootを動作させる環境が整ったので、これからは、どのような処理が行われているのかを理解していきたいと思います。