Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

STM32, VSCode and CMake detailed tutorial

License

NotificationsYou must be signed in to change notification settings

MaJerle/stm32-cube-cmake-vscode

Repository files navigation

This tutorial explains steps to effectively develop and debug STM32 application inVisual Studio Code usingCMake build generator,Ninja build tool andGCC compiler.

Things you will learn

  • How to install and setup all tools
  • How to create new STM32 project with STM32CubeMX or STM32CubeIDE tools
  • How to install and setup recommended extensions forVisual Studio Code for easier development
  • How to setup CMake lists and CMake presets
  • How to generate build system for compiler
  • How to compile the project with GCC
  • How to flash and debug application to the STM32 target

This tutorial is usingWindows operating system. Similar procedure will apply for Linux and MAC operating system.

Tools installation

August 2024 update

The tools installation tutorial will help you to understand the necessary tools required to work with STM32 and is generally good for beginners to get up to speed and correctly understand necessary requirements.

Since some time, ST has a newSTM32CubeCLT software tool, that includes the build tools necessary for vscode, includesNinja build system andCMake build generator. STM32CubeCLT (Command Line Tools) is a simple and easy way to quickly get up to speed for vscode development. It will also setup your build environment variables (Path in case of Windows) automatically, allowing you to invokeninja,cmake or other commands directly from command line tool.

By installing theSTM32CubeCLT, you won't getSTM32CubeIDE graphical tool, nor you will get any MCU configuration tool capability, rather just command line tools to invoke build and debug, normally from withinvscode. You will still need to separately install vscode and necessary extensions.

STM32CubeIDE

First step is to installSTM32CubeIDE, that will be used to easily start newSTM32 project and it comes with integratedSTM32CubeMX tool - allowing us graphical configuration.

STM32CubeIDE also provides necessary tools needed later forVSCode development

  • ARM none eabi GCC compiler
  • ST-LINK GDBServer for debugging
  • STM32CubeProgrammer tool for code downloading and respective ST-Link drivers
  • Folder with STM32 SVD files
  • Drivers for ST-Link

Environmental path setup

3 paths should be added to environmental settings from STM32CubeIDE installation, one path for each of above-mentioned tools.In case of my computer, using STM32CubeIDE 1.8 (updated through eclipse, hence my actual installation path is still showing version1.0.2) paths are defined as:

  • GCC compiler:c:\ST\STM32CubeIDE_1.0.2\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_2.0.0.202105311346\tools\bin\
  • ST-Link GDB server:c:\ST\STM32CubeIDE_1.0.2\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.externaltools.stlink-gdb-server.win32_2.0.100.202109301221\tools\bin\
  • STM32Cube Programmer CLI:c:\ST\STM32CubeIDE_1.0.2\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.win32_2.0.100.202110141430\tools\bin\

Your paths may differ at version numbers

Verify correct path setup, run:

arm-none-eabi-gcc --versionSTM32_Programmer_CLI --versionST-LINK_gdbserver --version

That should produce output similar to the picture below

STM32CubeIDE environment test

CMake

This step is not necessary if you have installed the build tools withSTM32CubeCLT

Download and installCMake.

Installation wizard will ask you to add CMake to environmental paths. Select the option or addbin folder of CMake installation folder to environmental path.

Ninja

This step is not necessary if you have installed the build tools withSTM32CubeCLT

DownloadNinja build system from Github releases page.It comes as portable executable, without need to install anything.However it must be visible at environment level, like all previous tools.

VerifyCMake andNinja installation, run:

cmake --versionninja --version

Output shall be something similar to

CMake and Ninja verification

Visual Studio Code

Download and installVSCode. Once installed and opened, window will look similar to the one below.Visual Studio Code first time

Visual Studio Code extensions

Visual Studio Code is lightweight text editor with capability to enlarge it using extensions.

List of useful extensions for STM32 development using CMake:

  • ms-vscode.cpptools: Syntax highlighting and other core features for C/C++ development
  • ms-vscode.cmake-tools: CMake core tools, build system generator tool
  • twxs.cmake: CMake color highlighting
  • marus25.cortex-debug: Cortex-M debugging extension, mandatory for STM32 debug from VSCode
  • dan-c-underwood.arm: ARM Assembly syntax highlighter
  • zixuanwang.linkerscript: GCC Linker script syntax highlighter

You can install them by copying below commands in VSCode's internal terminal window.

