STM32_GCC_CMAKE环境搭建

参考模板地址: https://gitee.com/lzh-2022/stm32-learning/tree/master/Templates

1 环境安装

1.1 CMake

1.2 Ninja

1.3 ARM GCC

1.4 OpenOCD

1.5 Vscode

  • 插件
    • STM32CubeIDE for Visual Studio Code
    • ......

2 CMake工程创建

2.1 工程结构

  • CMake : 存放编译工具链文件
  • Ld : 存放链接脚本文件
  • Startup : 存放裸机启动相关文件
  • User : 存放用户相关文件
  • Library : 存放标准库相关文件

2.2 Presets预设文件

{
    "version": 3,
    "configurePresets": [
        {
            "name": "Debug",
            "generator": "Ninja",
            "binaryDir": "${sourceDir}/build/${presetName}",
            "toolchainFile": "${sourceDir}/CMake/arm-none-eabi-toolchain.cmake",
            "cacheVariables": {
                "CMAKE_BUILD_TYPE": "Debug",
                "CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
            }
        }
    ],
    "buildPresets": [
        {
            "name": "Debug",
            "configurePreset": "Debug"
        }
    ]
}

  • generator : 使用Ninja构建系统
  • binaryDir : 指定生成文件目录
  • toolchainFile : 指定编译工具链文件

3.3 编译工具链文件

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR cortex-m3)

set(TOOLCHAIN_PREFIX arm-none-eabi-)
set(FLAGS "-fdata-sections -ffunction-sections -Wl,--gc-sections -Wno-comment")
set(CMAKE_C_FLAGS ${FLAGS})

set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc CACHE INTERNAL "")
set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER} CACHE INTERNAL "")
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++ CACHE INTERNAL "")
set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy CACHE INTERNAL "")
set(CMAKE_SIZE ${TOOLCHAIN_PREFIX}size CACHE INTERNAL "")

set(CMAKE_EXECUTABLE_SUFFIX ".elf")

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

3.4 CMakeLists.txt

cmake_minimum_required(VERSION 3.30)
project("app")
enable_language(C ASM)
set(CMAKE_C_STANDARD 99)

set(cpu_PARAMS 
    -mthumb
    -mcpu=cortex-m3
)

message(${CMAKE_COMMAND})

set(sources_SRCS
	${CMAKE_CURRENT_SOURCE_DIR}/Startup/startup.S
    ${CMAKE_CURRENT_SOURCE_DIR}/Startup/system_stm32f10x.c
    ${CMAKE_CURRENT_SOURCE_DIR}/User/main.c
    ${CMAKE_CURRENT_SOURCE_DIR}/User/stm32f10x_it.c
)

# 源文件路径
set(SRC_DIRS 
    ${CMAKE_SOURCE_DIR}/User
    ${CMAKE_SOURCE_DIR}/Startup
    ${CMAKE_SOURCE_DIR}/Library
)
 # 自动收集源文件
