STM32G4のビルド環境構築

普段は仕事でIAR workbenchを利用しているんですが、ちょっと家でもなんか作ってみようかなと思ったので、ビルド環境を整えてみました。
昔STM32F1の環境を利用していた時とは周辺環境が変わってきたので最初から再設定。

環境

昔利用していた環境はmacだったのですが、今の環境はwindows10 64bitです。

必要なソフトウェア

Visual studio code

azure.microsoft.com
昔はeclipse使ったりしていたのですが、エディタは今はこれです。
IAR利用しているときもdebug以外はこれでやっています。
STから提供されているcube-ideという全部いりのIDEもあるんですが、IDEはなんか重くて好きくないのでvscodeを利用していきます。

プラグインには下記を利用しています。

C/C++ for Visual Studio Code

code.visualstudio.com

debugにも別のプラグイン入れようと思っていますが、今回はビルド環境のみ。

GNU Arm Embedded Toolchain

developer.arm.com
コンパイラGNU-ARMeclipse IARと違ってC++17にちゃんと対応しているのがとてもいいです。(IARはC++17対応とおもって飛びついたら標準ライブラリは未対応だったので悲しかった。)

STM32 CubeMx

https://www.st.com/ja/development-tools/stm32cubemx.html
マイコンの基本設定などはCubeMXを使っています。めちゃくちゃ便利で大好きですがある場所が設定できなかったりバグってたりしてたまにトラブりますが、それを加味しても好きだ。アップデートがあったらバグがつぶれていることを期待して必ず更新しています。

ビルドシステムにはmakeじゃなくてmesonというビルドシステムがあるみたいでlinux環境で使ってみてなかなかわかりやすかったので使ってみたかったが windwosでcrossでちゃんと動かす方法がわからなかったのでとりあえずcube-mxで出てくるmakefileを利用しようと思う。 ただ、cube-mxで編集後に吐き出したmakefileを都度編集するのがなんだかなって思ったのでそのうち使えるようにしてみたい。

make

www.msys2.org
makeを使えるようにmsys2をインストール後msys2を起動して

pacman -S mingw-w64-x86_64-make

でインストール。

環境変数の設定

環境変数のPATHに さっき落としてきたGNU Arm Embedded Toolchainを展開した中のbinフォルダを指定。
私はCドライブ直下にtoolsというフォルダを作って展開したので、
C:\tools\gcc-arm-none-eabi-9-2020-q2-update-win32\bin makeを呼べるために msysのpathを追加 C:\msys64\mingw64\bin

VSCodeでビルドできる環境の作成

CubeMxでProject Manager->Projectタブ内のToolChain/IDEmakefileに設定してコード生成。

ワークスペースファイルの作成。

f:id:omonting:20200608003424p:plain
ワークスペースディレクト
ディレクトリ内にvscodeワークスペースファイルを作成。 stm32g474.code-workspace

{
    "folders": [
        {
            "name": "プロジェクト名",
            "path": "./"
        }
    ],
    "settings": {
        "window.zoomLevel": 0,
        "C_Cpp.clang_format_fallbackStyle": "google",
        "editor.formatOnSave": true
    },
    "extensions": {}
}

task.jsonの設定

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "mingw32-make all",
            "args": [],
            "group": "build",
            // Use the standard MS compiler pattern to detect errors, warnings and infos
            "problemMatcher": {
                "base": "$g++",
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}/build"
                ]
            }
        },
        {
            "label": "clean",
            "type": "shell",
            "command": "mingw32-make clean",
            "args": [],
            "group": "build",
            // Use the standard MS compiler pattern to detect errors, warnings and infos
            "problemMatcher": {
                "base": "$g++",
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}/build"
                ]
            }
        }
    ]
}

補完がきいてエディタでエラーが出ないように設定。

下記のようにc_cpp_properties.jsonを作成。

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "${workspaceFolder}/Inc/**",
                "${workspaceFolder}/Drivers/CMSIS/Core/include/**",
                "${workspaceFolder}/Drivers/CMSIS/Device/ST/STM32G4xx/include**",
                "${workspaceFolder}/Drivers/CMSIS/include**",
                "${workspaceFolder}/Drivers/STM32G4xx_HAL_Driver/inc**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE",
                "USE_FULL_LL_DRIVER",     # ここから下はcubemxで作成されたmakefileからコピーしてきた。
                "HSE_VALUE=24000000",
                "HSE_STARTUP_TIMEOUT=100",
                "LSE_STARTUP_TIMEOUT=5000",
                "LSE_VALUE=32768",
                "EXTERNAL_CLOCK_VALUE=12288000",
                "HSI_VALUE=16000000",
                "LSI_VALUE=32000",
                "VDD_VALUE=3300",
                "PREFETCH_ENABLE=0",
                "INSTRUCTION_CACHE_ENABLE=1",
                "DATA_CACHE_ENABLE=1",
                "STM32G474xx"
            ],
            "windowsSdkVersion": "10.0.17763.0",
            "compilerPath": "C:\\tools/gcc-arm-none-eabi-9-2020-q2-update-win32/bin/arm-none-eabi-g++.exe",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}

以上の設定が完了したら。 ctrl+shift+bでビルド候補が出てくるのでbuildを選べばbuild完了。

WSL2がもっと進んでビルド環境すべてLinux上で作れてgdbまで動いたら楽しそうだなと思いました。