STM32CubeIDE で新しいプロジェクトを作成する最も簡単な方法は、STM32 プロジェクトウィザードを使用することです。デフォルトでは、このツールは、いくつかのドライバファイル、システムファイル、および .ioc ファイル(統合された STM32CubeMX エディタで設定可能なコード生成設定)を含む STM32Cube プロジェクトをセットアップします。何らかの理由で白紙の状態から始めたい場合は、MCUを起動するのに必要なファイルのみを含む空の(empty)プロジェクトを作成することが可能です。これには、リンカスクリプト、スタートアップコード、および基本的なmain.cファイルが含まれます。
STM32CubeIDEで新しいプロジェクトを作成するのは非常に簡単ですが、ドライバを追加しない限り、そのプロジェクトで高品質のコードを作成するのは非常に困難です。最低限、ターゲットデバイスに対応するCMSISヘッダファイルをダウンロードし、デバイスのレジスタ定義を提供するためにプロジェクトに含める必要があります。以下の手順では、STM32L152RE MCUをデモ用のターゲットMCUとして選択します。しかし、この手順は、STM32ファミリのどの製品にも適用できます。
空のプロジェクトを作成する
- STM32CubeIDEで、 File > New > STM32 Projectを選択します。
- ターゲットセレクタを使用して、ターゲットとなるSTM32デバイスを選択します。この例では、リストから「STM32L152RE」デバイスを選択しました(MCU/MPU Selectorタブの検索バーを使用して簡単に見つけることができます)。Nextをクリックします。
- 図1に示すように、プロジェクトに名前を付け、Targeted Project TypeをEmptyに変更します。Finishをクリックします。
CMSISヘッダファイルを追加する
技術的には、この時点でプロジェクトは正常に実行されるため、このステップはオプションです。しかし、ドライバやレジスタを追加しなければ、プログラマは次のような固定されたアドレスを使用したレジスタレベルのプログラミングに制限されることになります。
/* Set output pin PA5 high */
*((uint32_t*)0x40020014) |= (1 << 5);
もちろん、これでは理解しにくく、移植性が低く、保守性に欠けるため、質の高いコードを得ることはできません。プログラマは、すべてのレジスタアドレスとビットフィールドの定義を手動で作成できますが、これらはすでにSTM32Cube MCUパッケージから入手できるCMSISヘッダファイルで提供されています。これらのヘッダファイルをプロジェクトに含めることで、レジスタレベルのコードを以下のように記述することができます。
/* Set output pin PA5 high */
GPIOA->ODR |= GPIO_ODR_ODR_5;
注:各STM32 MCUシリーズ(STM32F4、STM32G0、STM32L1など)については、ST’s websiteと STMicroelectronics GitHub repositoryの両方から対応するMCUパッケージがダウンロード可能です。
このようなコードは、パフォーマンスを犠牲にすることなく、前述の各品質特性を強化することができます。さらに、CMSISヘッダファイルを含めることで、STM32Cube LLやHALドライバの要素もプロジェクトに含めることができます。なぜならば、これらの上位層の抽象化レイヤはCMSISの定義に基づいて構築されているからです。
以下、STM32L152REを例に説明します。もちろん、異なるターゲットデバイスが選択された場合、「STM32L1」というテキストを含む以下に記載のディレクトリやファイルは、実際にはターゲットデバイスに対応するリソースを指しています。
-
ST’s websiteまたはSTMicroelectronics GitHub repositoryから、プロジェクトのターゲットMCU用のSTM32Cubeファームウェアパッケージをダウンロードすることから始めます。パッケージを適切なディレクトリに展開またはコピーします。この例では、
STM32Cube_FW_L1_V1.10.3
ディレクトリをC:\Users\Matt
ディレクトリにコピーしています。 - STM32CubeIDEで、Project Explorerのプロジェクト名を右クリックし、Importを選択します。
- GeneralカテゴリのFile Systemのインポートウィザードを選択します。Nextをクリックします。
- 解凍したファームウェアパッケージへのパスをFrom directoryのテキストボックスに入力します。この場合、図2に示すように、パスは
C:\Users\Matt\STM32Cube_FW_L1_V1.10.3
となります。 - ファイル閲覧ウィンドウを使用して、インポートする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をクリックします。
注:この時点で、STM32Cube_FW_L1_V1.10.3/Drivers/CMSIS/Device/ST/STM32L1xx/Source/Templates/system_stm32l1xx.c
ファイルをプロジェクト内のどこかにコピー&ペーストすることも良い考えでしょう。STM32L152REデバイスでは厳密には必要ありませんが、ハードウェアFPUを使用するデバイスでは SystemInit()
の定義が必要です。HALドライバもこのファイルに依存しています。
- インポートしたディレクトリをプロジェクトのインクルードパスリストに追加します。プロジェクトエクスプローラで、図3に示すように、各インクルードフォルダを右クリックし、Add/remove include path… を選択します。ポップアップウィンドウで、DebugとReleaseの両方の構成にチェックが入っていることを確認し、OKをクリックします。
図3:
Drivers/CMSIS/Core/Include
とDrivers/CMSIS/Device/ST/STM32L1xx/Include
ディレクトリをプロジェクトのインクルードパスリストに追加する
- プロジェクトエクスプローラで、
Drivers/CMSIS/Device/ST/STM32L1xx/Include
ディレクトリを展開します。stm32l1xx.h
という名前のファイルをダブルクリックし、開きます。下にスクロールしてターゲットデバイスのリスト(図4)を見つけ、プロジェクトのターゲットデバイスに対応するものを特定します。この場合は「STM32L152xE」デバイスです。
このデバイスの定義をプロジェクトのシンボルリストに追加します。プロジェクトエクスプローラで、プロジェクト名を右クリックし、Propertiesを選択します。Properties windowの左側で、 C/C++ General > Paths and Symbolsに移動します。SymbolsタブでAddをクリックし、Nameテキストボックスに定義(例:STM32L152xE
)を入力します。OKをクリックし、図5に示すようにシンボルがリストに表示されることを確認します。Apply and Closeをクリックします。
- 最後に、レジスタ定義を使用する必要があるソースファイルに
#include "stm32l1xx.h"
を追加し、コーディングを開始します!