# Empty STM32CubeIDE Projectのセットアップ

**URL:** <https://forum.digikey.com/t/empty-stm32cubeide-project/29667>\
**Category:** 電子部品ペディア　～基礎、応用、実践～\
**Created:** [March 22, 2023, 1:39pm UTC](https://forum.digikey.com/t/empty-stm32cubeide-project/29667 "2023-03-22T13:39:03Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tsuneharu\_Fuji](https://avatars.discourse-cdn.com/v4/letter/t/54ee81/32.png) [@Tsuneharu\_Fuji](https://forum.digikey.com/u/Tsuneharu_Fuji)\
**Post date:** [March 22, 2023, 1:39pm UTC](https://forum.digikey.com/t/empty-stm32cubeide-project/29667/1 "2023-03-22T13:39:03Z")

</div>

STM32CubeIDE で新しいプロジェクトを作成する最も簡単な方法は、STM32 プロジェクトウィザードを使用することです。デフォルトでは、このツールは、いくつかのドライバファイル、システムファイル、および .ioc ファイル（統合された STM32CubeMX エディタで設定可能なコード生成設定）を含む STM32Cube プロジェクトをセットアップします。何らかの理由で白紙の状態から始めたい場合は、MCUを起動するのに必要なファイルのみを含む空の（empty）プロジェクトを作成することが可能です。これには、リンカスクリプト、スタートアップコード、および基本的なmain.cファイルが含まれます。

STM32CubeIDEで新しいプロジェクトを作成するのは非常に簡単ですが、ドライバを追加しない限り、そのプロジェクトで高品質のコードを作成するのは非常に困難です。最低限、ターゲットデバイスに対応するCMSISヘッダファイルをダウンロードし、デバイスのレジスタ定義を提供するためにプロジェクトに含める必要があります。以下の手順では、STM32L152RE MCUをデモ用のターゲットMCUとして選択します。しかし、この手順は、STM32ファミリのどの製品にも適用できます。

## 空のプロジェクトを作成する

1. STM32CubeIDEで、 **File** \> **New** \> **STM32 Project** を選択します。
2. ターゲットセレクタを使用して、ターゲットとなるSTM32デバイスを選択します。この例では、リストから「STM32L152RE」デバイスを選択しました（ **MCU/MPU Selector** タブの検索バーを使用して簡単に見つけることができます）。 **Next** をクリックします。
3. 図1に示すように、プロジェクトに名前を付け、_Targeted Project Type_を **Empty** に変更します。 **Finish** をクリックします。

 ![createEmptyProject](https://global.discourse-cdn.com/digikey/original/3X/c/d/cd9b9a967d65fc4760255ede2c3c4f5ccb7b8c59.png)  
**図1：** STM32プロジェクトウィザードを使用した空のSTM32プロジェクトの作成

## CMSISヘッダファイルを追加する

技術的には、この時点でプロジェクトは正常に実行されるため、このステップはオプションです。しかし、ドライバやレジスタを追加しなければ、プログラマは次のような固定されたアドレスを使用したレジスタレベルのプログラミングに制限されることになります。

```auto
/* Set output pin PA5 high */
*((uint32_t*)0x40020014) |= (1 << 5);

```

もちろん、これでは理解しにくく、移植性が低く、保守性に欠けるため、質の高いコードを得ることはできません。プログラマは、すべてのレジスタアドレスとビットフィールドの定義を手動で作成できますが、これらはすでにSTM32Cube MCUパッケージから入手できるCMSISヘッダファイルで提供されています。これらのヘッダファイルをプロジェクトに含めることで、レジスタレベルのコードを以下のように記述することができます。

```auto
/* Set output pin PA5 high */
GPIOA->ODR |= GPIO_ODR_ODR_5;

```

注：各STM32 MCUシリーズ（STM32F4、STM32G0、STM32L1など）については、[ST’s website](https://www.st.com/content/st_com/ja.html)と [STMicroelectronics GitHub repository](https://github.com/topics/stm32cube-mcu-package)の両方から対応するMCUパッケージがダウンロード可能です。

このようなコードは、パフォーマンスを犠牲にすることなく、前述の各品質特性を強化することができます。さらに、CMSISヘッダファイルを含めることで、STM32Cube LLやHALドライバの要素もプロジェクトに含めることができます。なぜならば、これらの上位層の抽象化レイヤはCMSISの定義に基づいて構築されているからです。

以下、STM32L152REを例に説明します。もちろん、異なるターゲットデバイスが選択された場合、「STM32L1」というテキストを含む以下に記載のディレクトリやファイルは、実際にはターゲットデバイスに対応するリソースを指しています。

1. [ST’s website](https://www.st.com/content/st_com/ja.html)または[STMicroelectronics GitHub repository](https://github.com/topics/stm32cube-mcu-package)から、プロジェクトのターゲットMCU用のSTM32Cubeファームウェアパッケージをダウンロードすることから始めます。パッケージを適切なディレクトリに展開またはコピーします。この例では、`STM32Cube_FW_L1_V1.10.3`ディレクトリを`C:\Users\Matt`ディレクトリにコピーしています。
2. STM32CubeIDEで、Project Explorerのプロジェクト名を右クリックし、 **Import** を選択します。
3. **General** カテゴリの **File System** のインポートウィザードを選択します。 **Next** をクリックします。
4. 解凍したファームウェアパッケージへのパスを_From directory_のテキストボックスに入力します。この場合、図2に示すように、パスは`C:\Users\Matt\STM32Cube_FW_L1_V1.10.3`となります。
5. ファイル閲覧ウィンドウを使用して、インポートするCMSISファイルを選択します。`STM32Cube_FW_L1_V1.10.3/Drivers/CMSIS/Core/Include`および`STM32Cube_FW_L1_V1.10.3/Drivers/CMSIS/Device/ST/STM32L1xx/Include`ディレクトリの隣にあるボックスをチェックし ます。図2のようなウィンドウが表示されるはずです。 **Finish** をクリックします。

 ![emptyProjectImportCMSIS](https://global.discourse-cdn.com/digikey/original/3X/b/7/b71ab5563a17e1f8c545d229e2106e9d4e0fb4d8.png)  
**図2：** ファイルシステムインポートウィザードを使用してCMSISヘッダファイルをインポートする

注：この時点で、`STM32Cube_FW_L1_V1.10.3/Drivers/CMSIS/Device/ST/STM32L1xx/Source/Templates/system_stm32l1xx.c`ファイルをプロジェクト内のどこかにコピー＆ペーストすることも良い考えでしょう。STM32L152REデバイスでは厳密には必要ありませんが、ハードウェアFPUを使用するデバイスでは `SystemInit()`の定義が必要です。HALドライバもこのファイルに依存しています。

1. インポートしたディレクトリをプロジェクトのインクルードパスリストに追加します。プロジェクトエクスプローラで、図3に示すように、各インクルードフォルダを右クリックし、 **Add/remove include path…** を選択します。ポップアップウィンドウで、_Debug_と_Release_の両方の構成にチェックが入っていることを確認し、 **OK** をクリックします。

 ![emptyProjectImportAddIncludePath_edit](https://global.discourse-cdn.com/digikey/original/3X/7/b/7b34721c33e392c832bd571ea8ebf3a6e44a5b79.png)  
**図3：** `Drivers/CMSIS/Core/Include`と`Drivers/CMSIS/Device/ST/STM32L1xx/Include`  
ディレクトリをプロジェクトのインクルードパスリストに追加する

1. プロジェクトエクスプローラで、`Drivers/CMSIS/Device/ST/STM32L1xx/Include`ディレクトリを展開します。`stm32l1xx.h`という名前のファイルをダブルクリックし、開きます。下にスクロールしてターゲットデバイスのリスト（図4）を見つけ、プロジェクトのターゲットデバイスに対応するものを特定します。この場合は「STM32L152xE」デバイスです。

 ![emptyProjectCMSISDefinitions](https://global.discourse-cdn.com/digikey/original/3X/5/1/51485989760521efd5b573540112a2b8335c95a6.png)  
**図4：** `stm32l1xx.h`ファイルで認識されるSTM32L1デバイスの一覧

このデバイスの定義をプロジェクトのシンボルリストに追加します。プロジェクトエクスプローラで、プロジェクト名を右クリックし、 **Properties** を選択します。Properties windowの左側で、 **C/C++ General** \> **Paths and Symbols** に移動します。_Symbols_タブで **Add** をクリックし、_Name_テキストボックスに定義（例：`STM32L152xE`）を入力します。 **OK** をクリックし、図5に示すようにシンボルがリストに表示されることを確認します。 **Apply and Close** をクリックします。

 ![emptyProjectImportAddTargetDefinition_edit](https://global.discourse-cdn.com/digikey/original/3X/7/7/77748ac0245aaffa73a6293fddf3fe60fd9afada.png)  
**図5：** ターゲットデバイスの定義をプロジェクトシンボルリストに追加する

1. 最後に、レジスタ定義を使用する必要があるソースファイルに`#include "stm32l1xx.h"`を追加し、コーディングを開始します！

[オリジナル・ソース（English）](https://forum.digikey.com/t/setting-up-an-empty-stm32cubeide-project/16153)
