STM32CubeMXを使ってサンプルコード（X-CUBE）FWプロジェクトを生成！ － ToFセンサ機能拡張(X-NUCLEO)ボードの例

### 概要
　この記事では、マイコンの初期化コード自動生成ツール「STM32CubeMX」[^1]を使用して、STM32Cube機能拡張パッケージ（X-CUBE[^2]）で提供されている **サンプルコードを、ユーザのターゲット（STM32マイコン）に適応したファームウェアプロジェクトの形に生成する方法**を解説します。 
  > **こんな事例で使えます：**  
 **1)**	持っているSTM32 Nucleoボード用のサンプル・ファームウェア（FW）プロジェクトがないので、新たにFWプロジェクトを作りたいが、**ソースコードを直接修正することなく簡単に試してみたい。**
　**例）** X-CUBE-TOF1の無償ソフトウェア（SW）パッケージ の中のサンプルコードを試したいが、その中にNUCLEO-G0B1RE用のFWプロジェクトがないので、新たにFWプロジェクトを作成しなおす必要がある。
**2)**	STM32マイコンが搭載されたオリジナルのボードでサンプルコードのFWプロジェクトを作成したい。

:::note warn
すべてのSTM32用サンプルコードが今回紹介する機能に対応しているわけではありませんので、ご注意ください。
:::

今回は、上記 **1)** のケースを紹介していきます。
**ToF測距センサ拡張ボード「X-NUCLEO-53L8A1」** に対して、**無償SWパッケージ「X-CUBE-TOF1」** が利用可能です。そのアプリケーション例にある **「53L8A1_SimpleRanging」[^3]** というサンプルコードを例として、**NUCLEO-G0B1REボード用のFWプロジェクト** を作成するところまで行います。

***主な手順：***
STM32CubeMXを使った設定の大まかな流れは、以下の通りです。
>**1.** STM32CubeMXの新規プロジェクトを作成
**2.** Software PacksのComponents Selectorを使用して必要なサンプルコードを構築
**2.1** SWパッケージ(例：X-CUBE-TOF1)を選択
**2.2** SWパッケージの中のアプリケーション例（例：53L8A1_SimpleRanging）を選択
**2.3** アプリケーション例に必要なSWコンポーネント(例：ドライバ、ライブラリなど)を選択
**3.**	SWコンポーネントの動作設定と必要なハードウェア･ピンを割り当て
**4.**	FWプロジェクトを設定し、GENERATE CODEボタンをクリックしてFWプロジェクトを生成
:::note info 
今回使用したソフトウェアバージョンとボード：
**ソフトウェア:**
・STM32CubeMX ：6.11.1
・X-CUBE-TOF1 : 3.4.1
**ボード:**
・X-NUCLEO-53L8A1
・NUCLEO-G0B1RE
:::
### 詳細
手順を具体的に解説していきます。
### 1. STM32CubeMXの新規プロジェクトを作成
STM32CubeMXを起動し、**[File]-[New Project]** メニューから、NUCLEO-G0B1RBボードのプロジェクトを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/0b858c13-311c-0e75-fd94-3fbeb1e68ef8.png)

<details><summary><font color = "blue">
＜詳細はこちら＞[ここをクリックすると下に展開して表示されます]
</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/24ee6c50-b804-7759-51bf-f6ee16f5f939.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/7d6be6ec-eec8-c36d-6b11-95351567e1d2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/b815acee-989c-26b5-8a4c-75791cfa7b7e.png)

</details>

### 2. Software Packs Components Selectorを使用して必要なサンプルコードを構築
**[Software Packs] - [Select Components]** をクリックすると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/1cb0dc96-cad2-65de-0006-82ed34195b5a.png)


**Software Packs Components Selector** のウィンドウが開きます。ここでは、生成したいFWプロジェクトの構築に必要なソフトウェアのコンポーネント、つまり、必要なドライバやライブラリなど、ハードやアプリケーションなどに依存するソフトウェアのパーツを選択していきます。

　まずはPacksの中にある以下3つのアイコンをすべてクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/edee849e-99c7-4207-73c3-84f17d4fb384.png)

すると、下図のように **Packs** 以外に3つの表示エリア（ **Filters , Components dependencies , Details and warning** ）が追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/eedb076f-c02a-89e6-7cb5-a1c52225c240.png)


#### 2.1. 使用したいSWパッケージを選択
**Packs** の表示エリア内を見ると、既にSTM32CubeMX上で使用可能なSWパッケージのリストが表示されています。これらはSTのウェブサイトからダウンロード可能ですが、STM32CubeMXの中で利用できるようになっています。今回は、**X-CUBE-TOF1** を使いたいので、下図のように**Filters** の検索機能を使用するか、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/5b2496a6-3850-602f-ade2-9671f72c5b9c.png)

**Packs** 内のリストをスクロールして**X-CUBE-TOF1** を探します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/58331e71-968d-412a-dbd4-7b56efba27b9.png)

