記事一覧に戻る

VSCodeで快適なSTM32開発を!【新しくなった STM32 VSCode Extension】

STM32 STM32CubeIDE C++ VSCode

コンセプト

  • VSCode で STM32 開発
  • C++ で書く
  • 自前のプログラムは main.c に書かず、src ディレクトリに分離

𝑫𝒆𝒑𝒆𝒏𝒅𝒆𝒏𝒄𝒊𝒆𝒔

  • STM32 CubeMX
  • VSCode
  • STM32 VSCode Extension v3.x

環境構築

CubeMX のインストール

こちらから https://www.st.com/ja/development-tools/stm32cubemx.html

VSCode のインストール

こちらから https://code.visualstudio.com/

STM32CubeIDE for VSCode のインストール

VSCode の拡張機能パネルで STM32CubeIDE for Visual Studio Code を検索してインストール

image.png

  1. VSCode の STM32CubeIDE パネルを開く
  2. ST-Link USB Drivers を選択

image.png

はじめよう

HAL の雛形を作成

  1. CubeMX でマイコンボード/自作基板の CubeMX プロジェクト (.ioc) を開きます (用意してください)
  2. Project Manager → ToolChain/IDE を CMake にします ← 重要❗
  3. 𝑮𝑬𝑵𝑬𝑹𝑨𝑻𝑬 𝑪𝑶𝑫𝑬 します

VSCode で開く

  1. 生成したプロジェクトを VSCode で開きます。

  2. STM32Cube プロジェクトとしてセットアップするか聞かれるので、Yes を押してください。 image.png

  3. 構成を聞かれたら Debug を押してください。 image.png

これで最低限の開発環境ができました。ここからはさらに快適を求めてプロジェクトを改造していきます。

プロジェクトを改造

C++ に対応

CMakeLists.txt に以下を追加します。

cmake_minimum_required(VERSION 3.22)

#
# This file is generated only once,
# and is not re-generated if converter is called multiple times.
#
# User is free to modify the file as much as necessary
#

# Setup compiler settings
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)

+ # 追加: C++ を有効化・設定
+ set(CMAKE_CXX_STANDARD 17)
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
+ set(CMAKE_CXX_EXTENSIONS OFF)

# Define the build type
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Debug")
endif()

# Set the project name
set(CMAKE_PROJECT_NAME DRC-CCTL2026)

# Enable compile command to ease indexing with e.g. clangd
set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)

# Core project settings
project(${CMAKE_PROJECT_NAME})
message("Build type: " ${CMAKE_BUILD_TYPE})

- # Enable CMake support for ASM and C languages
- enable_language(C ASM)
+ # 追加: C++ の .cpp ファイルもビルド対象にする
+ enable_language(C CXX ASM)

# Create an executable object type
add_executable(${CMAKE_PROJECT_NAME})

# Add STM32CubeMX generated sources
add_subdirectory(cmake/stm32cubemx)

# Link directories setup
target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE
    # Add user defined library search paths
)

# Add sources to executable
target_sources(${CMAKE_PROJECT_NAME} PRIVATE
    # Add user sources here
+    # 追加: 自前のコードをビルド対象にする
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/app.cpp
)

# Add include paths
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
+    # 追加: src をインクルードパスに追加
+    ${CMAKE_CURRENT_SOURCE_DIR}/src
)

# Add project symbols (macros)
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE
    # Add user defined symbols
)

# Remove wrong libob.a library dependency when using cpp files
list(REMOVE_ITEM CMAKE_C_IMPLICIT_LINK_LIBRARIES ob)

# Add linked libraries
target_link_libraries(${CMAKE_PROJECT_NAME}
    stm32cubemx

    # Add user defined libraries
)

src ディレクトリを作成

main.c の USER CODE BEGIN/END の間に書くのが嫌なので、main.c の変更は最小限にして、メインのソースコードを app.cpp に分離します。 app.cpp と app.h を追加します。

 .
 ├── cmake
 ├── Core
 ├── Drivers
+└── src/
+    ├── app.cpp
+    └── app.h

app.h に以下を追加

#ifdef __cplusplus
extern "C" {
#endif

void setup();
void loop();

#ifdef __cplusplus
}
#endif

app.cpp に以下を追加

#include "main.h"
#include "app.h"

extern "C" void setup() {
    // Initialize your application here
}

extern "C" void loop() {
    // Main application loop
    HAL_GPIO_TogglePin(LED_BI_GPIO_Port, LED_BI_Pin);
    HAL_Delay(500);
}

main.c に以下を追加

/* USER CODE BEGIN Includes */
+ #include "app.h"
/* USER CODE END Includes */

// 中略

  /* USER CODE BEGIN Init */
+  setup();
  /* USER CODE END Init */

// 中略

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
+    loop();
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

:::note

src にファイルを追加したいとき

src に 以下のようにモジュールを生やして app.cpp から include することは可能ですが、その際に CMakeLists.txt の target_sources に追加した cpp ファイルを足す必要があります。

.
└── src/
    ├── app.cpp
    ├── app.h
+   ├── buzzer.cpp
+   ├── buzzer.h
+   ├── lcd.cpp
+   └── lcd.h
target_sources(${CMAKE_PROJECT_NAME} PRIVATE
    # 追加: C++のコードをビルド対象にする
+   ${CMAKE_CURRENT_SOURCE_DIR}/src/lcd.cpp
+   ${CMAKE_CURRENT_SOURCE_DIR}/src/buzzer.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/src/app.cpp
)

:::

ビルド・書き込み

  1. 基板を用意します
  2. STLINK で繋ぎます
  3. VSCode で “実行とデバッグ” (Ctrl+Shift+D) パネルを開いて、実行とデバッグを押します。 image.png
  4. デバッガーは STM32Cube: STM32 Launch STLink GDB Server を選択します。 image.png
  5. ビルドが走り、プログラムが書き込まれて以下の画面になります。 HAL_Init(); で一時停止しているので、上の続行 > ボタンを押して続行してください。プログラムが動作を始めます。 image.png

:::note warn

実行でエラーになるとき

image.png

実行で↑のようなエラーになるときは、プロジェクトのセットアップをやり直してください。

  1. STM32Cube パネルから Set Up STM32Cube project(s) を選択 image.png
  2. Configure を押す image.png
  3. 構成を聞かれたら Debug を選択 image.png

:::

開発フロー

  1. CubeMX プロジェクトを作ったら、この記事の手順でセットアップ
  2. プログラムを書く
  3. ST-Link をつないで実行とデバッグ (F5) でビルド・書き込み
  4. プログラムを変えたら、 Shift+F5 でデバッグを停止してから、再び F5 で再ビルド・書き込み

資料