code --install-extension ms-vscode.cpptoolscode --install-extension ms-vscode.cmake-toolscode --install-extension twxs.cmakecode --install-extension marus25.cortex-debugcode --install-extension dan-c-underwood.armcode --install-extension zixuanwang.linkerscript

Go toTerminal -> New Terminal to open new terminal window

VSCode installed plugins

Alternative way is to useExtension search GUI and manually install from there.

VSCode installed plugins

Tools installed - checkpoint

At this point, all the tools are properly installed - you are on the right track towards success.

New project creation

Fundamental requirement to move forward is to have a working project that will be converted toCMake and developed inVSCode.For this purpose, I will guide you through simple new project creation usingSTM32CubeMX orSTM32CubeIDE software tools.

You can skip this part, if you already have your project to work on.

I usedSTM32CubeIDE tool and STM32H735G-DK board for this demo.

Open STM32CubeIDE and start new projectSTM32CubeIDE - 1

Select STM32 MCU - I selectedSTM32H735IG which is used onSTM32H735G-DK boardSTM32CubeIDE - 2

Select project name and path, then create project and wait forPinout view to openSTM32CubeIDE - 3

Our task is to have a simple project that will toggle leds. LEDs are connected toPC2 andPC3 respectively, active LOW. Pins can be configured in output push-pull or open-drain modeSTM32CubeIDE - 4 - 1

Set pins as outputs with optional labels asLED1 andLED2 respectivelySTM32CubeIDE - 4

If you are usingSTM32CubeMX, go toProject manager, set project name and be sureSTM32CubeIDE is selected asToolchain.STM32CubeIDE - 5

Go to advanced settings and selectLL as drivers for generated codeSTM32CubeIDE - 6

We are using LL drivers for the sake of simplicity in this tutorial

Re-generate the project by pressing red button or by saving the project withCTRL + S shortcutSTM32CubeIDE - 7

Project is now (re)generated.Yellow highlighted files are sources to build.Blue is linker script.STM32CubeIDE - 8

That's it for the first run, we are ready to compile. HitCTRL + B or click onhammer icon to start.STM32CubeIDE will compile the project, you should see similar as on picture below. It is now ready for flashing the MCU's flash and start debugging.STM32CubeIDE - 9

This is end of first part, where we successfully created our project. At this point we consider project being ready to be transferred to CMake-based build system.

You can continue your development with STM32CubeIDE in the future, add new sources, modify code, compile, flash the binary and debug directly the microcontroller.This is preferred STM32 development studio, developed and maintained by STMicroelectronics.

CMake configuration

It is expected that project to develop in VSCode has been created. We will move forward for GCC compiler, but others could be used too.

With release of Visual Studio Code, many developers use the tool for many programming languages and fortunately can also develop STM32 applications with single tool.If you are one of developers liking VSCode, most elegant way to move forward is to transfer STM32CubeIDE-based project toCMake, develop code in VSCode and compile with Ninja build system using GCC compiler. It is fast and lightweight.

Development in VSCode is for intermediate or experienced users. I suggest to all STM32 beginners to stay withSTM32CubeIDE development toolchain. It will be very easy to move forward and come to VSCode topic later.

Prepare CMakeLists.txt file

Every CMake-based application requiresCMakeLists.txt filein the root directory, that describes the project and provides input information for build system generation.

RootCMakeLists.txt file is sometimes calledtop-level CMake file

Essential things described inCMakeLists.txt file:

  • Toolchain information, such as GCC configuration with build flags
  • Project name
  • Source files to build with compiler, C, C++ or Assembly files
  • List of include paths for compiler to find functions, defines, ... (-I)
  • Linker script path
  • Compilation defines, or sometimes calledpreprocessor defines (-D)
  • Cortex-Mxx and floating point settings for instruction set generation

Open VSCode in project root folder

Visual Studio Code has been installed and will be used as further file editor.

Find your generated project path and open folder with VSCode:

  • Option 1: Go to the folder with explorer, then right click and selectOpen in Code.
  • Option 2: Alternatively, open VScode as new empty solution and add folder to it manually. UseFile -> Open Folder... to open folder
  • Option 3: Go to folder with cmd or powershell tool and runcode .

Final result should look similar to the one belowVSCode - Folder is open

Toolchain information

CMake needs to be aware about Toolchain we would like to use to finally compile the project with.As same toolchain is usually reused among different projects, it is advised to create this part in separate file for easier reuse. These are generic compiler settings and not directly linked to projects itself.

