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

### 概要
前回の記事（以下のリンク先）では、 マイコンの初期化コード自動生成ツール「STM32CubeMX」[^1] を使用して、STM32Cube機能拡張パッケージ（X-CUBE）[^2]で提供されているサンプルコードを、STM32 Nuceloボードをターゲットにしてご紹介しました。

https://qiita.com/sttsuyuki/items/365e123ed8e926f57958

　今回は、STM32 NuceloボードなどのSTM32CubeMX内で選択可能な評価ボードではなく、**ユーザーが作成したオリジナルボードをターゲットにした場合**について解説します。

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

　本記事で使用したボードは、STが日本で独自に作成したデモ・ボードです。STM32G0B1マイコンとToF測距センサ「VL53L8CX」を搭載したシンプルな構成ですが、MEMSセンサ・ボードを取り付けることもできるボードとなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/61e42754-e7d3-1c4c-7ebe-30ce8682cf18.png)

以下に、今回必要な部分のみのブロック図を示しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/058ef8b5-01e6-9fc1-1962-72170d3499d9.png)

### 主なFWプロジェクトの生成手順
1.	STM32CubeMXの新規プロジェクトを作成
2.	Software Packs Components Selectorを使用して必要なサンプルコードを構築
    2.1 SWパッケージ（例：X-CUBE-TOF1）を選択
    2.2 SWパッケージの中のアプリケーション例を選択
    2.3 アプリケーション例に必要なSWコンポーネントを選択
3.	SWコンポーネントの動作設定と必要なハードウェア･ピンを割り当て
4.	FWプロジェクトの生成

　上記のFWプロジェクトの生成の他に、生成後のビルドと実行内容に関しても紹介します。また、前回の記事と重複する手順内容に関しては、一部省いているので、前回記事も併せてご参照ください。
 
 前回記事： https://qiita.com/sttsuyuki/items/365e123ed8e926f57958 
 
:::note info
今回使用したソフトウェア・バージョンとボード：
**ソフトウェア :**
・STM32CubeMX : 6.12.0
・STM32CubeIDE: 1.16.0
・X-CUBE-TOF1 : 3.4.1
**ボード :**
・ST-Japanオリジナル・ボード
:::

### 詳細
### 1. STM32CubeMXの新規プロジェクトの作成
**(1)** STM32CubewMXを起動し、**[File]-[New Project]**  メニューを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/e496afa3-b800-945b-76da-e154f9676064.png)


**(2)** **[MCU/MPU Selector]** タブの画面にて、使用するボードに搭載されているSTM32マイコン：STM32G0B1KCT6の新規プロジェクトを作成
　下図のように **Commercial Part Number** <font color="magenta">①</font>にSTM32マイコンの製品名の一部などを入れると、製品の候補が表示されるので、その中から **STM32G0B1KCT6を選択**<font color="magenta">②</font>して、**[Start Project]** ボタン<font color="magenta">③</font>をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/2826a88e-e274-05dc-4377-1a97a208d944.png)


### 2. Software Packs Components Selectorを使用して必要なサンプルコードを構築
### 2.1. 使用したいSWパッケージを選択
**(1)** Software Packs Components Selectorのウィンドウを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/c1ec3a9b-7759-67de-3cdd-bae436689ef6.png)

**(2)** STM32CubeMX上で使用可能なSWパッケージのリストからX-CUBE-TOF1を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/5b6e6a71-64c5-f638-618e-d5bc2e11bc08.png)



### 2.2. 使用したいアプリケーション例を選択
　今回はオリジナルのボードを使用するため、表示されるリストの中に、このボード用のアプリケーション例はありません。（例えば、拡張ボードX-NUCLEO-53L8A1用のアプリケーション例は、53L8A1で始まるアプリケーション例の名前となります。）
　そのため、**デバイス（IC）名：VL53L8CXが、名前の先頭についているアプリケーション例** を選択します。今回は、**VL53L8CX_SimpleRanging**[^3]を選択しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/7c8103e5-03af-5959-6293-d17968d525c5.png)


### 2.3. アプリケーション例に必要なSWコンポーネントを選択　
**(1)** Applicationが黄色くハイライトされている際、Component dependencies内に **[Resolve]** ボタンが表示されています。**これをクリックすることで必要なSoftware Componentsが自動的に選択され、ここでの設定が完了します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/61e961d5-8b20-e53d-d9e5-4e0926496d8a.png)

**(2)** **[OK]** ボタンをクリックし、この設定画面を閉じる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/8f4e542c-8457-8c32-a8e9-f87a7d7feaaa.png)




### 3.  SWコンポーネントの動作設定と必要な周辺機能およびI/Oの割り当て
Pinout & Configurationのタブ画面に戻り、**左端の[Categories] ⇒ [Middleware and Software Packs] ⇒ [X-CUBE-TOF1]** をクリックし、X-CUBE-TOF1のMode and Configurationの設定画面を開きます。
### 3.1. Modeの設定
ここに表示されている **３つの項目全てに✔を入れます。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/33a2ccbb-f709-1511-7427-589bbd493dbc.png)

