debian中配置stm32的交叉编译环境

最近尝试在树莓派中的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中即可进行调试

相关推荐
cuiyaonan20001 小时前
some weird issues regarding docker
运维·docker·容器
zcmodeltech1 小时前
钢铁冶金沙盘模型多工序协同控制系统设计:基于STM32与Modbus RTU的高炉-连铸-热轧全流程联动方案
stm32·单片机·嵌入式硬件·数据库架构·嵌入式实时数据库·多分类
love530love2 小时前
Ubuntu系统通过Homebrew安装Lightpanda完整实战教程(含端口占用排坑)
大数据·linux·运维·人工智能·elasticsearch·搜索引擎
淮北4942 小时前
如何服务器和本地实现挂载
运维·服务器
j7~2 小时前
【Linux】二十八.线程篇五《Linux多线程编程:线程同步之条件变量》---详解
linux·运维·c++·学习·条件变量·线程同步
木易 士心2 小时前
服务器构建指南:从选型、部署到高可用架构详解
运维·服务器·后端·架构
openFuyao2 小时前
openFuyao社区Agentic Ops SIG正式成立!组队构建面向AI云原生的智能运维技术体系
运维·人工智能·云原生
码农阿豪3 小时前
多台服务器还在反复输SSH?用EasyNode集中管理连接
运维·服务器·ssh
小张同学a.3 小时前
LAMP架构4——MySQL高可用
linux·运维·服务器·数据库·mysql·架构·负载均衡