A simple.cmake file can be used and later reused among your various projects. I am using namecmake/gcc-arm-none-eabi.cmake for this tutorial and below is its example:

set(CMAKE_SYSTEM_NAME               Generic)set(CMAKE_SYSTEM_PROCESSOR          arm)# Some default GCC settings# arm-none-eabi- must be part of path environmentset(TOOLCHAIN_PREFIX                arm-none-eabi-)set(FLAGS"-fdata-sections -ffunction-sections --specs=nano.specs -Wl,--gc-sections")set(CPP_FLAGS"-fno-rtti -fno-exceptions -fno-threadsafe-statics")# Define compiler settingsset(CMAKE_C_COMPILER${TOOLCHAIN_PREFIX}gcc${FLAGS})set(CMAKE_ASM_COMPILER${CMAKE_C_COMPILER})set(CMAKE_CXX_COMPILER${TOOLCHAIN_PREFIX}g++${FLAGS}${CPP_FLAGS})set(CMAKE_OBJCOPY${TOOLCHAIN_PREFIX}objcopy)set(CMAKE_SIZE${TOOLCHAIN_PREFIX}size)set(CMAKE_EXECUTABLE_SUFFIX_ASM".elf")set(CMAKE_EXECUTABLE_SUFFIX_C".elf")set(CMAKE_EXECUTABLE_SUFFIX_CXX".elf")set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

Create a file in thecmake/ folder of root project directory.VSCode - 2 - CMake - Toolchain

If CMake highlighter plugin is installed, VSCode will nicely highlight CMake commands for you

Toolchain setup is complete. You can freely close the file and move to next step.

Create main CMakeLists.txt file

We need to create mainCMakeLists.txt, also calledroot CMake file.

Make sure you really name itCMakeLists.txt with correct upper and lowercase characters.

I prepared simple template file for you, that can be reused for all of your projects in the future. You will just need to change things like project name, source files, include paths, etc.

cmake_minimum_required(VERSION 3.22)# Setup compiler settingsset(CMAKE_C_STANDARD                11)set(CMAKE_C_STANDARD_REQUIREDON)set(CMAKE_C_EXTENSIONSON)set(CMAKE_CXX_STANDARD              20)set(CMAKE_CXX_STANDARD_REQUIREDON)set(CMAKE_CXX_EXTENSIONSON)set(PROJ_PATH${CMAKE_CURRENT_SOURCE_DIR})message("Build type: "${CMAKE_BUILD_TYPE})## Core project settings#project(your-project-name)enable_language(C CXX ASM)## Core MCU flags, CPU, instruction set and FPU setup# Needs to be set properly for your MCU#set(CPU_PARAMETERS    -mthumb# This needs attention to properly set for used MCU    -mcpu=cortex-m7    -mfpu=fpv5-d16    -mfloat-abi=hard)# Set linker scriptset(linker_script_SRC${PROJ_PATH}/path-to-linker-script.ld)set(EXECUTABLE${CMAKE_PROJECT_NAME})## List of source files to compile#set(sources_SRCS# Put here your source files, one in each line, relative to CMakeLists.txt file location)## Include directories#set(include_path_DIRS# Put here your include dirs, one in each line, relative to CMakeLists.txt file location)## Symbols definition#set(symbols_SYMB# Put here your symbols (preprocessor defines), one in each line# Encapsulate them with double quotes for safety purpose)# Executable filesadd_executable(${EXECUTABLE}${sources_SRCS})# Include pathstarget_include_directories(${EXECUTABLE}PRIVATE${include_path_DIRS})# Project symbolstarget_compile_definitions(${EXECUTABLE}PRIVATE${symbols_SYMB})# Compiler optionstarget_compile_options(${EXECUTABLE}PRIVATE${CPU_PARAMETERS}    -Wall    -Wextra    -Wpedantic    -Wno-unused-parameter# Full debug configuration    -Og -g3 -ggdb)# Linker optionstarget_link_options(${EXECUTABLE}PRIVATE    -T${linker_script_SRC}${CPU_PARAMETERS}    -Wl,-Map=${CMAKE_PROJECT_NAME}.map    --specs=nosys.specs    -u _printf_float# STDIO float formatting support    -Wl,--start-group    -lc    -lm    -lstdc++    -lsupc++    -Wl,--end-group    -Wl,--print-memory-usage)# Execute post-build to print sizeadd_custom_command(TARGET${EXECUTABLE} POST_BUILDCOMMAND${CMAKE_SIZE} $<TARGET_FILE:${EXECUTABLE}>)# Convert output to hex and binaryadd_custom_command(TARGET${EXECUTABLE} POST_BUILDCOMMAND${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:${EXECUTABLE}>${EXECUTABLE}.hex)# Convert to bin file -> add conditional check?add_custom_command(TARGET${EXECUTABLE} POST_BUILDCOMMAND${CMAKE_OBJCOPY} -O binary $<TARGET_FILE:${EXECUTABLE}>${EXECUTABLE}.bin)

