1. 项目概述为什么STM32环境配置是第一个“大坑”刚接触STM32的朋友十有八九会卡在开发环境配置这一步。这感觉就像拿到一把精密的瑞士军刀却发现没有开刃的工具空有想法却无从下手。我见过太多人兴致勃勃地买了第一块STM32开发板结果在软件安装、驱动、编译上折腾好几天热情被消磨殆尽最后板子只能吃灰。所以今天我们不聊高深的RTOS或复杂的通信协议就踏踏实实地把Windows系统下一套稳定、高效、面向未来的STM32开发环境给搭建起来。这个环境的核心目标很简单让你写的代码能顺利编译、下载到板子里运行并且调试起来顺手。听起来基础但里面门道不少。是选择老牌但略显笨重的Keil MDK还是拥抱开源灵活的VSCodeGCC是直接用ST官方的STM32CubeMX生成代码框架还是从零开始搭建不同的选择决定了你后续的开发效率和学习路径。我将基于多年的踩坑经验带你走一条兼顾稳定性、可维护性和学习深度的路线重点会放在VSCode ARM GCC OpenOCD STM32CubeMX这套当前最受社区推崇的组合拳上。这套环境免费、跨平台、高度可定制一旦配好无论是做简单的GPIO控制还是复杂的物联网项目都能得心应手。2. 环境整体设计与工具选型解析配置开发环境不是简单地“下一步、下一步”点安装背后的工具选型决定了你未来的开发体验。我们先来拆解一下一个完整的STM32开发流程需要哪些核心组件以及为什么我推荐现在的这套方案。2.1 核心工具链的构成与作用一个完整的STM32开发工具链通常包含以下几个部分代码编辑器/集成开发环境IDE这是你写代码的地方。Keil MDK和IAR是传统商业IDE集成度高但收费且生态封闭。Visual Studio CodeVSCode是免费的现代化编辑器通过插件可以拥有不输IDE的体验且生态开放。编译器Compiler负责将你写的C/C源代码翻译成STM32芯片能识别的机器码二进制文件。ARM公司提供的GCC交叉编译工具链arm-none-eabi-gcc是开源免费且功能强大的选择。调试/下载器Debugger/Programmer负责将编译好的程序烧录到芯片中并支持单步调试、查看变量等。常见的有ST-Link、J-Link、DAPLink等。ST-Link因为价格便宜且与STM32同源是最普遍的选择。调试服务器Debug Server这是一个中间软件负责沟通IDE和调试器硬件。OpenOCD是一个开源、支持多种调试器的优秀调试服务器。代码生成与初始化工具STM32有复杂的时钟树和众多外设手动配置寄存器非常繁琐。STM32CubeMX是ST官方推出的图形化配置工具可以直观地配置引脚、时钟、外设并生成对应的初始化代码框架。构建系统Build System负责管理编译过程比如指定源文件、头文件路径、编译参数等。Makefile是最经典的选择而CMake则更现代、更强大。2.2 为什么选择 VSCode ARM GCC OpenOCD CubeMX 组合几年前Keil MDK几乎是STM32新手的唯一选择。但现在我强烈建议从开源工具链入门原因如下零成本与可持续性所有工具完全免费不用担心版权和许可证问题。这对于学生、爱好者和小型团队至关重要。强大的生态与社区支持VSCode拥有海量插件可以轻松集成版本控制Git、代码格式化、智能提示等。ARM GCC和OpenOCD有活跃的社区遇到问题更容易找到解决方案。深入理解构建过程使用Makefile或CMake你会清楚地知道项目是如何被编译和链接的这有助于你理解嵌入式系统的底层机制而不是被IDE的黑盒所遮蔽。跨平台一致性这套工具在Windows、macOS、Linux上都能完美运行。一旦在Windows上配置好你的项目可以无缝迁移到其他系统团队协作也更方便。面向未来许多先进的嵌入式开发框架如Zephyr RTOS、ESP-IDF都基于CMake和GCC工具链。提前熟悉这套流程为你日后探索更广阔的领域打下基础。当然这套方案的缺点是需要一定的前期配置工作量但相信我这份投入的回报远超你的想象。接下来我们就开始一步步实操。3. 核心组件安装与配置详解工欲善其事必先利其器。我们先要把所有必要的“工具”准备好并放到正确的位置。请严格按照顺序操作可以避免很多路径冲突和环境变量问题。3.1 安装 ARM GCC 交叉编译工具链这是整个工具链的基石。ARM官方为嵌入式开发提供了arm-none-eabi-gcc工具链。获取安装包访问ARM官方开发者网站或国内镜像站下载适用于Windows的最新版本gcc-arm-none-eabi安装包。建议选择.exe安装程序版本便于管理。安装过程运行安装程序。在选择安装路径时强烈建议使用一个没有空格和中文的路径例如C:\Tools\gcc-arm-none-eabi。这能避免后续构建时可能出现的各种诡异错误。配置系统环境变量这是关键一步目的是让系统在任何位置都能识别到arm-none-eabi-gcc命令。右键点击“此电脑” - “属性” - “高级系统设置” - “环境变量”。在“系统变量”区域找到并选中Path变量点击“编辑”。点击“新建”将你安装的GCC工具链的bin目录完整路径添加进去例如C:\Tools\gcc-arm-none-eabi\bin。一路点击“确定”保存。验证安装打开一个新的命令提示符CMD或 PowerShell 窗口输入arm-none-eabi-gcc --version并回车。如果正确显示GCC的版本信息说明安装和配置成功。注意如果你之前安装过其他版本比如某些开发板套件自带的旧版GCC请确保新添加的路径在环境变量Path中靠前或者删除旧的配置以免版本冲突。3.2 安装 OpenOCD 调试服务器OpenOCD 是连接你的代码和ST-Link硬件的桥梁。获取安装包建议从OpenOCD官方或xPack项目发布的页面下载适用于Windows的预编译版本通常是一个.zip压缩包。解压与放置将下载的压缩包解压到一个合适的目录同样建议使用无空格中文的路径例如C:\Tools\openocd。配置环境变量参照上述GCC的步骤将OpenOCD的bin目录例如C:\Tools\openocd\bin也添加到系统的Path环境变量中。验证安装打开新的命令行输入openocd --version应能看到版本信息。3.3 安装 STM32CubeMX 代码生成器这是ST的“神器”能极大提升项目初始化效率。下载与安装前往ST官网下载STM32CubeMX的Windows安装程序。安装过程比较简单按提示进行即可。安装时它会同时在线或离线下载对应系列芯片的硬件抽象层HAL库这需要一些时间和磁盘空间请耐心等待。熟悉界面安装完成后打开CubeMX。首次运行可能会提示设置固件库存储路径接受默认或自定义一个即可。它的主要工作区分为芯片选型、引脚配置、时钟树配置、外设中间件配置、项目生成设置。3.4 安装 Visual Studio Code 及必备插件VSCode是我们的主战场。安装VSCode从官网下载安装过程简单。安装核心插件打开VSCode点击左侧活动栏的扩展图标搜索并安装以下插件C/C(Microsoft)提供代码智能感知、跳转、错误检查等功能。Cortex-Debug这是调试STM32的核心插件它提供了图形化的调试界面可以与OpenOCD无缝协作。ARM Assembly方便查看反汇编代码。GitLens如果你使用Git进行版本控制这个插件非常强大。CMake Tools如果你选择使用CMake作为构建系统推荐这个插件是必备的。4. 从零开始创建并配置第一个STM32项目现在所有工具都已就位让我们亲手创建一个“Hello World”级别的STM32项目——点亮一个LED。这个过程会串联起所有工具。4.1 使用STM32CubeMX生成工程框架假设你手头有一块最常见的STM32F103C8T6核心板Blue Pill。新建项目打开CubeMX点击“New Project”。在芯片选择器里输入“STM32F103C8”双击选中“STM32F103C8Tx”。配置时钟在“Pinout Configuration”标签页切换到“RCC”选项。将“High Speed Clock (HSE)”设置为“Crystal/Ceramic Resonator”。这告诉芯片我们使用外部8MHz晶振。切换到“Clock Configuration”标签页。这是整个芯片的“心跳”设置。你会看到一个复杂的时钟树图。通常的配置是将HSE输入通过PLL倍频最终得到72MHz的系统时钟SYSCLK。你可以直接在图中点击输入框修改也可以使用右上角的“HCLK”输入框直接输入72然后回车CubeMX会自动计算并配置合理的分频系数。配置GPIO引脚假设LED连接在PC13引脚这是很多核心板的板载LED位置。在芯片引脚图上找到PC13点击它在弹出的菜单中选择“GPIO_Output”。左侧切换到“System Core” - “GPIO”。点击刚才配置的PC13引脚在右侧可以设置它的初始输出电平低电平点亮LED则设为High高电平点亮则设为Low、输出模式推挽输出、上下拉、速度等。暂时保持默认即可。生成项目代码点击上方“Project Manager”标签。“Project Name”填写你的项目名如“test_led”。“Project Location”选择一个干净的目录。“Toolchain / IDE” 这里非常关键不要选择“MDK-ARM”或“IAR”。请选择 “Makefile”。这表示CubeMX将为我们生成一个使用Makefile构建的项目。在“Code Generator”部分建议勾选“Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral”为每个外设生成独立的文件这样代码结构更清晰。最后点击右上角的“GENERATE CODE”。CubeMX会生成一整套项目文件。4.2 在VSCode中打开并理解项目结构用VSCode打开CubeMX生成的项目文件夹。你会看到类似如下的目录结构test_led/ ├── Core/ │ ├── Inc/ // 用户头文件你的 main.h 可以放这里 │ ├── Src/ // 用户源文件你的 main.c 在这里 │ └── Startup/ // 芯片启动文件startup_stm32f103c8tx.s ├── Drivers/ │ ├── CMSIS/ // ARM Cortex-M核心支持包 │ └── STM32F1xx_HAL_Driver/ // ST官方HAL库 ├── Makefile // 核心构建脚本 └── test_led.ioc // CubeMX工程文件双击可重新打开配置最重要的文件是根目录下的Makefile。它定义了如何编译、链接整个项目。你可以用文本编辑器打开它看看但通常不需要手动修改CubeMX已经为我们配置好了基本的编译参数、头文件路径和源文件列表。4.3 编写第一个应用程序打开Core/Src/main.c文件。CubeMX已经生成了基本的硬件初始化代码HAL_Init(),SystemClock_Config()等。我们需要在/* USER CODE BEGIN 2 */和/* USER CODE END 2 */这对注释之间添加我们的应用代码。一个简单的LED闪烁程序如下/* USER CODE BEGIN 2 */ /* 初始化完成后进入主循环前 */ /* USER CODE END 2 */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 翻转PC13引脚电平 HAL_Delay(500); // 延迟500毫秒 } /* USER CODE END 3 */这段代码的作用是每隔500毫秒翻转一次PC13引脚的电平从而实现LED的闪烁。务必把代码写在USER CODE注释对之间这样当你用CubeMX重新配置外设并生成代码时你手写的代码不会被覆盖。4.4 使用Make进行编译现在我们使用Make工具来编译这个项目。在VSCode中打开集成终端Terminal - New Terminal。确保终端路径在你的项目根目录即Makefile所在目录。输入编译命令make或make all然后回车。如果一切配置正确你会看到终端开始滚动输出编译信息最后显示类似“arm-none-eabi-objcopy -O ihex test_led.elf test_led.hex”和“Finished building target: test_led.elf”的成功提示。在项目根目录下会生成build文件夹CubeMX的Makefile默认配置里面包含了最终的可执行文件test_led.elf、二进制文件test_led.bin和Hex文件test_led.hex。第一次编译可能会比较慢因为需要编译整个HAL库。后续修改代码后再次编译只会编译改动过的文件速度很快。如果编译报错最常见的原因是环境变量未生效关闭所有命令行和VSCode重新打开再试。路径包含空格或中文检查项目路径和工具链安装路径。Makefile语法错误如果你手动修改过Makefile请检查语法。建议初学者不要直接修改CubeMX生成的Makefile。5. 程序下载与调试实战编译成功只是生成了机器码下一步是把它“烧录”到芯片里并验证其运行。5.1 硬件连接与驱动检查用USB线将ST-Link调试器通常是核心板的一部分或独立模块连接到电脑和开发板。确保连接正确ST-Link的SWDIO、SWCLK、GND、3.3V分别连接到板子的对应引脚。Windows系统通常会自动安装ST-Link的USB驱动。如果没有可以去ST官网下载“STSW-LINK009”即ST-Link USB驱动并安装。安装后在设备管理器的“通用串行总线设备”或“libusb-win32 devices”下应该能看到“STMicroelectronics STLink dongle”或类似设备。5.2 使用OpenOCD进行下载与调试OpenOCD需要一份配置文件来知道它连接的是什么调试器和什么芯片。对于ST-Link和STM32F1我们可以使用OpenOCD自带的脚本。创建调试/下载脚本在项目根目录下创建一个新文件命名为openocd.cfg内容如下# 指定调试器适配器这里使用ST-Link source [find interface/stlink.cfg] # 指定目标芯片 source [find target/stm32f1x.cfg] # 复位后停止方便调试 reset_config srst_only # 可选启用更详细的输出 # set DEBUG_LEVEL 3通过OpenOCD下载程序打开一个命令行终端进入项目根目录。输入命令openocd -f openocd.cfg -c program build/test_led.elf verify reset exit这个命令的意思是运行OpenOCD使用我们的配置文件然后执行一系列命令program用于烧录build/test_led.elf文件verify进行校验reset复位芯片exit退出OpenOCD。如果看到“** Verified OK**”和“** target halted due to debug-request**”等成功信息并且板载LED开始闪烁恭喜你下载成功5.3 在VSCode中配置图形化调试命令行下载虽然高效但调试还是图形化界面更方便。这就需要用到我们安装的Cortex-Debug插件。创建调试配置文件在VSCode中切换到“运行和调试”视图左侧活动栏的三角虫子图标点击“创建一个 launch.json 文件”选择“Cortex-Debug”。配置 launch.jsonVSCode会在项目根目录下生成一个.vscode文件夹里面包含launch.json。将其修改为如下内容{ version: 0.2.0, configurations: [ { name: Cortex Debug (OpenOCD), cwd: ${workspaceRoot}, executable: ./build/test_led.elf, // 指向你的elf文件 request: launch, type: cortex-debug, servertype: openocd, serverpath: C:/Tools/openocd/bin/openocd.exe, // 根据你的实际路径修改 configFiles: [ interface/stlink.cfg, target/stm32f1x.cfg ], runToEntryPoint: main, device: STM32F103C8, svdFile: ${env:USERPROFILE}/.vscode/extensions/marus25.cortex-debug-1.x.x/data/svd/STM32F103xx.svd // 可选用于查看外设寄存器 } ] }关键是要修改serverpath为你自己OpenOCD可执行文件的实际路径。configFiles直接使用了OpenOCD内置的脚本路径比指定外部openocd.cfg文件更简洁。svdFile路径需要你根据Cortex-Debug插件实际安装的位置来调整或者去ST官网下载对应的SVD文件并指定路径。SVD文件能让你在调试时查看芯片所有外设寄存器的值非常有用。开始调试按F5或点击调试视图的绿色开始按钮。VSCode会启动OpenOCD连接芯片下载程序并停在main函数开头。此时你可以使用顶部的调试工具栏进行单步执行、设置断点、查看变量和寄存器等操作体验和Keil/IAR类似的调试功能。6. 进阶配置拥抱现代构建系统 CMake虽然Makefile可以工作但对于稍复杂的项目管理起来会有些吃力。CMake是一个更高级的构建系统生成器它能够生成跨平台的构建文件如Makefile, Ninja, Visual Studio项目等。将CubeMX项目迁移到CMake是提升项目工程化水平的重要一步。6.1 为什么需要CMake更好的依赖管理可以方便地引入第三方库如FreeRTOS、LVGL。跨平台构建一套CMakeLists.txt脚本可以在Windows生成Visual Studio项目或使用MinGW Make、Linux、macOS上构建。集成开发环境友好VSCode的CMake Tools插件能提供强大的支持如自动配置、目标选择、构建、调试等。模块化可以将不同功能的代码组织成不同的库target结构清晰。6.2 为CubeMX项目创建CMakeLists.txt我们可以在不破坏CubeMX生成文件的前提下引入CMake。基本思路是让CMake去发现和包含CubeMX生成的所有源文件和头文件。在项目根目录下创建CMakeLists.txt文件内容示例如下cmake_minimum_required(VERSION 3.16) project(test_led C CXX ASM) # 项目名支持C, C和汇编 # 设置交叉编译工具链 set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR arm) set(CMAKE_C_COMPILER arm-none-eabi-gcc) set(CMAKE_CXX_COMPILER arm-none-eabi-g) set(CMAKE_ASM_COMPILER arm-none-eabi-gcc) set(CMAKE_OBJCOPY arm-none-eabi-objcopy) set(CMAKE_OBJDUMP arm-none-eabi-objdump) set(CMAKE_SIZE arm-none-eabi-size) # 编译/链接选项 set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS OFF) add_compile_options( -mcpucortex-m3 -mthumb -specsnosys.specs -specsnano.specs -fdata-sections -ffunction-sections -Wall -Wextra -Wpedantic # 根据CubeMX生成的Makefile中的C_FLAGS补充 -DSTM32F103xB -DUSE_HAL_DRIVER ) add_link_options( -mcpucortex-m3 -mthumb -specsnosys.specs -specsnano.specs -Wl,--gc-sections -static -Wl,-Map${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map -T${CMAKE_SOURCE_DIR}/STM32F103C8Tx_FLASH.ld # 链接脚本路径需从CubeMX工程中复制过来 ) # 包含头文件路径 include_directories( Core/Inc Drivers/STM32F1xx_HAL_Driver/Inc Drivers/STM32F1xx_HAL_Driver/Inc/Legacy Drivers/CMSIS/Device/ST/STM32F1xx/Include Drivers/CMSIS/Include ) # 递归查找所有源文件C, C, 汇编 file(GLOB_RECURSE SOURCES Core/Src/*.c Drivers/STM32F1xx_HAL_Driver/Src/*.c Core/Startup/*.s ) # 创建可执行目标 add_executable(${PROJECT_NAME}.elf ${SOURCES}) # 生成额外的输出格式 add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD COMMAND ${CMAKE_OBJCOPY} -O ihex $TARGET_FILE:${PROJECT_NAME}.elf ${PROJECT_NAME}.hex COMMAND ${CMAKE_OBJCOPY} -O binary $TARGET_FILE:${PROJECT_NAME}.elf ${PROJECT_NAME}.bin COMMAND ${CMAKE_SIZE} $TARGET_FILE:${PROJECT_NAME}.elf COMMENT Generating hex, bin and size report )这个CMakeLists.txt做了几件事设置交叉编译工具、定义编译链接参数、包含所有必要的头文件路径、自动收集所有源文件、创建可执行目标、并在构建后生成hex和bin文件。关键一步你需要从CubeMX生成的Makefile所在目录找到链接脚本通常叫STM32F103C8Tx_FLASH.ld将其复制到项目根目录并在CMakeLists.txt中正确指定路径-T${CMAKE_SOURCE_DIR}/STM32F103C8Tx_FLASH.ld。6.3 使用VSCode CMake Tools插件构建在VSCode中安装并启用“CMake Tools”插件。打开包含CMakeLists.txt的项目文件夹。插件会自动检测并提示你配置项目。底部状态栏会出现CMake相关的按钮。点击状态栏的“CMake”区域选择一个“Kit”。对于ARM GCC你需要选择一个包含arm-none-eabi-gcc的Kit。如果列表里没有可以手动指定编译器路径。选择构建目标Target为test_led.elf。点击状态栏的“构建”按钮小齿轮或按F7CMake Tools会先运行CMake生成构建文件如Makefile然后执行构建。构建成功后你可以在build目录CMake默认的输出目录下找到生成的.elf,.hex,.bin文件。至此你已经拥有了一个基于CMake的现代化STM32项目结构。后续增加新文件、新目录只需要在CMakeLists.txt中简单添加即可管理起来比直接修改Makefile要清晰和强大得多。7. 常见问题、排查技巧与避坑指南配置环境的过程很少一帆风顺这里汇总了我遇到过的典型问题及其解决方法。7.1 编译与链接问题问题arm-none-eabi-gcc不是内部或外部命令排查环境变量Path未正确设置或未生效。解决检查GCC的bin目录路径是否正确添加到系统环境变量Path中。添加后务必关闭并重新打开所有命令行窗口和VSCode新的环境变量才会生效。可以在新终端里输入echo %PATH%CMD或$env:PathPowerShell查看是否包含你的路径。问题编译时提示找不到stm32f1xx.h或core_cm3.h等头文件排查头文件搜索路径-I参数没有包含HAL库或CMSIS的目录。解决如果使用CubeMX生成的Makefile通常不会出现此问题。如果使用自定义的CMakeLists.txt或Makefile请仔细检查include_directories()或CFLAGS中的-I参数确保包含了Drivers/STM32F1xx_HAL_Driver/Inc和Drivers/CMSIS/Include等关键路径。问题链接时提示undefined reference to_sbrk‘或_exit 等排查这是标准库系统调用syscalls未实现。在裸机无操作系统的嵌入式系统中这些函数需要你自己提供或使用精简实现。解决在链接选项中加入-specsnosys.specs使用半主机semihosting的简化实现或-specsnano.specs使用更小的newlib-nano库并通常与nosys.specs一起使用。我们的CMake示例中已经添加。7.2 下载与调试问题问题OpenOCD连接失败提示 “Error: open failed” 或 “Cannot find ST-Link device”排查1驱动问题。ST-Link未被系统正确识别。解决打开设备管理器查看是否有带感叹号的未知设备。前往ST官网下载并安装最新的ST-Link USB驱动。安装后可能需要重新插拔设备。排查2硬件连接问题或板子供电不足。解决检查SWDIO、SWCLK、GND、3.3V四根线是否连接牢固。尝试给开发板单独供电如果支持。排查3OpenOCD配置文件错误或芯片型号不匹配。解决检查openocd.cfg或launch.json中的interface和target配置文件名称是否正确。例如对于ST-Link V2用interface/stlink-v2.cfg对于STM32F4系列用target/stm32f4x.cfg。问题可以下载程序但无法调试断点不生效无法单步排查1程序没有在调试模式下停止。OpenOCD默认连接后芯片是运行的。解决在launch.json中确保有runToEntryPoint: main配置这会让调试器在main函数开头自动暂停。或者在代码中手动设置断点。排查2优化等级过高。编译器优化可能会重组代码导致行号对应不上断点位置不准。解决在开发调试阶段将编译优化等级设置为-O0无优化。在CubeMX的“Project Manager” - “Advanced Settings”中可以设置“Optimization Level”。在CMake中使用add_compile_options(-O0)。问题调试时无法查看外设寄存器SVR文件问题解决确保launch.json中的svdFile路径指向一个有效的.svd文件。可以从ST官网下载你所用芯片系列的SVD文件包如STM32F1xx_svd.zip解压后找到具体的文件路径填写进去。7.3 环境与工具使用技巧保持工具链更新但不要盲目追新ARM GCC和OpenOCD可以定期更新到稳定版本以获得Bug修复和新特性。但STM32CubeMX和HAL库的版本需要谨慎选择新版本可能引入不兼容的改动。对于一个稳定项目建议锁定一套已知可用的版本组合。善用CubeMX的“Project Manager”在这里你可以轻松切换工具链Makefile, SW4STM32, etc.管理软件包版本比手动修改Makefile要安全方便得多。为VSCode配置智能感知在项目根目录下创建.vscode/c_cpp_properties.json文件正确配置includePath和defines这样VSCode的C/C插件才能提供准确的代码提示和跳转。一个简单的方法是直接从CubeMX生成的Makefile或你的CMakeLists.txt中复制这些路径和宏定义过来。版本控制从一开始就使用Git管理你的代码。将Core/,Drivers/,Makefile,CMakeLists.txt,.vscode/不含大的缓存文件加入版本控制。而build/目录、CubeMX的 .ioc 文件虽然它很重要但二进制差异难以管理可以选择性加入以及编译生成的中间文件应该加入.gitignore。配置STM32开发环境是一次性的投入虽然初期会遇到各种“坑”但一旦搭建完成这套开源、强大、可定制的工具链将成为你高效开发STM32的得力助手。从简单的Makefile开始逐步过渡到CMake你会对整个嵌入式项目的构建、链接、调试有更深刻的理解这份能力会伴随你整个嵌入式开发生涯。