set(sources_SRCS "")
foreach(dir IN LISTS SRC_DIRS)
    file(GLOB_RECURSE FOUND LIST_DIRECTORIES false ${dir}/*.c ${dir}/*.s ${dir}/*.S)
    list(APPEND sources_SRCS ${FOUND})
endforeach()

set(include_DIRS
	${CMAKE_CURRENT_SOURCE_DIR}/Startup
    ${CMAKE_CURRENT_SOURCE_DIR}/Library
    ${CMAKE_CURRENT_SOURCE_DIR}/User
)

set(linker_script_SRC 
	${CMAKE_CURRENT_SOURCE_DIR}/Ld/linker.ld
)

set(compiler_OPTS
)

set(linker_OPTS
    # --specs=nosys.specs
    -Wl,-Map=app.map
    -Wl,--print-memory-usage
)

# --------------------- 构建目标 -------------------------
add_executable(app)

target_sources(app PUBLIC ${sources_SRCS})

target_include_directories(app PRIVATE
    ${include_DIRS}
)

target_compile_definitions(app PRIVATE
    STM32F10X_MD
    USE_STDPERIPH_DRIVER
)

target_compile_options(app PRIVATE
    ${cpu_PARAMS}
    ${compiler_OPTS}
)

target_link_options(app PRIVATE
    -T${linker_script_SRC}
    ${cpu_PARAMS}
    ${linker_OPTS}
)

add_custom_command(TARGET app POST_BUILD
    COMMAND ${CMAKE_SIZE} $<TARGET_FILE:app>
    COMMAND ${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:app> app.hex
    COMMAND ${CMAKE_OBJCOPY} -O binary $<TARGET_FILE:app> app.bin
)
  • SRC_DIRS : 源文件目录列表,可自定义添加
  • include_DIRS : 头文件目录列表,可自定义添加

file自动收集源文件,导致新建文件时需重新进行一次cmake配置

3.5 调试配置文件

  • 需要插件
    • STM32Cube Debug Generic GDB Server
      • 需要安装 openocd
    • STM32Cube Debug STLink GDB Server
{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "stlinkgdbtarget",
            "request": "launch",
            "name": "STM32Cube: STM32 Launch ST-Link GDB Server",
            "origin": "snippet",
            "cwd": "${workspaceFolder}",
            "preBuild": "${command:st-stm32-ide-debug-launch.build}",
            "runEntry": "main",
            "imagesAndSymbols": [
                {
                    "imageFileName": "${workspaceFolder}/build/Debug/app"
                }
            ]
        },

        {
            "type": "stgdbtarget",
            "request": "launch",
            "name": "STM32Cube: STM32 Launch Generic GDB Server",
            "origin": "snippet",
            "cwd": "${workspaceFolder}",
            "preBuild": "${command:st-stm32-ide-debug-launch.build}",
            "program": "${workspaceFolder}/build/Debug/app",
            "gdb": "${command:st-stm32-ide-debug-launch.get-gdb-executable}",
            "deviceName": "${command:st-stm32-ide-debug-launch.get-device-name}",
            "deviceCore": "${command:st-stm32-ide-debug-launch.get-core-name}",
            "deviceTrustzone": "${command:st-stm32-ide-debug-launch.get-trustzone-status}",
            "serverExe": "openocd",
            "serverParameters": [
                "-f",
                "interface/cmsis-dap.cfg",
                "-f",
                "target/stm32f1x.cfg"
            ],
            "serverHost": "localhost",
            "serverPort": "3333",
            "serverCwd": "C:/Program Files/openocd/bin",
            "runEntry": "main",
            "imagesAndSymbols": [
                {
                    "imageFileName": "${workspaceFolder}/build/Debug/app",
                    "imageOffset": "",
                    "symbolFileName": "${workspaceFolder}/build/Debug/app",
                    "symbolOffset": ""
                }
            ]
        }
    ]
}
  • STM32Cube: STM32 Launch ST-Link GDB Server
    • 适合ST-Link使用
  • STM32Cube: STM32 Launch Generic GDB Server
    • 这里使用 openocd启用 dap 方式调试 stm32f103c8t6

3 构建流程

3.1 配置

$ cd template_std
$ cmake --preset Debug
-- The C compiler identification is GNU 15.2.1
-- The CXX compiler identification is GNU 15.2.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files/Arm/GNU Toolchain mingw-w64-x86_64-arm-none-eabi/bin/arm-none-eabi-gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files/Arm/GNU Toolchain mingw-w64-x86_64-arm-none-eabi/bin/arm-none-eabi-g++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- The ASM compiler identification is GNU
-- Found assembler: C:/Program Files/Arm/GNU Toolchain mingw-w64-x86_64-arm-none-eabi/bin/arm-none-eabi-gcc.exe
C:/Program Files/CMake/bin/cmake.exe
-- Configuring done (1.0s)
-- Generating done (0.0s)
-- Build files have been written to: D:/Embedded/codes/stm32/CMake/000 Templates/template_std/build/Debug

3.2 构建

$ cmake --build --preset Debug
Memory region         Used Size  Region Size  %age Used
            RAM:        1976 B        20 KB      9.65%
          FLASH:        2696 B        64 KB      4.11%
  text    data     bss     dec     hex filename
  2692       4    1972    4668    123c D:/Embedded/codes/stm32/CMake/000 Templates/template_std/build/Debug/app

4 Vscode使用流程

  • 使用Vscode打开项目
  • 选择cmake预设,删除缓存重新配置
  • 构建
  • 根据调试工具选择配置烧录调试
posted @ 2026-01-14 17:44  L-ZH  阅读(12)  评论(0)    收藏  举报