Source files are the same as inSTM32CubeIDE project. You can check previous image with highlighted sources in yellow color.

Symbols and include paths can be found inSTM32CubeIDE under project settings.2 pictures below are showing how it is in the case of demo project.

STM32CubeIDE - include pathsSTM32CubeIDE - symbols

Cortex-Mxx setup needs a special attention, especially with floating point setup.ForSTM32H735xx, settings should be set as below.

set(CPU_PARAMETERS    -mthumb    -mcpu=cortex-m7# Set Cortex-M CPU    -mfpu=fpv5-d16# Set Floating point type    -mfloat-abi=hard# Hardware ABI mode)

STM32CubeIDE - MCU settings

General rule for settings would be as per table below

STM32 Family-mcpu-mfpu-mfloat-abi
STM32F0cortex-m0Not usedsoft
STM32F1cortex-m3Not usedsoft
STM32F2cortex-m3Not usedsoft
STM32F3cortex-m4fpv4-sp-d16hard
STM32F4cortex-m4fpv4-sp-d16hard
STM32F7 SPcortex-m7fpv5-sp-d16hard
STM32F7 DPcortex-m7fpv5-d16hard
STM32G0cortex-m0plusNot usedsoft
STM32C0cortex-m0plusNot usedsoft
STM32G4cortex-m4fpv4-sp-d16hard
STM32H5cortex-m33fpv5-sp-d16hard
STM32H7cortex-m7fpv5-d16hard
STM32L0cortex-m0plusNot usedsoft
STM32L1cortex-m3Not usedsoft
STM32L4cortex-m4fpv4-sp-d16hard
STM32L5cortex-m33fpv5-sp-d16hard
STM32U0cortex-m0plusNot usedsoft
STM32U5cortex-m33fpv5-sp-d16hard
STM32WBcortex-m4fpv4-sp-d16hard
STM32WBAcortex-m33fpv5-sp-d16hard
STM32WL CM4cortex-m4Not usedsoft
STM32WL CM0cortex-m0plusNot usedsoft

This table is a subject of potential mistakes, not tested withGCC compiler for all lines. ForSTM32F7, go toSTM32F7xx official site and check if your device has single or double precision FPU, then apply settings accordingly.Products list is not exhaustive.

FinalCMakeLists.txt file after source files, include paths, MCU core settings and defines are set:

cmake_minimum_required(VERSION 3.22)# Setup compiler settingsset(CMAKE_C_STANDARD                11)set(CMAKE_C_STANDARD_REQUIREDON)set(CMAKE_C_EXTENSIONSON)set(CMAKE_CXX_STANDARD              20)set(CMAKE_CXX_STANDARD_REQUIREDON)set(CMAKE_CXX_EXTENSIONSON)set(PROJ_PATH${CMAKE_CURRENT_SOURCE_DIR})message("Build type: "${CMAKE_BUILD_TYPE})## Core project settings#project(STM32H735G-DK-LED)# Modifiedenable_language(C CXX ASM)## Core MCU flags, CPU, instruction set and FPU setup# Needs to be set properly for your MCU#set(CPU_PARAMETERS    -mthumb# This needs attention to properly set for used MCU    -mcpu=cortex-m7# Modified    -mfpu=fpv5-d16# Modified    -mfloat-abi=hard# Modified)# Set linker scriptset(linker_script_SRC${PROJ_PATH}/STM32H735IGKX_FLASH.ld)# Modifiedset(EXECUTABLE${CMAKE_PROJECT_NAME})## List of source files to compile#set(sources_SRCS# Modified${PROJ_PATH}/Core/Src/main.c${PROJ_PATH}/Core/Src/stm32h7xx_it.c${PROJ_PATH}/Core/Src/syscalls.c${PROJ_PATH}/Core/Src/sysmem.c${PROJ_PATH}/Core/Src/system_stm32h7xx.c${PROJ_PATH}/Core/Startup/startup_stm32h735igkx.s${PROJ_PATH}/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_exti.c${PROJ_PATH}/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_gpio.c${PROJ_PATH}/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_pwr.c${PROJ_PATH}/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_rcc.c${PROJ_PATH}/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_utils.c)## Include directories#set(include_path_DIRS# Modified${PROJ_PATH}/Core/Inc${PROJ_PATH}/Drivers/STM32H7xx_HAL_Driver/Inc${PROJ_PATH}/Drivers/CMSIS/Device/ST/STM32H7xx/Include${PROJ_PATH}/Drivers/CMSIS/Include)## Symbols definition#set(symbols_SYMB# Modified"DEBUG""STM32H735xx""USE_FULL_LL_DRIVER""HSE_VALUE=25000000")# Executable filesadd_executable(${EXECUTABLE}${sources_SRCS})# Include pathstarget_include_directories(${EXECUTABLE}PRIVATE${include_path_DIRS})# Project symbolstarget_compile_definitions(${EXECUTABLE}PRIVATE${symbols_SYMB})# Compiler optionstarget_compile_options(${EXECUTABLE}PRIVATE${CPU_PARAMETERS}    -Wall    -Wextra    -Wpedantic    -Wno-unused-parameter# Full debug configuration    -Og -g3 -ggdb)# Linker optionstarget_link_options(${EXECUTABLE}PRIVATE    -T${linker_script_SRC}${CPU_PARAMETERS}    -Wl,-Map=${CMAKE_PROJECT_NAME}.map    --specs=nosys.specs    -u _printf_float# STDIO float formatting support    -Wl,--start-group    -lc    -lm    -lstdc++    -lsupc++    -Wl,--end-group    -Wl,--print-memory-usage)# Execute post-build to print sizeadd_custom_command(TARGET${EXECUTABLE} POST_BUILDCOMMAND${CMAKE_SIZE} $<TARGET_FILE:${EXECUTABLE}>)# Convert output to hex and binaryadd_custom_command(TARGET${EXECUTABLE} POST_BUILDCOMMAND${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:${EXECUTABLE}>${EXECUTABLE}.hex)# Convert to bin file -> add conditional check?add_custom_command(TARGET${EXECUTABLE} POST_BUILDCOMMAND${CMAKE_OBJCOPY} -O binary $<TARGET_FILE:${EXECUTABLE}>${EXECUTABLE}.bin)

In VSCode, well highlighted, it looks like thisVSCode - final CMakeLists.txt

Create preset CMakePresets.json file

CMakePresets.json is a special file, available since CMake3.18 and provides definition for user configuration, similar todebug andrelease configuration known in eclipse. Having this file allows developer to quickly change betweendebug andrelease mode, or even betweenbootloader andmain application, that is a common use case in embedded applications.

This tutorial will not focus on details about the file, rather here is the provided template file

File describes:

  • Path to build directory for each build configuration
  • Default build type for each configuration (Debug,Release, ...)
  • Path to.cmake toolchain descriptor

4 presets are configured in the template for each of the defaultCMake configurations

{"version":3,"configurePresets": [        {"name":"default","hidden":true,"generator":"Ninja","binaryDir":"${sourceDir}/build/${presetName}","toolchainFile":"${sourceDir}/cmake/gcc-arm-none-eabi.cmake","cacheVariables": {"CMAKE_EXPORT_COMPILE_COMMANDS":"ON"            }        },        {"name":"Debug","inherits":"default","cacheVariables": {"CMAKE_BUILD_TYPE":"Debug"            }        },        {"name":"RelWithDebInfo","inherits":"default","cacheVariables": {"CMAKE_BUILD_TYPE":"RelWithDebInfo"            }        },        {"name":"Release","inherits":"default","cacheVariables": {"CMAKE_BUILD_TYPE":"Release"            }        },        {"name":"MinSizeRel","inherits":"default","cacheVariables": {"CMAKE_BUILD_TYPE":"MinSizeRel"            }        }    ]}

Always up-to-date file is available intemplates/CMakePresets.json

Run CMake commands

We have configuredCMake with project information and are now ready to run the CMake commands.

VSCode comes withCMake Tools plugin - a great helper for CMake commands. When installed, several options are available at the bottom of the VSCode active window

VSCode - Default CMake Tools plugin view

As you can see, there is no Configuration Preset selected.

If you do not see such information, hitCTRl + ALT + P and runCMake: Quick Start command.

Next step is to select currentpreset. Click onNo Configure Preset Selected to open a window on top side and select yourpreset. I selecteddebug for the sake of this tutorial.

VSCode - Select application preset

When selected, text will change to selectedpreset label.

VSCode - Preset selected

Now that preset is active, every time user will modifyCMakeLists.txt file, thanks toCMake-Tools extension, VSCode will automatically invoke build generation command to apply new changes.

Build project

Our project is ready for building and linking. Unless CMake build generation step failed, we should have build directory ready to invokeninja build system.

Next step is to hitBuild button - as indicated with green rectangle. CMake will run commands:

  • Run build generator for selected preset
  • Actually build code withNinja

VSCode - Preset selected

If it builds well, final step on the output is print of memory use with different sections.

As a result, we got some output inbuild/<presetname>/ directory:

  • project-name.elf file with complete executable information
  • project-name.hex HEX file
  • project-name.bin BIN file
  • project-name.map map file

In default configuration,.hex and.bin files are not generated normemory usage is displayed.Our preparedCMakeLists.txt file includesPOST_BUILD options, to execute additional commands after successful build.Code is already in yourCMakeLists.txt file, so no need to do anything, just observe.

It executes command to:

  • Print used size of each region + final executable memory consumption
  • Generate.hex file from executable
  • Generate.bin file from executable
# Execute post-build to print sizeadd_custom_command(TARGET${EXECUTABLE} POST_BUILDCOMMAND${CMAKE_SIZE} $<TARGET_FILE:${EXECUTABLE}>)# Convert output to hex and binaryadd_custom_command(TARGET${EXECUTABLE} POST_BUILDCOMMAND${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:${EXECUTABLE}>${EXECUTABLE}.hex)# Convert to bin file -> add conditional check?add_custom_command(TARGET${EXECUTABLE} POST_BUILDCOMMAND${CMAKE_OBJCOPY} -O binary $<TARGET_FILE:${EXECUTABLE}>${EXECUTABLE}.bin)

To disable.bin file generation, simply deletePOST_BUILD line for.bin and regenerate CMake build system commands.Generating.bin files may have a negative effect when memory is split between internal and external flash memories. It may generate very large files (>= 2GB) with plenty of non-used zeros.

There is a list of useful commands to keep in mind during project development:

  • Build changes
  • Clean project
  • Re-build project, with clean first
  • Flash project

Its easy to forget full syntax, rather let's create.vscode/tasks.json file with commands list, for quick run:

{"version":"2.0.0","tasks": [        {"type":"cppbuild","label":"Build project","command":"cmake","args": ["--build","${command:cmake.buildDirectory}","-j","8"],"options": {"cwd":"${workspaceFolder}"            },"problemMatcher": ["$gcc"],"group": {"kind":"build","isDefault":true            }        },        {"type":"shell","label":"Re-build project","command":"cmake","args": ["--build","${command:cmake.buildDirectory}","--clean-first","-v","-j","8"],"options": {"cwd":"${workspaceFolder}"            },"problemMatcher": ["$gcc"],        },        {"type":"shell","label":"Clean project","command":"cmake","args": ["--build","${command:cmake.buildDirectory}","--target","clean"],"options": {"cwd":"${workspaceFolder}"            },"problemMatcher": []        },        {"type":"shell","label":"CubeProg: Flash project (SWD)","command":"STM32_Programmer_CLI","args": ["--connect","port=swd","--download","${command:cmake.launchTargetPath}","-hardRst"            ],"options": {"cwd":"${workspaceFolder}"            },"problemMatcher": []        },        {"type":"shell","label":"CubeProg: Flash project with defined serial number (SWD) - you must set serial number first","command":"STM32_Programmer_CLI","args": ["--connect","port=swd","sn=<yourserialnumber>","--download","${command:cmake.launchTargetPath}","-hardRst"            ],"options": {"cwd":"${workspaceFolder}"            },"problemMatcher": []        },        {"type":"shell","label":"CubeProg: List all available communication interfaces","command":"STM32_Programmer_CLI","args": ["--list",            ],"options": {"cwd":"${workspaceFolder}"            },"problemMatcher": []        },    ]}

Always up-to-date file is available intemplates/.vscode/tasks.json

Tasks defined intasks.json can be invoked in VSCode interface usingTerminal -> Run Task or withCTRL + ALT + T shortcutVSCode - Tasks.json file

Build Project task is configured asdefault, which will get executed when we run default task, or press shortcutCTRL + SHIFT + B.

"group": {"kind":"build","isDefault":true}

List project files with CMake-Tools plugin

CMake-Tools VSCode plugin comes with very nice feature, that being listing all files in the project.When project uses files outsideroot folder tree, there is no way to see them in VSCode by default, unless you add another folder to project workspace, but then youdestroy some of the features listed above.

CMake-Tools extension well parsesCMakeLists.txt file and is able to display all the source files, currently part of the CMake build system generation and later part of GCC build thanks toNinja.On the left side of the screen, you will find an icon forCMake build, marked red on picture below.VSCode - List files part of CMake build system generation

It draws virtual folder tree according to source (executable) files path listed inCMakeLists.txt file.

For the sake of this demonstration purpose, I created a filedemo_file.c, one folder up fromCMakeLists.txt location and added it to the project.After CMake build system generation, we can see virtual file added inCMake-Tools browser.VSCode - List files part of CMake build system generation

Thanks to this feature, we can have a full control over files being part of build and can quickly find files to modify, even if these are outside workspace folder directory.

GCC Problem matcher

Another niceBuild Project task parameter is"problemMatcher": ["$gcc"], set to GCC, which means that terminal output is parsed against GCC standard format and in case of warnings or errors, it will display nice messages inProblems view.VSCode - Tasks.json file

We reached at the end of CMake configuration and build setup.You can freely modify C source code and and/remove files from/to project.This is now fully working GCC-based compilation system running in VSCode.

Do not forget to regenerate CMake whenCMakeLists.txt file gets modified, or useBuild button to do it for you.

Stop receiving virtual C/C++ errors

As you may have noticed, some lines in C files are red-underlined, reporting acould not find resource error, but when compiled, all is working just fine.VSCode - Debug session

This is reported byCppTools extension as it cannot find resources by default, as Intellisense is not aware of include paths or preprocessor defines.

It will still compile well as include paths are defined inCMakeLists.txt, just VSCode Intellisense editor won't work by default.

To overcome this problem, let's create.vscode/c_cpp_properties.json file and copy below text to it

{"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}"        }    ]}

