摘要:2025 年,嵌入式行业已全面转向CMake,从 STM32 到 ESP32、Zephyr,七大主流平台均已原生支持或强制采用。本文逐一对比各平台现状,并聚焦国产芯片LKS32的独特机遇——官方虽仅提供 Keil 工程,但通过完整的移植方案,我们已成功将其接入 CMake 生态,填补国产芯片构建体系的最后一块空白。
行业迁移现状
- 各平台现状总览
- 行业迁移现状:嵌入式 CMake 化浪潮
- 本课目标
- 各大平台 CMake 支持现状 — 2025 年
- 迁移时间线 2018 -> 2025
- 三大驱动力——为什么全行业都在转
- 开源生态需求
- CI/CD 压力
- 多架构统一
- 本页大纲:行业迁移全景
- 🌊 CMake 化浪潮全景——7 大平台一图看清
- ⏳ 迁移时间线深度解析——四个关键转折点
- 🧲 三大驱动力的深度拆解——为什么"转"是必然
- 📋 行业迁移状态总表——把你的芯片对号入座
- 深入 STM32
- 深入 STM32:全球最大 ARM MCU 生态的 CMake 化
- STM32CubeMX 生成的 CMakeLists.txt(简化示例)
- STM32 的迁移意义
- 本页大纲:深入 STM32 迁移
- 🔵 STM32 的转身——最震撼的行业信号
- 📄 CubeMX 生成的 CMakeLists.txt 结构——和你将要写的 LKS32 版几乎同构
- 🧭 STM32 vs LKS32 迁移对照表——别人走过的路就是你的地图
- 📊 STM32 生态规模——为什么它的选择影响全行业
- 🧩 STM32CubeMX 生成工程 vs LKS32 手写工程——同一骨架,两种来源
- 深入 ESP32/Zephyr
- 深入 ESP32 与 Zephyr——CMake 作为唯一构建系统
- ESP-IDF v5.0:从 GNU Make 到 CMake 的强制迁移
- Zephyr RTOS — "CMake 原生"从第一天
- 对比 ESP32 vs Zephyr vs STM32 — 三种 CMake 化路径
- 本页大纲:ESP32 与 Zephyr 的强制 CMake
- 🟢 ESP-IDF v5.0 — "Make 已被移除"是 2022 年最大的行业宣言
- 🟡 Zephyr — 200+ 开发板一套构建系统的"极端测试"
- 🧠 从 RTOS 的"强制 CMake"学到什么
- 📈 ESP-IDF 与 Zephyr 的构建命令全景对比——同一底层,两种体验
- 🎓 从 Zephyr 的设备树看"配置驱动构建"——CMake 的终极形态
- LKS32 现状与机遇
- LKS32 的现状——官方仅 Keil,但完整 CMake 移植存在
- 凌鸥官方资源 vs 我们移植的 CMake 工程
- LKS32 CMake 移植的五步流程
- 移植后的验证结果
- 本页大纲:LKS32 现状与机遇
- 🔴 凌鸥 LKS32 的现状——官方仅提供 Keil 工程
- 🗺️ 五步移植方案——本教程 58 课的总路线图
- 💎 移植后的独特竞争力——为什么这件事值得做
- 稀缺性
- 理解深度
- 可迁移性
- 🗂️ 官方 SDK 目录 vs 移植后目录——差异一目了然
- 📅 LKS32 移植里程碑——58 课如何一步步走完
各平台现状总览
行业迁移现状:嵌入式 CMake 化浪潮
2018 年还只是一个趋势——2025 年已经是共识。从 MCU SDK 到 RTOS,整个嵌入式生态正在全面转向 CMake。
本课目标
看清 2025 年各大 MCU 平台对 CMake 的支持现状
理解为什么 STM32/ESP32/Zephyr 三巨头全部转向 CMake
定位 LKS32 的现状——官方仅有 Keil,但我们已完整移植
各大平台 CMake 支持现状 — 2025 年
| 平台 | CMake 支持 | 状态 | 说明 |
|---|---|---|---|
| STM32 | 原生 | 官方推荐 | STM32CubeMX 6.x 原生生成 CMakeLists.txt。全球最大 ARM MCU 生态转向 CMake。 |
| ESP32 (乐鑫) | 强制 | 唯一构建系统 | ESP-IDF v5.0 彻底移除 GNU Make。Xtensa + RISC-V 双架构统一 CMake。 |
| Zephyr RTOS | 强制 | 唯一构建系统 | Linux 基金会旗下,支持 200+ 开发板。第一天就是 CMake。 |
| NXP | 原生 | 官方推荐 | MCUXpresso SDK 2023 年起提供 CMake 构建选项。 |
| Raspberry Pi Pico | 强制 | 唯一构建系统 | Pico SDK 完全是 CMake 项目。官方文档全部以 CMake 为例。 |
| Nordic nRF | 强制 | 唯一构建系统 | nRF Connect SDK 基于 Zephyr——本质是 CMake。 |
| 凌鸥 LKS32 | 无 | 需自行移植 | 官方仅提供 Keil 工程。本教程目的:完整 CMake 移植方案。 |
迁移时间线 2018 -> 2025
三大驱动力——为什么全行业都在转
开源生态需求
RTOS(Zephyr/FreeRTOS)需要在所有平台上可构建。专有 IDE 无法满足——它们没有 CLI、不支持 Linux CI。
CI/CD 压力
现代软件工程要求每次 PR 自动编译验证。专有 IDE 的 GUI 无法在 CI 服务器上运行。
多架构统一
Cortex-M + RISC-V + Xtensa — 不能为每个架构维护一套独立的构建系统。CMake toolchain.cmake 一行切换。
💡 结论2025 年开始一个嵌入式新项目——选择 CMake 不是"创新",是默认选项。继续用 Keil 管理构建配置是走在越来越窄的路上。
本页大纲:行业迁移全景
① 七大平台 CMake 支持现状 → ② 迁移时间线 2018→2025 → ③ 三大驱动力深度解析 → ④ 平台支持矩阵 SVG → ⑤ 交互:点选平台看迁移详情
🌊 CMake 化浪潮全景——7 大平台一图看清
⏳ 迁移时间线深度解析——四个关键转折点
| 时间 | 事件 | 为什么重要 |
|---|---|---|
| 2018 Q2 | STM32CubeMX 放弃 SW4STM32 | 最大 ARM MCU 厂商表态——行业第一个重大信号 |
| 2020 Q3 | Zephyr 2.3 LTS 发布 | Linux 基金会 RTOS 证明 CMake 在 RTOS 级别可行 |
| 2022 Q4 | ESP-IDF v5.0 移除 Make | 全球销量最大 Wi-Fi MCU 全面 CMake 化 |
| 2023-25 | ARM 生态全面转向 | NXP/Nordic/Renesas 全支持——CMake 成为默认选项 |
💡 看懂这个时间线的规律每一次迁移都遵循同一模式:先是大厂表态 → 然后是开源社区跟进 → 最后全行业默认。LKS32 还在"官方仅 Keil"阶段——你现在学的,正是下一波浪潮的入场券。
🧲 三大驱动力的深度拆解——为什么"转"是必然
💡 一句话总览2025 年选 CMake 不是"创新",是*“跟随行业共识”*。今天你不学,明天换工作、换项目、换芯片时,CMake 会来找你。
📋 行业迁移状态总表——把你的芯片对号入座
| 平台 | CMake 地位 | 迁移时间 | 驱动原因 | 你的行动 |
|---|---|---|---|---|
| STM32 | 原生 | 2018 起 | 官方表态 + 生态压力 | 学会读官方模板 |
| ESP32 | 强制 | 2022 v5.0 | 多架构统一 | 理解 idf.py 封装 |
| Zephyr | 强制 | 第一天 | 200+ 板卡管理 | 学习配置驱动思想 |
| Pico | 强制 | 2021 发布起 | 官方设计决策 | 验证 CMake 普及度 |
| Nordic | 强制 | 2020 起 | 基于 Zephyr | 同上 |
| NXP | 原生 | 2023 起 | 跟随 ST 步伐 | 同上 |
| 凌鸥 LKS32 | 无 | — | 官方仅 Keil | 你正在做 |
💡 对号入座结论7 大平台中 5 个"强制/原生"CMake、1 个"原生"、只有 LKS32 是空白。你不是在学一个冷门工具——你是在填补国产芯片生态里最后一块空白。
深入 STM32
深入 STM32:全球最大 ARM MCU 生态的 CMake 化
ST 的 CMake 化策略是双向兼容——既保留传统 IDE 工程,又原生生成 CMakeLists.txt。STM32CubeMX 6.x 默认勾选"Generate CMake project"。
STM32CubeMX 生成的 CMakeLists.txt(简化示例)
cmake_minimum_required (VERSION 3.20 ) project (stm32f103_blinky C ASM) # CubeMX 自动添加所有源文件 add_executable ( ${PROJECT_NAME} .elf) target_sources ( ${PROJECT_NAME} .elf PRIVATE Core/Src/main.c Core/Src/stm32f1xx_it.c Core/Src/gpio.c Core/Src/usart.c Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c ... (CubeMX 自动列出所有用到的 HAL 文件) ) target_include_directories ( ${PROJECT_NAME} .elf PRIVATE Core/Inc Drivers/STM32F1xx_HAL_Driver/Inc Drivers/CMSIS/Device/ST/STM32F1xx/Include Drivers/CMSIS/Include ) target_compile_definitions ( ${PROJECT_NAME} .elf PRIVATE USE_HAL_DRIVER STM32F103xB )STM32 的迁移意义
| 层面 | 意义 |
|---|---|
| 用户量 | STM32 是全球出货量最大的 Cortex-M 系列 MCU。它的 CMake 化意味着数以百万计的开发者从 Keil/IAR 转向 CMake。 |
| 生态影响 | CubeMX 的 CMake 输出成为了"嵌入式 CMake 的标准写法"——其他厂商的 SDK 借鉴了它的 target_sources + target_include_directories 模式。 |
| 工具链 | ST 推荐 arm-none-eabi-gcc 而非 ARMCC。这意味着从 STM32 开始,GCC 成为 Cortex-M 开发的事实标准编译器。 |
💡 这跟 LKS32 有什么关系?LKS32MC033 也是 Cortex-M0——和 STM32F0 使用的是完全相同的 arm-none-eabi-gcc 工具链。STM32 的 CMake 模式可以直接借鉴到 LKS32 的移植中。
本页大纲:深入 STM32 迁移
① STM32CubeMX 为什么放弃自家 IDE → ② CubeMX 生成 CMake 的完整流程 → ③ 生成的 CMakeLists.txt 结构解剖 → ④ 交互:CubeMX 生成流程模拟 → ⑤ STM32 与 LKS32 的对照启示
🔵 STM32 的转身——最震撼的行业信号
2018 年,ST 官方宣布停止维护 System Workbench(SW4STM32/AC6)——这是基于 Eclipse 的免费 IDE。理由很直接:开发者要的是"构建系统",不是"IDE 锁定"。STM32CubeMX 从 6.0 开始原生生成 CMakeLists.txt,全球最大的 ARM MCU 生态正式拥抱 CMake。
📄 CubeMX 生成的 CMakeLists.txt 结构——和你将要写的 LKS32 版几乎同构
# CubeMX 生成(简化) cmake_minimum_required(VERSION 3.20) project(stm32f103c8t6 LANGUAGES C ASM) add_compile_definitions(STM32F103xB USE_HAL_DRIVER) ← 宏定义 # 收集源文件 file(GLOB_RECURSE HAL_SOURCES "Drivers/STM32F1xx_HAL_Driver/Src/*.c") file(GLOB_RECURSE CORE_SOURCES "Core/Src/*.c" "Drivers/CMSIS/Device/*.c") add_executable(${PROJECT_NAME}.elf ${HAL_SOURCES} ${CORE_SOURCES}) # 链接脚本 + 启动文件 target_link_options(${PROJECT_NAME}.elf PRIVATE -T"STM32F103C8Tx_FLASH.ld") target_sources(${PROJECT_NAME}.elf PRIVATE "startup_stm32f103xb.s") # POST_BUILD 生成 .hex/.bin(第 18 课详解) add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD COMMAND ${CMAKE_OBJCOPY} -O ihex ... .hex)💡 对照你的 LKS32 项目你会发现 CubeMX 生成的 CMakeLists.txt 与第 28 课要讲的 LKS32 顶层 CMakeLists.txt骨架几乎一样:project() → 宏定义 → 收集源文件 → add_executable → 链接脚本 → POST_BUILD。学会一套,所有厂商通用。
🧭 STM32 vs LKS32 迁移对照表——别人走过的路就是你的地图
| 维度 | STM32(已迁移) | LKS32(本教程) |
|---|---|---|
| 官方 SDK | CubeMX 原生生成 CMake | 仅 Keil 工程 |
| 迁移难度 | 低——官方已支持 | 中——需手写 CMakeLists + 移植启动文件 |
| 工具链 | arm-none-eabi-gcc | arm-none-eabi-gcc(同一套!) |
| 调试 | J-Link/ST-Link + GDB | J-Link + GDB(第 42-46 课) |
| 你的收益 | 学会看官方模板 | 学会从零构建——理解更深 |
💡 最关键的认知STM32 开发者用 CubeMX“一键生成”CMake 工程,但他们常常不理解生成的配置。你手把手把 LKS32 从 Keil 移植成 CMake——你对构建的理解比大多数 STM32 开发者更深。这份理解,就是迁移任何芯片的通用能力。
📊 STM32 生态规模——为什么它的选择影响全行业
🧩 STM32CubeMX 生成工程 vs LKS32 手写工程——同一骨架,两种来源
| 对比维度 | STM32CubeMX 生成 | LKS32 手写(本教程) |
|---|---|---|
| CMakeLists 来源 | 工具自动生成 | 手写(第 28 课逐行) |
| 理解深度 | 生成即用,未必懂 | 逐行理解,全链路掌握 |
| 启动文件 | 自动生成 .s | 手写移植 startup.S(第 49 课) |
| 链接脚本 | 自动生成 .ld | 手写移植(第 25-26 课) |
| 学习曲线 | 低门槛高天花板 | 高投入高回报 |
💡 定位差异CubeMX 适合"快速启动产品开发";本教程适合"想彻底掌握构建系统"的你。两条路殊途同归——都会落到同一份 CMake 语法上。
深入 ESP32/Zephyr
深入 ESP32 与 Zephyr——CMake 作为唯一构建系统
如果说 STM32 的 CMake 化是"兼容性过渡",那么ESP32 和 Zephyr 的 CMake 化就是"断腕式革命"——它们彻底移除了旧的构建系统,CMake 是唯一选项。
ESP-IDF v5.0:从 GNU Make 到 CMake 的强制迁移
乐鑫在 2022 年做了一个激进但正确的决定:在 ESP-IDF v5.0 中完全移�� GNU Make 支持。所有 ESP32/ESP32-S/ESP32-C 系列(覆盖 Xtensa 和 RISC-V 两种 CPU 架构)统一使用 CMake。
💡 迁移成功的原因ESP-IDF 的 CMake 化不是简单的"替换构建系统"——而是配合 idf.py 命令行工具提供了一个完整的开发体验。所有这些命令底层都调用 CMake。
Zephyr RTOS — "CMake 原生"从第一天
Zephyr 从一开始就以 CMake 为核心。它的构建系统非常复杂——支持 200+ 开发板、多架构(ARM/RISC-V/x86/ARC)、设备树(DeviceTree)、Kconfig 配置系统。这证明了CMake 可以胜任最复杂的嵌入式构建场景。
# 构建 Nordic nRF52840 开发板的 blinky 示例 west build -b nrf52840dk_nrf52840 samples/basic/blinky # west 底层调用: # cmake -B build -DBOARD=nrf52840dk_nrf52840 # cmake --build build| Zephyr 特性 | CMake 如何支撑 |
|---|---|
| 200+ 开发板 | 每个板级支持包是一个 CMake 模块,通过 BOARD 变量选择 |
| 设备树 (DeviceTree) | CMake 调用 dtc 编译 .dts -> .dtb,链接到固件 |
| Kconfig 配置 | CMake 调用 kconfig 工具,生成 autoconf.h 宏定义 |
| 多架构 | toolchain.cmake 自动切换 ARM/RISC-V/x86 GCC |
对比 ESP32 vs Zephyr vs STM32 — 三种 CMake 化路径
| 平台 | CMake 化方式 | 激进程度 | 对用户的冲击 |
|---|---|---|---|
| STM32 | CubeMX 同时生成 CMake + Keil/IAR 工程 | 温和过渡 | 低——用户可自由选择 |
| ESP32 | ESP-IDF v5.0 移除 Make,仅 CMake | 激进革命 | 高——旧 Makefile 工程必须重写 |
| Zephyr | 从第一天就是 CMake | 无历史包袱 | 无——用户从一开始就用 CMake |
本页大纲:ESP32 与 Zephyr 的强制 CMake
① ESP-IDF v5.0 移除 Make 的来龙去脉 → ② Zephyr 的 CMake 构建系统架构 → ③ 强制 CMake 意味着什么 → ④ 交互:两平台构建命令对比 → ⑤ 从 RTOS 学到什么
🟢 ESP-IDF v5.0 — "Make 已被移除"是 2022 年最大的行业宣言
2022 年 11 月,乐鑫发布 ESP-IDF v5.0,彻底移除 GNU Make 构建系统——CMake 成为唯一官方构建方式。这意味着:所有旧教程失效、所有旧项目要迁移、所有第三方库要更新。一个商业公司为了长期健康,敢做"破坏性"决策——这本身就是信号:CMake 不是"可选项",是"唯一选项"。
# ESP-IDF(v5.0+)—— idf.py 是 CMake 的封装 $ idf.py set-target esp32s3 $ idf.py build # 内部就是 cmake --build $ idf.py flash # 内部就是 esptool 烧录 # Zephyr—— west 是 CMake 的封装 $ west build -b nucleo_f103rb samples/hello_world $ west flash # 内部也是 cmake + 烧录器 # 本质:两者底层都是 CMake $ cmake --preset default # 你将在第 33-35 课掌握的技能🟡 Zephyr — 200+ 开发板一套构建系统的"极端测试"
Zephyr RTOS 支持200+ 开发板、多种架构(ARM/RISC-V/Xtensa/SPARC)。如果用传统 IDE,每个板子一套工程——不可维护。Zephyr 的选择:一套 CMake 构建系统 + 每个板子一个配置文件。
🧠 从 RTOS 的"强制 CMake"学到什么
| 学到的认知 | 具体含义 |
|---|---|
| CMake 是底层引擎 | idf.py/west 只是 CMake 的"人性化封装"——懂 CMake 就能看懂任何框架的构建 |
| 配置与代码分离 | 板卡差异 = 配置文件差异(toolchain/设备树),不是代码差异 |
| 学习投资回报高 | 学一次 CMake,Zephyr/ESP-IDF/STM32/LKS32 全部通用 |
| 封装不可怕 | 封装下面是标准 CMake——出问题时剥开看本质 |
💡 本页小结ESP-IDF 与 Zephyr 的"强制 CMake"证明:当生态复杂到一定程度(多架构、多板卡、多厂商),唯一可行的构建方案就是 CMake。LKS32 的复杂度虽低,但方向一致——你现在打的地基,未来能盖任何楼。
📈 ESP-IDF 与 Zephyr 的构建命令全景对比——同一底层,两种体验
🎓 从 Zephyr 的设备树看"配置驱动构建"——CMake 的终极形态
Zephyr 用 **设备树(DTS)**描述硬件——每个板卡的引脚、外设、时钟全部写在配置文件里。CMake 读取设备树 + Kconfig,自动决定编译哪些驱动。这就是"配置驱动构建"的极致:硬件差异全部下沉到配置文件,代码零改动。
// boards/arm/nucleo_f103rb/nucleo_f103rb.dts &uart1 { status = "okay"; ← 使能 UART1 current-speed = <115200>; ← 波特率 }; &spi1 { status = "okay"; ← 使能 SPI1 cs-gpios = <&gpioa 4 GPIO_ACTIVE_LOW>; ← CS 引脚 };💡 对照你的 LKS32本教程第 35 课"多芯片 Presets"用的就是同一思想的简化版:用 CMakePresets + option() 把芯片差异配置化。Zephyr 是终极形态,你的 LKS32 是入门形态——但核心思想一致:配置与代码分离。
LKS32 现状与机遇
LKS32 的现状——官方仅 Keil,但完整 CMake 移植存在
凌鸥官方为 LKS32MC033 提供的开发资源是Keil Pack(.pack 压缩包)。没有官方的 CMake 支持。这正是本教程的独特价值所在。
凌鸥官方资源 vs 我们移植的 CMake 工程
| 官方提供 | 格式 | 我们的移植 |
|---|---|---|
| Keil Pack | .pack 压缩包(LKS03x v1.1.8) | 提取 CMSIS + HAL 源文件 -> CMake 工程 |
| .uvprojx 工程 | Keil 二进制 XML | 重写为 CMakeLists.txt + CMakePresets.json + toolchain.cmake |
| startup_xxx.s | ARMCC 汇编语法(AREA/DCD/PROC) | 重写为 GCC 汇编语法(.section/.word/.type)-> startup_lks32mc03x.S |
| 链接脚本 .sct | Scatter File(ARMCC 专用) | 重写为 .ld(GNU Linker 语法)-> lks32mc03x.ld |
| nvr.lib | ARMCC 预编译库(闭源) | 重写为 lks32mc03x_nvr_gcc.c(GCC 源码实现 Read_Trim) |
| J-Link 设备注册 | 手动添加到 JLinkDevices.xml | 同官方方法——已配置好 LKS32MC033 条目 |
LKS32 CMake 移植的五步流程
移植后的验证结果
💡 这就是本教程的价值我们不仅教你 CMake 语法——我们给你一个完整可运行的 LKS32 CMake 工程,从 Keil 完全迁移到了 GCC+CMake 生态系统。Flash 仅用 3.91%——还有 96% 空间留给你加功能。
本页大纲:LKS32 现状与机遇
① 凌鸥官方的现状——仅 Keil → ② 这不是"落后",是"机会" → ③ 五步移植方案总览 → ④ 交互:移植前后对比 → ⑤ 移植后你的独特竞争力
🔴 凌鸥 LKS32 的现状——官方仅提供 Keil 工程
打开凌鸥官方 SDK 下载页:所有示例工程都是 .uvprojx(Keil 格式)。没有 CMake、没有 GCC 工程、没有 Linux 支持。对大多数用户这不是问题——“Keil 能用就行”。但这也意味着:所有依赖自动化、CI、跨平台的现代工作流,LKS32 生态都无法直接享受。
🗺️ 五步移植方案——本教程 58 课的总路线图
| 步骤 | 内容 | 做什么 | 对应课程 |
|---|---|---|---|
| 1 | 搭环境 | MSYS2 + GCC + CMake + Ninja | 第 05-08 课 |
| 2 | 建骨架 | 七层目录 + 顶层 CMakeLists + toolchain | 第 19-22、27-29 课 |
| 3 | 移植代码 | 启动文件 .s→.S、.sct→.ld、HAL 编译 | 第 25-26、48-51 课 |
| 4 | 接调试 | VSCode + J-Link + Cortex-Debug | 第 36-46 课 |
| 5 | 上自动化 | Presets + tasks + CI/CD | 第 33-35、47、55 课 |
💡 好消息官方 SDK 的HAL 驱动源码、寄存器定义、外设库都是跨编译器的——Keil 工程里的 .c/.h 可以直接复用,只需要改写启动文件、链接脚本、构建配置这三样。第 48 课会详细讲移植对照。
💎 移植后的独特竞争力——为什么这件事值得做
稀缺性
全网络搜"LKS32 CMake"几乎零结果——你做完就是先驱,你的工程就是别人的参考
理解深度
从零移植逼你理解启动、链接、编译全链路——比"一键生成"开发者理解深得多
可迁移性
这份移植能力能套用到任何"只有 Keil 工程"的国产芯片——你的技能边界远超 LKS32
💡 本页小结LKS32 官方没做 CMake,不是"落后",是*“把机会留给了你”*。你现在学的,不只是构建工具——是国产芯片生态里稀缺的现代构建能力。
🗂️ 官方 SDK 目录 vs 移植后目录——差异一目了然
LKS32MC03x_Demo/ ├── LKS32MC03x.uvprojx ← 唯一的"构建入口" ├── User/ │ ├── main.c │ └── lks32mc03x_it.c ├── Drivers/ │ ├── CMSIS/ (头文件) │ ├── Device/ (startup + system) │ └── HAL/ (18 外设 .c) └── config/ └── lks32mc03x.hlks32-cmake/ ├── CMakeLists.txt ← 顶层构建入口 ├── cmake/toolchain.cmake ← 工具链 ├── CMakePresets.json ← 预设 ├── app/ (main.c) ├── bsp/ (led/delay) ├── drivers/ │ ├── CMSIS/ │ ├── Device/ │ └── HAL/ ├── .vscode/ (settings/launch) └── build/ (自动生成)💡 关键差异左边的工程"构建入口"是.uvprojx(需 Keil 解析);右边是CMakeLists.txt(纯文本,任何工具可读)。源码几乎没动,动的是"构建方式"——这正是移植的全部含义。