### 3.2. Configurationの設定
#### 3.2.1. [Parameter Settings]タブ :
今回はRangingモードを**Interrupt**に設定して進めていきます。この後のSTM32CubeMXの設定では、外部割り込みを有効にする必要があります。＜設定後の内容＞を参照してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/c0aeeae2-85fc-1ea1-40f7-7f7ee863da0c.png)

#### 3.2.2. [User Constants]タブ：
デフォルトのままにしておきます。
#### 3.2.3. [Platform Settings]タブ :
　このタブでは、サンプルコードで使用する周辺機能やI/Oを設定します。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/46a31525-e674-13d9-fa0e-73fafe4e3b0e.png)


　設定方法は、前回同様にFound Solutionsのプルダウン・メニューから選択するためには、まず、周辺機能やI/Oの設定から行う必要があります。
　実際に使用するボードの回路図などを基に設定していきます。ここでは、上のブロック図の情報から設定します。

 
 （設定例）
 **TOF_INT_PIN** の場合を示します。TOF_INT_PINに最終的に接続されるVL53L8CXの端子は、**INT** という端子です。VL53L8CXの端子の詳細は、データシート [^4] 参照ください。INT端子は、レベルシフタを介してSTM32マイコンの**PA7** に接続されています。
 ①PA7端子を左クリックしてGPIO_EXTI7に設定
 ここでは、わかりやすくするために端子のラベル名を**INT**と変更しておきましょう。
 ②端子で右クリックして**Enter User Label** を選択
 ③ラベル名（INT）を入力
 ④ラベル名が**GPIO_EXTI7** から**INT** に変更されたことを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/f96c49d4-dfd7-5953-6059-a9280017241d.png)


これで下図のように**TOF_INT_PIN**の選択肢に**PA7[INT]** が追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/4dedea3d-a8bc-bc32-9c62-282b56779831.png)



 他の設定も同様に行っていきます。

::: note info 
 今回使用した基板にはToF測距センサの電源を制御するEnable信号があるため、VL53L8CX_PWR_ENの設定が可能です。しかし、もしこの信号ラインがボードにない場合、①特に端子を設定せずUndefinedのまま進めていき、生成されたソースコードを直接修正、または②未使用端子をダミーとして設定する方法が考えられます。
　Undefinedのまま進めた場合、FWプロジェクト生成時に以下のような警告が出ますが、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/60f64d7b-fe9d-74a8-ac4a-96749603aee5.png)

**[Yes]** ボタンをクリックすることでFWプロジェクト自体は生成されます。この場合ビルド時にエラーが出るので、エラー内容に基づいてソースコードの修正が必要です。
:::
実際に設定した周辺機能など設定画面を、参考までに以下＜設定後の内容＞に記載しました。

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

[Pinout View]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/065742d6-d03c-e930-9cc8-2c7f7b717678.png)

[System Core]：GPIOとNVIC
今回は、RangingモードをInterruptに設定したので、**PA7の外部割込みとUSART2の割込みを有効にする必要があります。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/ec95b7fa-ee29-69ee-a42e-67e492e2e1c4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/e81f629e-ed00-4df7-b2a2-6d2b7333fda0.png)

[Connectivity] : USARTとI2C

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/4e65ffeb-9979-8a2b-b22b-a496c89c8ab0.png)

[Clock Configuration]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/5030abde-8155-3dde-eb81-ec55c5ee9b74.png)

</details>

上記の設定後、**Found Solutions** のプルダウン･メニュー内に設定した内容が反映されるので、それぞれ選択していきます。最終的には以下の設定になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/61968d7b-edd2-6192-b858-4590d9942695.png)


:::note
ここで、前回のSTM32 Nuceloボードをターゲットとした場合との主相違点を以下にまとめました。
* STM32 CubeMXの新規プロジェクトの作成では、ボードではなくデバイス（IC）を選択して作成
* SoftwarePacks（X-CUBE-TOF1）のアプリケーション例の選択では、 ボード名ではなくデバイス（IC）名の一部が付いたアプリケーションを選択
* I/Oの割り当て（Platform Settings）において、オリジナル・ボードにはない端子設定があった場合、設定せずにそのままプロジェクトを生成し、後でソースコードを直接修正するなどの対応が必要
:::

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

### 4. FWプロジェクトの生成
次に、FWプロジェクトを自動生成するための設定を行います。**ProjectManager** のタブからプロジェクト名を入力、使用するIDEを選択して**GENERATE CODE** ボタンをクリックすると、FWプロジェクトが生成されます。下図は、実際にSTM32CubeIDEを使用した設定例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/5e0e6a4c-0762-bfb6-e8c7-bdbd42a4000d.png)


</details>