Always up-to-date file is available intemplates/.vscode/c_cpp_properties.json

VSCode - C/C++ virtual errors

We provided settings forC/C++ extension, mainly for Intellisense feature, and configure it in a way to useCMake-Tools extension to find include paths and list of defines (preprocessor defined).

No errors are visible anymore and Intellisense is now fully operational.You can test it by going to one resource (ex. with mouse over a function name), then clickCTRL + left mouse click command and you should jump to definition location directly.VSCode - No errors anymore

.vscode/c_cpp_properties.json is used forCppTools extension purpose.

Debug project with cortex-debug

Our.elf file has been built in previous section and can't wait to be uploaded into MCU flash and executed byCortex-M core.We will useCortex-Debug extension for debugging purpose, that will also flash firmware for us.

First thing is to create.vscode/launch.json file and copy below content to it:

{"version":"0.2.0","configurations": [        {"name":"Debug Microcontroller - STLink-V3","cwd":"${workspaceFolder}",//Path from where commands are executed"type":"cortex-debug",//Debug"executable":"${command:cmake.launchTargetPath}",//or fixed file path: build/project-name.elf"request":"launch",//Use "attach" to connect to target w/o elf download"servertype":"stlink",//Use stlink setup of cortex-M debug"device":"STM32H735IG",//MCU used"interface":"swd",//Interface setup"serialNumber":"",//Set ST-Link ID if you use multiple at the same time"runToEntryPoint":"main",//Run to main and stop there"svdFile":"STM32H73x.svd",//SVD file to see reisters"v1":false,"showDevDebugOutput":"both",/* Will get automatically detected if STM32CubeIDE is installed to default directoryor it can be manually provided if necessary.. *///"serverpath": "c:\\ST\\STM32CubeIDE_1.7.0\\STM32CubeIDE\\plugins\\com.st.stm32cube.ide.mcu.externaltools.stlink-gdb-server.win32_2.0.100.202109301221\\tools\\bin\\ST-LINK_gdbserver.exe",//"armToolchainPath": "c:\\ST\\STM32CubeIDE_1.7.0\\STM32CubeIDE\\plugins\\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_2.0.0.202105311346\\tools\\bin",//"stm32cubeprogrammer": "c:\\Program Files\\STMicroelectronics\\STM32Cube\\STM32CubeProgrammer\\bin",/* If you use external loader, add additional arguments *///"serverArgs": ["--extload", "path/to/ext/loader.stldr"],        }    ]}

Always up-to-date launch file is available intemplates/.vscode/launch.json

And you are ready to go! HitF5 and you should enter debug session with your MCU.VSCode - Debug session

Be sure to have ST-Link debug probe software at its latest version.

Extension will invoke ST-GDBServer application, and will take.elf file as defined byCMake as target launch file.

Debug to main

VSCode - Debug session - breakpoints - step over - step into

You have full control over stepping and can set breakpoints like you would in STM32CubeIDE.

MCU registers with SVD

If you have MCU SVD file, add its path inlaunch.json configuration, and you will see all peripheral registers in MCU.VSCode - Debug session - SVD

Memory view

To view memory, open command palette withCTRL + SHIFT + P and typememory

First select command to view memoryVSCode - Debug session - Memory commandSelect memory start addressVSCode - Debug session - Memory addressAnd memory length to fetchVSCode - Debug session - Memory lengthNice view of MCU memoryVSCode - Debug session - Memory view

Assembly stepping

You can step with assembly instructions

Open Command Palette and typeCortex and pick disassembly, then type function to disassemble.It is possible to later step by step assembly instructions too.

VSCode - Debug session - Memory view

Many other features are available.

Conclusion

This is all for the tutorial.We showed how to create first project with STM32CubeIDE or STM32CubeMX to have its structure, sources and graphical configuration, later transferred to VSCode, CMake and Cortex-debug.

Full project from this tutorial is available incube-ide-cmake-demo-proj folder

Automatic STM32CubeIDE script

Part of this repository is alsostm32-cube-cmake-vscode.py experimetal script, target being taking location of your STM32CubeIDE generated project as an input, finding.cproject and.project files and generate appropriateCMakeLists.txt file, to allow users to use VSCode environment, fully automatically.

It is very experimental use case, however it works well for basic projects generated with STM32CubeIDE. It has not been tested extensively for the moment and bugs may still appear.

Features

  • Uses base project folder as input path parameter
  • Tries to find and parse .cproject and .project files
  • Parses linked files of .c, .cpp or .s types
  • Parses "Source directories" and scans for files inside. This is typical STM32CubeMX configuration where no "linked-files" are used, but "source folders" instead
  • Supports "build" configuration mode only, release configuration is considered advanced feature
  • Supports C, CXX and ASM compilers and linker
  • Generates include paths for each compiler type (C, CXX, ASM)
  • Generates symbols list for each compiler type (C, CXX, ASM)
  • Determines Cortex-Mxx from STM32xx name
  • Adjusts FPU and float-ABI settings
  • Finds linker script
  • Supports static library linkage
  • Tested with
    • Simple project generated with STM32CubeMX for STM32H735 and STM32G474
    • More complex project generated with TouchGFX-Designer
      • All types of files
      • C++, C, ASM, static library
      • Linked files
      • Source folders. ...
  • Experimental purpose only

Tools needed:

  • VSCode with aforementioned extensions
  • CMake tool installed and in environment path
  • Ninja build system installed and in environment path
  • ARM none eabi compiler in environment path (comes with STM32CubeIDE)
  • STM32CubeIDE or STM32CubeMX to generate project
  • Python 3

Following aforementioned tutorial will make sure all the tools are installed, except python.

How to use it

Run script with arguments:

python stm32-cube-cmake-vscode [-f] --path "path1" ["path2" ["pathn", [...]]]

As an example, giving demo projects inscript-projects/ dir, script shall be executed as

python stm32-cube-cmake-vscode [-f] --path "script-projects/h735g-dk-touchgfx/" "script-projects/h735g-dk-usart/"

CMakeLists.txt will be generated in the provided paths, but only if converter is able to find.project and.cproject files inside project directory

Known limitations

  • No support for dual-core devices
  • No support for Cortex-M33 with TrustZone configuration
  • Simple parsing of "linker script" field is too simple -> needs stronger processing
  • Sometimes *.c and *.cpp from build are included

Contribution

Do not hesitate to propose changes you believe will improve this script.It should be a community project, work in synergy with worldwide ideas.


[8]ページ先頭

©2009-2025 Movatter.jp