(旧記事)Em::BlocksでC++を使用する方法

(2014.12.17 作成)

 Em::Blocksを用いてCubeMXを使用する方法は別ページで紹介していますが、ここではSTM32Cubeに含まれているHALドライバを直接使用する方法を紹介したいと思います。HALドライバとはSTM32を使用する旧ライブラリ(Standard peripheral library)に代わってSTマイクロさんが提供しているLow level peripheral driverになります。

 さらにこのサイトでは管理人の作成したC++ライブラリを公開していますが、ここで紹介する方法を用いることで利用することが可能になります。

 こちらのページを参考にして同じようにプロジェクトを開始して、不要なファイルを削除してください。

 また、その際main.cをmain.cppへリネームしてください。これでC++ファイルだと認識されます。

次に以下の必要ファイルをプロジェクトに追加します。

  • stm32f4xx_hal_conf.h

  どこかから一旦プロジェクトフォルダーにコピーした後プロジェクトに追加してください。後で編集しますのでプロジェクトごとに内容が変わります。CubeMXで一度プロジェクトを作成するとプロジェクト内のIncフォルダーに出てきます。

  • HALドライバ

 実際のドライバですCubeMXをインストールする際にデフォルトでは以下のフォルダーに作られていると思います。

"C:\Users\ユーザー名\STM32Cube\Repository\STM32Cube_FW_F4_V1.*.*"

この"Drivers"フォルダをまるとごプロジェクトに追加してください。

こちらは編集しないのでリンクでよいと思います。

  • 自作ライブラリ

 その他必要なファイルがあれば追加してください。このサイトでもライブラリを公開しています。このライブラリを使用する場合は共通ライブラリとNucleoのライブラリどちらも追加してください。

次に先ほど追加したHALドライバの中で不要な以下のフォルダを削除します。

  • \BSP
  • \CMSIS\Device\ST\STM32F4xx\Source

Em::Blocksの環境設定

 プロジェクトを右クリックして"Build option"を選択して現れるダイアログの左側でプロジェクト名を選択し、Compiler settingの#defineに以下のシンボルを追加します

  • USE_HAL_DRIVER
  • STM32F401xE

同じダイアログのLinker settings -> Linker flags -> Categories = Library selection で "Use C++ libraries"にチェックを入れてください。これでC++の標準ライブラリへのリンクが追加されます

Debug->Plugins->SVD Repositoryと選んでSVDファイルを選択してプロジェクトに追加します。

プログラム作成

 ここからがようやくプログラムっぽいことになります。

stm32f4xx_hal_conf.hの編集

上で追加したstm32f4xx_hal_conf.hの"Module Selection"を編集します。今回はLEDを点滅させるだけとしますので以下のモジュールのコメントアウトを解除します。

#define HAL_MODULE_ENABLED

#define HAL_TIM_MODULE_ENABLED

#define HAL_GPIO_MODULE_ENABLED

#define HAL_DMA_MODULE_ENABLED

#define HAL_RCC_MODULE_ENABLED

#define HAL_FLASH_MODULE_ENABLED

#define HAL_PWR_MODULE_ENABLED

#define HAL_CORTEX_MODULE_ENABLED

適当にコメントアウトを変えてみてビルドエラーが出ないようになればいいと思います。

main.cppの編集

 今回は簡単に以下のようなプログラムを作成します。

#include "DKS_Wait_NucleoF401.h"
#include "DKS_GPIO_NucleoF401.h"
#include "DKS_Util_NucleoF401.h"

int main(void)
{
        DKS::InitSystem();

        DKS::Wait wait(TIM9);
        DKS::DigitalOut led(GPIOA, GPIO_PIN_5,DKS::Push_Pull, DKS::Pull_Down);

        while(1)
        {
                wait.wait_s(2);
                led=!led;
        }
}

あとはBuildを行い、Session Startボタンを押せば動作すると思います。

無事に動いたでしょうか?もし動かないなどあればぜひご連絡ください。記事をアップデートしたいと思います。