STM32 VSCodeExtension v2.0を使ってみる

# はじめに
久しぶりにマイコンを触ることになり、最近の開発環境を調べていると「STM32 VS Code Extension」という便利そうなツールを見つけました。STM32CubeMXとSTM32CubeCLT、VSCodeを組み合わせて開発できるこの拡張機能、試してみる価値がありそうです。

ちなみに[公式サイト](https://www.st.com/content/st_com/ja/campaigns/stm32-vs-code-extension-z11.html)によると、
* vscode   編集、コンパイル、デバッグ
* CubeIDE  強力なデバッグ

のように使い分けするようです。

# 使用環境
* OS : win11
* STM32VSCodeExtension v2.1.1
* STM32CubeMX v6.13.0
* STM32CubeCLT v1.17.0
* ST-MCU-FINDER 
* テスト用マイコン : stm32f767

# インストール
## STM32 VSCodeExtension
vscodeの拡張機能からインストールできます。インストール後タブに追加されていれば成功です。
![STM32VSCodeExtension.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976768/1b262584-0894-c8bd-02e7-b32c3c82f2a2.png)
## STM32CubeMX
ピン設定等を行いCmakeプロジェクトを生成するためのアプリケーションです。 v6.11.0移行のものが必要なようです。今回は[公式サイト](https://www.st.com/ja/development-tools/stm32cubemx.html)から最新版をダウンロードしました。
## STM32CubeCLT
コマンドライン･ツールセットのようです。こちらも同様に[公式サイト](https://www.st.com/ja/development-tools/stm32cubeclt.html)から最新版をダウンロードしました。
## ST-MCU-FINDER
マイコンの性能検索等に用いるツールのようです。vscode拡張機能内に設定項目があったのでインストールしましたが、マイコンへの書き込み等には**不要**です。こちらも同様に[公式サイト](https://www.st.com/ja/development-tools/st-mcu-finder-pc.html#st_all-features_sec-nav-tab)から最新版をダウンロードしました。

# 拡張機能の設定
STM32VSCodeExtensionの設定をする必要があるようです。拡張機能の設定から以下の三項目を設定します。
* STM32 VSCode Extension › Project Creator: Executable Path 
STM32CubeMX.exeの絶対パスを設定します。
* STM32 VSCode Extension › Product Finder: Executable Path
STMCUFinder.exeの絶対パスを設定します。書き込み等には不要です。
* STM32 VSCode Extension › Cube CLT: Path
CubeCLT**フォルダ**の絶対パスを設定します。
ex) C:\ST\STM32CubeCLT_1.17.0

# 使ってみる
CubeMXを使用する方法と基本構成のプロジェクトセットアップを使う方法があるようです。今回はCubeMXを使っていきます。
## CMakeプロジェクトの作成
CubeMXを起動し、新たなプロジェクトを作成します。CubeMXの使い方については省略します。**ただし、ProjectManager -> Project -> Toolchain/IDE をCMake**に変更後GENERATE CODEを行うようです。![スクリーンショット 2025-01-03 231725.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976768/cad8d772-159c-3f01-0258-52e0fa846791.png)
## vscodeにインポート
次にvscodeから作成したcmakeプロジェクトをインポートします。VSCodeExtensionのImport CMake projectから先ほど作ったCMakeプロジェクトを選択します。![スクリーンショット 2025-01-03 233319.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976768/8d755047-cef6-5d90-8baa-8c1480c482b7.png)
## インテリセンス設定
コード補完等のためのインテリセンスの設定を行います。.vscode/c_cpp_properties.jsonにincludePathとdefineを追加します。今回は追記後以下のようになりました。
```json:c_cpp_properties.json
{
    "version": 4,
    "configurations": [
        {
            /** 
             * ms-vscode.cmake-tools plugin should be installed.
             * 
             * It provides data for C/C++ plugin,
             * such as include paths, browse paths, defines, etc.
             */
            "name": "STM32",
            "configurationProvider": "ms-vscode.cmake-tools",
            "intelliSenseMode": "${default}",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "USE_HAL_DRIVER",
                "STM32F767xx", //使用しているマイコンに合わせて変更
                "__CC_ARM" // uint32_t等の型を定義するために必要
            ]
        }
    ]
}
```
## ビルドの構成
CMakeの構成の設定を行います。以下の画像のように構成を[Debug]に設定します。タブにCMakeのアイコンがないときはCMake拡張機能をインストールしてみてください。![スクリーンショット 2025-01-03 235752.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976768/77491d78-05f1-e7be-91d9-8835a1cb275b.png)
ここで一度ビルドしてみます。以下の画像の位置をクリックすることでビルドができます。終了コード0で終了したら成功です。![スクリーンショット 2025-01-03 235939.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976768/3fc8532b-93b1-679c-f86d-687550852cdc.png)
ここまで出来たら環境構築は完了です。

## プログラムの記述
今回は試しにLEDの点滅プログラムを作ってみます。main.cのwhileループ内に以下のコードを追加しました。
```c:main.c
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
    HAL_Delay(100);
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
  ```
  もし自作ファイルを新たに作る場合はCMakeLists.txtへの追記も忘れずに行ってください。

  ## プログラムの実行とデバッグ
  プログラムができたら実行してみましょう。マイコンとPCをst-linkで繋ぎ、[Build & Debug Microcontroller - ST-Link]を実行します。LEDが点滅し始めました。変数もしっかりと確認できるようです。
  ![スクリーンショット 2025-01-04 001538.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976768/c49abe08-7b50-9728-bc00-759d1d81edce.png)

  ## プログラムの書き込み
  プログラムの書き込みのみを行いたい場合は[ターミナル] -> [タスクの実行] -> [Build + Flash]でできるようです。![スクリーンショット 2025-01-04 002129.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976768/8a2b9b1f-8da7-4fb9-8b6d-718b414c8599.png)

# 最後に
メインエディタvscodeが使えるようになったことでコーディングのストレスがかなり減りました！良ければ使ってみてください！
またVSCodeExtensionの中にUser guideもあります。そちらも併せて確認してみてください。

# おまけ
## gitignoreについて 
gitignoreも作成してみました。STM32用のものとCMake用のものを併せた簡単なものですが、参考になれば幸いです。
```:.gitignore
/Debug/
/.settings/
.mxproject
*.launch
/build/

# CMake
CMakeLists.txt.user
CMakeCache.txt
CMakeFiles
CMakeScripts
Testing
Makefile
cmake_install.cmake
install_manifest.txt
compile_commands.json
CTestTestfile.cmake
_deps
CMakeUserPresets.json
build.ninja
```
## float型の出力 
VSCodeExtensionもCubeIDE同様初期設定では、float型の出力が出来ませんでした。そこでCMakeLists.txtに以下の内容を追記することで出力ができるようになりました。
```:CMakeLists.txt
# Set the linker flags for printf float support
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -u _printf_float")
```