### 5. FWプロジェクトのビルドと実行
### 5.1 FWプロジェクトのビルド
まず、STM32CubeMXで生成したFWプロジェクト・ファイルをSTM32CubeIDEで開きます。今回は特にFWの内容を変更することなく、そのまま使うので、ツールバーにある下図のBuildのアイコンをクリックするか、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/188d8c56-af7d-466f-5cd1-6c949b9a7d01.png)

ファイルメニューから **[Project]>[Build Project]** を選択してビルドを行います。
　ビルドが正常に完了したかどうかは、Consoleウィンドウから確認できます。正常に完了すれば以下のように表示されます。
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/80e69c5b-f350-61d9-660b-0f01ad05e575.png)


### 5.2 デバッガの接続
ビルドがエラーなく正常に終了すれば、ボードへの書き込みが可能です。
**(1)** 今回は、デバッガ・ツールとして**STLINK-V3SET [^5]** を使用します。**STLINKを初めて使用される際はSTLINKのUSBドライバをインストールする必要がある**ので、以下リンク先よりダウンロードして事前にインストールを行ってください。

https://www.st.com/ja/development-tools/stsw-link009.html



**(2)** ボード、STLINK-V3SET、パソコン（PC）を下図のように接続します。
センサ・ボードでは、デバッガI/F( **J2** )はSWDとなっていますので、STLINK-V3SETの **CN6** と接続します。
　また、今回のサンプルコードではPCとVirtualCOM接続して動作を確認するため、UART-USB変換（VCOM接続）が必要となります。**STLINK-V3SETには、デバッガ機能以外にUART-USB変換（VCOM）などの機能もある** ため、それを利用します。STLINK-V3SETの **CN3** とセンサ・ボードとの接続はそのための結線です。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/ac610246-9d58-8c65-2aca-3979d7d34917.png)

::: note warn

**注意**：STLINK-V3SETの基板上のCN3に、「Rx」と「Tx」のシルクの記載がありますが、これはSTLINK-V3SET側のRx/Tx端子を意味しているのではなく、上表の通り、接続先（ターゲット・ボード側）のRx/Tx端子をここに接続することを意味します。
:::


### 5.3 ボードへの書き込みと実行
**(1)** ここでは、**STM32CubeIDE** のDebugモード上で実行していきます。Debugのアイコンをクリックするか、ファイルメニューから **[Run]>[Debug]** を選択します。すると、**Console** ウィンドウにその実行ログが表示されていき、最後に **「Download verified successfully」** と表示されれば、ボードへの書き込みが完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/67f3bc77-af8b-ac28-e7fb-afcc107d5fa8.png)

　この時、デバッグ用画面に切り替えるかの確認画面（Confirm Perspective Switch）のウィンドウが表示されますので、**[Switch]** ボタンをクリックしてデバッグ用画面に切り替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/4728951d-7439-4ed9-ef07-bb7ddc9b3b5b.png)

**(2)** **DebugモードでRUNする前に、動作確認用にTeraTermを起動しておきます。** TerminalとSerial Portの設定は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/fefd8c81-3440-894b-7659-a62f01d8797d.png)

COM PortはSTLink Virtual COM PortのCOMポートを選択します。WindowsのDevice Managerでは以下のように表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/89e1302e-9227-0bb1-4d36-f1a32f392018.png)


**(3)** Resumeのアイコンをクリックするか、ファイルメニューから[Run]>[Resume]を選択します。しばらくした後、TeraTermに以下のような測距データが表示される画面になればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/668e7ea2-6c6f-7c15-c2c2-e826090e674d.png)

:::note
TeraTermの画面上にも説明が表示されていますが、以下のキーがコマンドなっています。
"r"：解像度の切り替え : [4x4]  or [8x8]
"s" : 表示データの切り替え: 
　 [測距データ(mm)]  or 
　 [測距データ(mm)、Status、Signal(Kcps/SPAD)、Ambient(Kcps/SPAD)]
"c" : 画面を一旦クリアした後、結果を再表示
:::


[^1]:**STM32CubeMXとは？**
STが提供する開発環境（STM32 ODE）の中の一つで、STM32マイコン用の初期化コード自動生成ツール
[^2]:**STM32Cube拡張パッケージ（X-CUBE）とは？**
STが提供する開発環境（STM32 ODE）の中の一つで、STM32 X-Nucleo機能拡張ボードに使用できる無償の拡張ソフトウェア
[^3]:**SimpleRangingとは?** 
ToF測距センサのデータをVCOM経由で出力し、TeraTermなどのターミナルソフトで下図のように確認できるサンプル・コード![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2039081/9a4c8b45-1f4f-72cb-d39e-15c19dc014bf.png)

[^4]:**VL53L8CXのウェブサイト**
https://www.st.com/ja/imaging-and-photonics-solutions/vl53l8cx.html#overview
[^5]:**STLINK-V3SETのウェブサイト**
https://www.st.com/ja/development-tools/stlink-v3set.html