X-CUBE-TOF1の行の左端にある「 〉 」クリックすると、その下に新たに項目が表示されます。表示された項目中にも「 〉 」があるので、全てクリックして展開しておきましょう。

<details><summary><font color = "blue">こんな風に表示されます。 [ここをクリックすると下に展開して表示されます]</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/61a475fc-c2dc-b1bd-eb4a-0aef4933e3a1.png)

</details>

<details><summary><font color = "blue">[ Install ] ボタン が表示されている場合 [ここをクリックすると下に展開して表示されます]</font></summary>

初めて使用するソフトウェア･パックは、インストールする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/f60f38ec-f415-7df7-077a-8ee55ca07fa9.png)

**[Install]** ボタンを押すと、ダウンロードが開始され、その後インストールされます。無事インストールが完了すると **[Install]** ボタンは消えます。

**＊STM32CubeMX V6.9.0以降では、mySTへのログインが必要です。** 
**[Install]** ボタンをクリックすると、"Please login to download a software package."のダイアログが表示され、続けて **[OK]** ボタンをクリックすると、"myST" へのログイン画面が表示されます。

・既にアカウントをお持ちの場合： E-mail AddressとPasswordを入力し、**[Login]** をクリック
・アカウントを持っていない場合： **[Create Account]** ボタンをクリックして新規登録をしてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/7358e8e4-dd40-1867-cc99-bb11ed7d6659.png)

</details>

#### 2.2. 使用したいアプリケーション例を選択
まず、使用したいサンプルコードのアプリケーション例を選択しましょう。先ほど展開した一番上のDevice TOF1_Applicationsの項目から、**53L8A1_SimpleRanging** を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/10494023-3724-a425-80ed-3023a349a015.png)

　すると画面上に警告（黄色の三角）マークがいくつか表示され、その内容が**Details and warnings** の中に英文で記載されています。これらの警告マークの内容に対して解決を手助けしてくれるのが、Packs表示エリアの下にある **Component dependencies** の内容です。**Component dependencies** では、必要なSWコンポーネントとの依存関係を具体的に示してくれます。

:::note warn
 **Component dependencies や Details and warnings の内容は、Packsの中の選択（黄色くハイライト）されている行によって変わります。** ここでは、Applicationの行が選択されていないと、Component dependencies やDetails and warnings に対応した内容が表示されないため、ご注意ください。
:::

#### 2.3. アプリケーション例に必要なSWコンポーネントを選択
Applicationがハイライトされている際、**Component dependencies** に表示される内容は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/8dddb481-01c9-0b95-e5de-c70e0b17410e.png)

**Component dependencies** 内に **[Resolve]** ボタンが表示されている場合、これをクリックすることで、ハイライトされた箇所のコンポーネントの依存関係を自動的に選択し解消してくれます。今回は **[Resolve]** ボタンが利用可能なので、こちらをクリックするだけで設定完了です。Resolveボタン以外にも、 **[Show]** ボタンと **[Select]** ボタンがあり、それぞれ以下のような機能を持ちます。

**[Show]** ボタン： その行に記載されてある項目を **Pack** 表示エリア内でハイライト
**[Select]** ボタン： Showでハイライトされた項目を実際に選択（設定）

上記の操作により、これまで黄色の警告マークがついていた **Status** の列が<font color="Green">緑色の✔</font>マークに変わります。これは、53L8A1_SimpleRangingに対して、必要なSWコンポーネントが全て選択されたことを示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/10f57430-d27f-f3bd-b351-f3e9fc4656ae.png)

以上でこの画面の設定は完了です。右下の **[OK]** ボタンをクリックします。
この後は、SWパッケージ（X-CUBE-TOF1）の設定を行っていきます。

### 3. SWコンポーネントの動作設定と必要な周辺機能およびI/Oの割り当て
 **[Pinout & Configuration]** のタブ画面に戻り、**左端の [Categories]⇒ Middleware and Software Packs ⇒ X-CUBE-TOF1** をクリックし、X-CUBE-TOF1のMode and Configurationの設定画面を開きます。
 
#### 3.1. Modeの設定
**Board Extensions 53L8A1** と **Device TOF1 Applications** の２つに✔をいれます。これは、先ほどSoftware Components Selectorで選択したアプリケーションと拡張ボードの設定を行うために必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/a29d6b36-687a-29f5-76ca-8217b3203056.png)

#### 3.2. Configurationの設定
##### 3.2.1. [Parameter Settings]タブと[User Constants]タブ 
今回は、デフォルトのままにしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/8430410c-39a5-67a0-58ba-64dc174eb0c8.png)

##### 3.2.2. Platform Settingsタブ 

このタブでは、サンプルコードで使用する周辺機能やI/Oを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/e7e24b32-1f3b-6c97-1084-3ea35806dcab.png)

:::note info
Nameの列に記載されている文字列（53L8A1_LPn_Cなど）上にマウスのカーソルを置くと、簡単な説明が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/e867d7d7-91ac-c631-b29c-72e84c8841d2.png)
:::

