最近尝试在树莓派中的debian linux中配置stm32的交叉编译环境,记录配置过程。
一、概述
本文选择使用stm32cubemx生成cmake项目,vscode中配置和编辑,gcc交叉编译工具链进行编译,openocd进行调试和烧写。
二、配置环境
1、stm32cubeMX
官网上下载的是普通linux,无法在aarch64的debian中安装使用,所以需要一台windows10电脑,先按照官方方式进行安装在windows中,安装流程略。
2、生成cmake项目

因为我们这里需要所有的hal库,所以记得在Code Generator中勾选上Copy all used libraries into the project folder,并勾选generate peripheral initialization as a pair of ".c/.h" files per peripheral。
然后需要在pinout & configuration中找到Trace and Debug ,在Mode中选择debug模式为Serial wire,我们使用SWD进行调试烧写。
最后点击右上角Generate Code,生成的文件夹压缩放到u盘中,转移到树莓派中。
3、安装vscode和插件
vscode安装略。
安装上C/C++、CMake Tools和Cortex-Debug插件。
4、安装openocd和cmake
直接指令安装
sudo apt-get install openocd cmake
5、下载gcc工具链
这里我不想直接安装到环境中,所以我选择单独配置
https://gitlab.arm.com/tooling/gnu-toolchains-for-arm
在以上地址中下载,我选择的是14.3,树莓派是aarch64架构,所以下载
arm-gnu-toolchain-14.3.rel1-aarch64-arm-none-eabi.tar.xz
下载后解压即可。
6、修改cmakelist
cmake_minimum_required(VERSION 3.22)
#第一处增加的地方
set(CMAKE_TOOLCHAIN_FILE ${CMAKE_SOURCE_DIR}/cmake/gcc-arm-none-eabi.cmake)
add_compile_definitions(STM32H743xx)
add_compile_definitions(USE_HAL_DRIVER)
#
# 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)
# Define the build type
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Debug")
endif()
# Set the project name
set(CMAKE_PROJECT_NAME test0)
# 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)
# 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
#第二处增加的地方,增加自己写的.c
target_sources(${CMAKE_PROJECT_NAME} PRIVATE
# Add user sources here
${CMAKE_CURRENT_SOURCE_DIR}/Core/Src/core_delay.c
)
# Add include paths
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
# Add user defined include paths
)
# 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
)
#第三处增加的地方,生成bin用于烧写
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD
COMMAND /home/admin/Desktop/arm_none_eabi_gcc/arm-gnu-toolchain-14.3.rel1-aarch64-arm-none-eabi/bin/arm-none-eabi-objcopy -O binary
"${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.elf" "${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.bin"
)
修改cmake/gcc-arm-none-eabi.cmake
#第一处增加地址
set(CMAKE_SYSTEM_NAME Debian)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(tools /home/admin/Desktop/arm_none_eabi_gcc/arm-gnu-toolchain-14.3.rel1-aarch64-arm-none-eabi/bin)
set(CMAKE_C_COMPILER_ID GNU)
set(CMAKE_CXX_COMPILER_ID GNU)
# Some default GCC settings
# arm-none-eabi- must be part of path environment
set(TOOLCHAIN_PREFIX arm-none-eabi-)
set(CMAKE_C_COMPILER ${tools}/${TOOLCHAIN_PREFIX}gcc)
set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})
set(CMAKE_CXX_COMPILER ${tools}/${TOOLCHAIN_PREFIX}g++)
set(CMAKE_LINKER ${tools}/${TOOLCHAIN_PREFIX}g++)
set(CMAKE_OBJCOPY ${tools}/${TOOLCHAIN_PREFIX}objcopy)
set(CMAKE_SIZE ${tools}/${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)
# MCU specific flags
set(TARGET_FLAGS "-mcpu=cortex-m7 -mfpu=fpv5-d16 -mfloat-abi=hard ")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TARGET_FLAGS}")
set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -x assembler-with-cpp -MMD -MP")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -fdata-sections -ffunction-sections -fstack-usage")
# The cyclomatic-complexity parameter must be defined for the Cyclomatic complexity feature in STM32CubeIDE to work.
# However, most GCC toolchains do not support this option, which causes a compilation error; for this reason, the feature is disabled by default.
# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcyclomatic-complexity")
set(CMAKE_C_FLAGS_DEBUG "-O0 -g3")
set(CMAKE_C_FLAGS_RELEASE "-Os -g0")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3")
set(CMAKE_CXX_FLAGS_RELEASE "-Os -g0")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -fno-rtti -fno-exceptions -fno-threadsafe-statics")
set(CMAKE_EXE_LINKER_FLAGS "${TARGET_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T \"${CMAKE_SOURCE_DIR}/STM32H743XX_FLASH.ld\"")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=nano.specs")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=${CMAKE_PROJECT_NAME}.map -Wl,--gc-sections")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--print-memory-usage")
set(TOOLCHAIN_LINK_LIBRARIES "m")
7、配置vscode
在项目文件夹下有一个.vscode文件夹,其中新建settings.json文件并修改
{
// 禁用不必要的渲染和动画
"editor.smoothScrolling": false,
"editor.cursorBlinking": "solid",
"editor.renderWhitespace": "none",
"editor.renderControlCharacters": false,
// 指定 CMake 工具链(关键!)
"cmake.cmakePath": "cmake",
// 工具链路径(让 CMake Tools 能找到编译器)
"cmake.environment": {
"PATH": "/home/admin/Desktop/arm_none_eabi_gcc/arm-gnu-toolchain-14.3.rel1-aarch64-arm-none-eabi/bin:${env:PATH}"
},
// 添加工具链文件路径
"cmake.configureArgs": [
"-DCMAKE_TOOLCHAIN_FILE=${workspaceFolder}/cmake/gcc-arm-none-eabi.cmake",
"-DCMAKE_BUILD_TYPE=Debug"
],
// CMake 配置
"cmake.configureOnOpen": false,
"cmake.configureOnSave": false,
"cmake.buildBeforeRun": true,
"cmake.clearOutputBeforeBuild": true,
"cmake.generator": "Ninja",
"cmake.buildDirectory": "${workspaceFolder}/build",
"cmake.parallelJobs": 2,
"cmake.buildArgs": [],
// 生成 compile_commands.json(供 C/C++ 插件使用)
"cmake.exportCompileCommandsFile": true,
// 限制 IntelliSense 的 CPU 和内存使用
"C_Cpp.intelliSenseEngine": "default",
// 关键:跳过系统头文件索引(大幅提升性能)
"C_Cpp.default.browse": {
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": "${workspaceFolder}/.vscode/.browse.VC.db",
"databaseEngine": "sqlite"
},
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
"C_Cpp.default.compilerPath": "/home/admin/Desktop/arm_none_eabi_gcc/arm-gnu-toolchain-14.3.rel1-aarch64-arm-none-eabi/bin/arm-none-eabi-gcc",
//"C_Cpp.default.defines": [
// "USE_HAL_DRIVER",
// "STM32H743xx"
//],
"C_Cpp.default.cStandard": "c11",
"C_Cpp.default.intelliSenseMode": "gcc-arm",
// 使用 compile_commands.json 提供更好的代码提示
"C_Cpp.default.compileCommands": "${workspaceFolder}/build/compile_commands.json",
"C_Cpp.default.includePath": [
// 使用明确的路径而不是通配符
"${workspaceFolder}/**",
"${workspaceFolder}/Core/Inc/**",
"${workspaceFolder}/Drivers/STM32H7xx_HAL_Driver/Inc/**",
"${workspaceFolder}/Drivers/STM32H7xx_HAL_Driver/Inc/Legacy/**",
"${workspaceFolder}/Drivers/CMSIS/Device/ST/STM32H7xx/Include/**",
"${workspaceFolder}/Drivers/CMSIS/Include/**",
"/home/admin/Desktop/arm_none_eabi_gcc/arm-gnu-toolchain-14.3.rel1-aarch64-arm-none-eabi/arm-none-eabi/include/**",
"/home/admin/Desktop/arm_none_eabi_gcc/arm-gnu-toolchain-14.3.rel1-aarch64-arm-none-eabi/lib/gcc/arm-none-eabi/14.3.1/include/**"
],
// 禁用 Clang 诊断
"C_Cpp.errorSquiggles": "enabled",
"C_Cpp.diagnosticLogging": false,
"files.associations": {
"stm32h7xx_it.h": "c",
"stm32h7xx_conf.h": "c",
"gpio.h": "c",
"main.h": "c",
"stm32h7xx.h": "c"
}
}
新建tasks.json,这个用于自动编译和烧写
{
"version": "2.0.0",
"tasks": [
{
"label": "Build & Flash",
"type": "shell",
"command": "openocd",
"args": [
"-f",
"interface/cmsis-dap.cfg",
"-f",
"target/stm32h7x_dual_bank.cfg",
"-c",
"program ${workspaceFolder}/build/Debug/test0.bin 0x08000000 verify reset exit"
],
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": [],
"dependsOn": [
"check CMAKE cache",
"Build"
],
"dependsOrder": "sequence", // 顺序执行
"detail": "检查cmake cache后编译并烧写(按 ctrl+shift+B 执行此任务)"
},
{
"label": "Build",
"type": "cmake",
"command": "build",
"targets": [
"test0"
],
"group": "build",
"problemMatcher": [],
"detail": "只编译,不烧写"
},
{
"label": "check CMAKE cache",
"type": "shell",
"command": "${workspaceFolder}/build_cmake_cache.sh",
"problemMatcher": [],
"presentation": {
"echo": true,
"reveal": "always",
"panel": "shared"
},
"detail": "检查cmake cache(亦可使用ctrl+shift+p,搜CMake: Delete Cache and Reconfigure)"
},
{
"label": "Clean",
"type": "cmake",
"command": "clean",
"group": "build",
"problemMatcher": []
}
]
}
注意这里openocd的配置文件中,cmsis-dsp是我使用的调试器,芯片是stm32h743xih6对应的双bank flash的配置文件。最后在main中按ctrl+shift+B自动使用Ninja进行编译。如果要改为Make,修改"cmake.generator": "Ninja",改为"cmake.generator": "Unix Makefiles"。
另外这里自动判断是否有cmake cache并生成,所以需要一个脚本来辅助,在项目目录下创建文件build_cmake_cache.sh
#!/bin/bash
# 检查 CMake 缓存
if [ ! -f "build/Debug/CMakeCache.txt" ]; then
echo "⚠️ CMake缓存不存在,正在生成..."
mkdir -p build/Debug
cd build/Debug
cmake -G "Ninja" ../.. || exit 1
cd ../..
else
echo "✅ CMake缓存已存在,跳过配置"
fi
这里默认也是用Ninja,同理如果要改makefile,同上一样修改为Unix Makefiles
还要修改ctrl+shift+B默认的任务,在vscode中ctrl+shift+p,然后搜tasks:Configure Default Build Tasks,选择为Build & Flash。
接下来就可以在main.c文件中使用ctrl+shift+B,自动判断是否有Debug文件夹,自动判断是否有cmake cache,若无则自动生成,然后使用Ninja进行编译,最后自动调用openocd使用dap通过SWD口对stm32芯片进行烧写。(当然前提是dap已经插上,stm32已通电)
8、单步调试
在项目文件夹下有一个.vscode文件夹,其中新建launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "stm32h743xih6 Debug",
"cwd": "${workspaceFolder}",
"executable": "./build/Debug/test0.elf", //mcu程序可执行文件路径
"request": "launch",
"type": "cortex-debug",
"servertype": "openocd",
"device": "STM32h743",
"configFiles": [
"interface/cmsis-dap.cfg",// 绝对路径是/usr/share/openocd/scripts/interface
"target/stm32h7x_dual_bank.cfg" //对应MCU系列的配置文件,绝对路径/usr/share/openocd/scripts/target
],
"gdbPath": "/home/admin/Desktop/arm_none_eabi_gcc/arm-gnu-toolchain-14.3.rel1-aarch64-arm-none-eabi/bin/arm-none-eabi-gdb",
"armToolchainPath": "/home/admin/Desktop/arm_none_eabi_gcc/arm-gnu-toolchain-14.3.rel1-aarch64-arm-none-eabi/bin",
"svdFile": "./STM32H743.svd"//绝对路径
//"preLaunchTask": "Build & Flash"//可加可不加,这里选择纯调试。
}
]
}
其中需要svd文件,可在这里找到
https://github.com/modm-io/cmsis-svd-stm32
或者
GitHub - zhongxiangrong/cmsis-svd-stm32: CMSIS SVD files for all STM32 devices · GitHub
vscode中即可进行调试