設定方法は、**Found Solutions** をプルダウンメニューから選択していきますが、その選択肢は、まず周辺機能やI/Oを設定しないと表示されません。そこで、周辺機能やI/Oの設定を行っていきます。
　どのような周辺機能やI/Oが必要となるかは、**IPs and Components** の列に記載されています。
 
 >**53L8A1_LPn_C**を例にすると、**IPs or Components** にはGPIO:Outputとあるので、GPIOのOutputポートをアサインする必要があります。

  しかし、端子への割り当てについては、通常、拡張ボード（X-NUCLEO）のユーザマニュアルやNucleoボードの回路図などを参照しつつ設定していくことになります。
 
 :::note warn
 Nucleoボード上のArduinoコネクタ端子に対するSTM32マイコンのピンアサインが、**ボードの種類によって異なる場合があるため注意してください。** 
 
   ご参考までに、X-NUCLEO-53L8A1のボードといくつかのNucleoボードに関する必要な情報を、以下リンク先にまとめておきましたのでご活用ください。
   [ToF測距センサ機能拡張ボード（X-NUCLEO-53L8A1）のSTM32ピン･アサイン対応表 -Qiita](https://qiita.com/sttsuyuki/items/fb8329c9c90fb94d7006)
:::


実際に設定した周辺機能などに関するSTM32CubeMXの画面を、以下の＜設定後の内容＞に記載しました。

<details><summary><font color = "blue">
＜設定後の内容＞[ここをクリックすると下に展開して表示されます]
</summary>
•	Pinout view

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/24d32e58-700a-25fa-61c6-3b5465bf0479.png)

•	System Core: GPIO, NVIC, SYS

:::note info
**53L8A1_LPn_C** と **53L8A1_PWR_EN_C** のGPIO outputの出力レベルを **High** に設定しておく必要があるので、ご注意ください。
:::

:::note info
NVICの設定では、EXTIの割り込み（EXTI line 4 to 15 interrupts）を有効にしています。今回のX-CUBE-TOF1のParameter Settingsの設定では、特に外部割込みを必要とする内容は含まれていませんが、以下の理由により外部割込みを有効にしています。
　STM32CubeMXから生成されるUserボタンに対するBSPコードには、STM32CubeMXのNVICの設定に関係なく、外部割込みを有効にするコードが含まれています。しかし、これは割り込みを有効にするのみで、その割り込みハンドラは含まれていません。そのため、VL53L8CXのINT端子からの外部割込みが入ると無限ループのハンドラに移行してしまいます。
:::



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/0e0608eb-2bc9-0671-98a9-99125693caf6.png)



•	Connectivity: I2C1, USART2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/35c1d012-529e-ab4f-0f3a-a82d155581b0.png)

•	Clock Configuration
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/30442fae-2717-3a19-b047-fa2399e499c2.png)

</details>

  上記の設定後、**Found Solutions** のプルダウン･メニュー内に設定した内容が反映されるので、それぞれ選択していきます。最終的には以下の設定になっていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/44c5f595-acd7-dd93-cde3-2f2123aac7ae.png)


以上がソフトウェア･パック（X-CUBE-TOF1）に関する設定です。

### 4. FWプロジェクトの生成
この後は、FWプロジェクトを自動生成するための設定を行います。 **[ProjectManager]** のタブからプロジェクト名を入力し、使用するIDEを選択して **[GENERATE CODE]** ボタンをクリックすると、FWプロジェクトが生成されます。
　以下は、STM32CubeIDEを使用した際のProjectManagerの設定例です。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/7f48795b-ea20-a477-d2bd-f0c33c396cd9.png)

***
### 関連記事

* 「STM32CubeMXを使ったサンプルFW（X-CUBE)プロジェクトの生成方法 - ユーザーオリジナルボードを使用した例」： 

https://qiita.com/sttsuyuki/items/39aefa99e8c505935a78

* 「ToF測距センサ機能拡張ボード（X-NUCLEO-53L8A1）とSTM32 NucleoボードのArduinoピン配置対応表」：

https://qiita.com/sttsuyuki/items/fb8329c9c90fb94d7006

***

[^1]: ***STM32CubeMXとは?***
STが提供する開発環境（[STM32 ODE](https://www.st.com/resource/ja/brochure/brstm32ode.pdf)）の中の一つであり、STM32マイコン用の初期化コード自動生成ツールです。
https://www.st.com/ja/development-tools/stm32cubemx.html

[^2]: ***STM32Cube拡張パッケージとは？***
STが提供する開発環境（[STM32 ODE](https://www.st.com/resource/ja/brochure/brstm32ode.pdf)）の中の一つで、STM32 X-Nucleo機能拡張ボードに使用できる無償の拡張ソフトウェア
https://www.st.com/ja/embedded-software/stm32cube-expansion-packages.html

[^3]: ***SimpleRangingとは***
ToF測距センサのデータをVCOM経由で出力し、TeraTermなどのターミナルソフトで下図のように確認できるサンプルコード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/96a32f94-c645-dcab-0333-2745431db2b6.png)