这次我们来看一个面向嵌入式开发者的实战项目如何在 VSCode 中搭建 Zephyr RTOS 开发环境并针对经典的 STM32F103C8T6 最小系统板完成一个项目的编译、烧录与运行演示。对于习惯了 Keil、IAR 等传统 IDE 的嵌入式工程师来说使用 VSCode Zephyr 进行开发意味着更现代的代码编辑体验、更强大的版本控制集成以及开源 RTOS 带来的丰富组件和跨平台支持。但这个过程也伴随着一系列环境配置的挑战比如工具链安装、环境变量设置、项目构建等。本文的核心目标就是帮你跨过这些门槛。我们将重点关注这套开发方案的几个关键点环境搭建的完整流程、编译系统的配置、针对特定开发板的适配以及最终的运行验证。整个过程不需要复杂的硬件调试器一块常见的 ST-Link 或 DAP-Link 即可。如果你手头有 STM32F103C8T6俗称“蓝色药丸”或“最小系统板”并且希望尝试更高效的开发方式那么这篇文章可以直接跟着操作。1. 核心能力速览在深入细节之前我们先通过一个表格快速了解本次实践方案的核心要素和门槛让你判断是否值得投入时间。能力项说明目标平台STM32F103C8T6 最小系统板 (Cortex-M3, 64KB Flash, 20KB RAM)操作系统Zephyr RTOS (一个可扩展的实时操作系统)开发环境Visual Studio Code (VSCode) 相关插件工具链Zephyr SDK (包含编译器、调试器、烧录工具等)构建系统CMake West (Zephyr 元工具)硬件门槛任意 x86_64 PC内存建议 8GB 以上需要 ST-Link/V2 或兼容调试器启动方式通过 VSCode 终端执行 West 命令进行构建和烧录主要功能在 VSCode 中完成代码编辑、构建、烧录、调试可选全流程适合场景学习 Zephyr RTOS、为 STM32F103 开发应用、体验现代嵌入式开发流程难点初始环境配置步骤较多需要正确安装和配置 Python、CMake、Git 及 Zephyr SDK2. 适用场景与使用边界这套 VSCode Zephyr STM32F103 的方案主要适合以下几类开发者和场景Zephyr RTOS 初学者想找一个最通用、资料最多的硬件平台入门 ZephyrSTM32F103C8T6 是绝佳选择。传统 IDE 迁移者习惯了 Keil MDK 或 IAR希望转向更开源、更可定制的 VSCode 开发环境提升开发效率。项目原型快速验证利用 Zephyr 内置的丰富组件如文件系统、网络协议栈、传感器驱动快速在 STM32F103 上搭建功能原型。教学与培训成本低廉的硬件和开源的工具链非常适合用于嵌入式操作系统和现代开发工具的教学。需要注意的使用边界性能与资源STM32F103C8T6 资源有限64KB Flash/20KB RAM。运行完整的 Zephyr 内核及复杂组件如 LVGL GUI可能比较紧张更适合用于学习驱动、任务调度、IPC 等核心机制。生产环境考量对于资源极度敏感或对启动时间有严苛要求的量产项目需要深入评估 Zephyr 的尺寸和启动开销。本教程更侧重于开发流程和环境搭建。调试体验虽然可以配置 VSCode 进行源码级调试但其体验可能仍不及 Keil/IAR 的专有调试器流畅尤其是在复杂断点和实时变量查看时。知识储备需要具备基本的嵌入式 C 语言编程、Git 使用和命令行操作知识。3. 环境准备与前置条件开始之前请确保你的开发主机以 Windows 为例满足以下条件。这是后续所有步骤能顺利进行的基础。操作系统Windows 10/11 64位或 Ubuntu 20.04/22.04 LTS 等主流 Linux 发行版。本文以 Windows 为例Linux/macOS 步骤类似。硬件准备STM32F103C8T6 最小系统板一块。ST-Link/V2或兼容的 DAP-Link、J-Link调试器一个。Micro-USB 数据线用于连接调试器和电脑。杜邦线若干连接调试器与开发板。软件前置依赖必须安装Python 3.8 或更高版本Zephyr 的工具链依赖 Python。建议从 python.org 下载安装并勾选 “Add Python to PATH”。Git用于克隆 Zephyr 源码和项目管理。从 git-scm.com 下载安装。CMake 3.20.0 或更高版本Zephyr 使用 CMake 作为构建系统。从 cmake.org 下载安装同样记得添加至 PATH。Visual Studio Code从 code.visualstudio.com 下载安装。VSCode 插件安装以下插件以提升体验C/C(Microsoft)提供代码智能感知、跳转、调试支持。CMake Tools(Microsoft)提供 CMake 项目的配置、构建、调试集成。(可选)Zephyr IDE提供 Zephyr 特定的 Kconfig 和 Devicetree 语法高亮。验证基础环境安装完成后打开一个新的命令提示符CMD或 PowerShell分别执行以下命令确认安装成功且版本符合要求。python --version git --version cmake --version4. 安装 Zephyr SDK 与获取源码这是配置 Zephyr 开发环境的核心步骤。我们将使用官方推荐的west工具来完成。步骤 1安装 West 工具West 是 Zephyr 项目的元工具用于管理多个仓库Zephyr 源码、模块等和执行构建、烧录等命令。通过 pip 安装pip install west安装完成后运行west --version确认安装成功。步骤 2获取 Zephyr 源码并安装 SDK选择一个合适的目录例如C:\Users\YourName\zephyrproject在此打开命令行执行以下命令。此命令会初始化一个 west workspace并自动克隆 Zephyr 主仓库。west init zephyrproject cd zephyrproject west update接下来安装 Zephyr SDK。SDK 包含了针对 ARM Cortex-M 等架构的交叉编译工具链GCC、调试器GDB以及 OpenOCD 等必要工具。运行 SDK 安装脚本# 在 zephyrproject 目录下执行 west zephyr-export # 然后运行 SDK 安装器。请根据你的操作系统从 Zephyr 官网下载对应的安装包。 # Windows 下通常是一个 .exe 文件运行并按照指引安装建议使用默认路径。步骤 3配置环境变量安装完 SDK 后需要设置两个关键的环境变量让系统知道工具链的位置。ZEPHYR_BASE指向 Zephyr 源码根目录例如C:\Users\YourName\zephyrproject\zephyr。将 Zephyr SDK 的bin目录例如C:\zephyr-sdk-0.16.0\arm-zephyr-eabi\bin添加到系统的PATH变量中。在 Windows 中可以通过“系统属性”-“高级”-“环境变量”进行设置。设置完成后务必重新打开命令行终端使环境变量生效。步骤 4验证环境在zephyrproject目录下运行以下命令如果能看到 Zephyr 的版本信息并且没有报错找不到编译器说明环境基本配置正确。west --version arm-zephyr-eabi-gcc --version5. 在 VSCode 中创建与配置项目我们不直接修改 Zephyr 源码树中的示例而是创建一个独立的应用目录这样更清晰也符合项目管理的最佳实践。步骤 1创建应用目录在zephyrproject目录外新建一个项目文件夹例如my_stm32_blinky。然后用 VSCode 打开这个文件夹。步骤 2创建项目基础结构在 VSCode 的资源管理器中于项目根目录创建以下文件和文件夹my_stm32_blinky/ ├── CMakeLists.txt ├── prj.conf └── src/ └── main.c步骤 3编写 CMakeLists.txtCMakeLists.txt文件告诉构建系统如何编译你的项目。内容如下# 指定所需 CMake 最低版本和项目名 cmake_minimum_required(VERSION 3.20.0) find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) project(my_blinky) # 将 src 目录下的源文件加入构建目标 target_sources(app PRIVATE src/main.c)步骤 4编写配置文件 prj.conf这个文件用于配置 Zephyr 内核和组件功能。对于一个简单的 LED 闪烁程序我们只需要启用 GPIO 和系统时钟。# 启用 GPIO 驱动 CONFIG_GPIOy # 启用系统时钟通常需要 CONFIG_CLOCK_CONTROLy步骤 5编写主程序 src/main.c这是一个最简单的 LED 闪烁程序。根据你的 STM32F103C8T6 最小系统板LED 可能连接在不同的引脚上常见的是 PC13。这里以 PC13 为例。#include zephyr/kernel.h #include zephyr/drivers/gpio.h /* 定义 LED 设备树节点标识符。 * 对于 STM32F103C8T6用户 LED 通常通过 led0 别名定义在设备树中。 * 如果板级定义不同可能需要调整。最通用的方式是直接使用 GPIO 端口和引脚号。 */ #define LED0_NODE DT_ALIAS(led0) /* 如果设备树中没有 led0 别名我们可以直接指定 GPIO 端口和引脚 */ #if !DT_NODE_HAS_STATUS(LED0_NODE, okay) #error Unsupported board: led0 devicetree alias is not defined #endif static const struct gpio_dt_spec led GPIO_DT_SPEC_GET(LED0_NODE, gpios); void main(void) { int ret; printk(Hello from Zephyr on STM32F103C8T6!\n); /* 检查 LED 设备是否就绪 */ if (!device_is_ready(led.port)) { printk(Error: LED device is not ready\n); return; } /* 配置 LED 引脚为输出模式初始状态关闭假设低电平点亮 */ ret gpio_pin_configure_dt(led, GPIO_OUTPUT_ACTIVE); if (ret 0) { printk(Error %d: failed to configure LED pin\n, ret); return; } while (1) { /* 切换 LED 状态 */ ret gpio_pin_toggle_dt(led); if (ret 0) { printk(Error %d: failed to toggle LED\n, ret); return; } /* 延时 1000 毫秒 */ k_msleep(1000); } }步骤 6配置 VSCode 的 CMake Tools 插件按下CtrlShiftP输入 “CMake: Configure”选择它。首次配置时它会让你选择一个“Kit”。选择“Zephyr SDK arm-zephyr-eabi”或类似的选项。这对应我们之前安装的交叉编译工具链。接着会让你选择目标。输入stm32f103c8t6或从列表中选择stm32f103c8t6如果可用。CMake 会根据此目标加载对应的板级配置文件。配置成功后在 VSCode 底部状态栏可以看到目标平台和构建类型如[stm32f103c8t6] [Debug]。6. 编译项目配置好 CMake 后编译就非常简单了。方法一使用 VSCode CMake Tools点击 VSCode 底部状态栏的“构建”按钮一个齿轮或播放图标或者按F7键。构建输出会显示在 VSCode 的“终端”面板中。等待构建完成最终应显示[100%] Built target zephyr_final并生成zephyr/zephyr.bin和zephyr/zephyr.elf等文件。方法二使用命令行West你也可以在 VSCode 的集成终端Ctrl中切换到项目根目录使用 west 命令构建west build -b stm32f103c8t6-b参数指定开发板型号。构建输出位于build/目录下。编译成功的关键标志终端无致命错误Error。在build/zephyr/目录下生成了zephyr.bin二进制烧录文件和zephyr.elf带调试信息的可执行文件。输出信息中包含了代码段.text、数据段.data等的大小确保它们没有超过 STM32F103C8T6 的 Flash (64KB) 和 RAM (20KB) 限制。7. 烧录与运行演示我们将使用 OpenOCD已包含在 Zephyr SDK 中通过 ST-Link 进行烧录。步骤 1硬件连接使用杜邦线将 ST-Link 调试器与 STM32F103C8T6 最小系统板连接ST-LinkSWDIO- 板子SWDIO(PA13)ST-LinkSWCLK- 板子SWCLK(PA14)ST-LinkGND- 板子GNDST-Link3.3V- 板子3.3V(可选如果板子不自带供电)连接好后将 ST-Link 通过 USB 线插入电脑。步骤 2烧录固件在项目根目录下使用 west 命令进行烧录west flash这个命令会自动调用合适的 Runner对于 STM32 和 ST-Link通常是openocd或pyocd。你会在终端看到类似以下输出-- west flash: using runner openocd -- runners.openocd: Flashing file: build/zephyr/zephyr.bin ... ** OpenOCD init completed ** ** Programming Started ** ... ** Programming Finished ** ** Verify Started ** ... ** Verified OK ** ** Resetting Target **看到** Verified OK **和** Resetting Target **即表示烧录成功程序已开始运行。步骤 3观察运行效果烧录完成后STM32F103C8T6 板载的 LED通常是连接在 PC13 的蓝色或绿色 LED应该开始以 1 秒的间隔闪烁。同时如果你连接了串口转换器到 USART1 (PA9/PA10)并在 PC 端使用串口助手如 Putty、Tera Term打开对应端口波特率通常为 115200应该能看到Hello from Zephyr on STM32F103C8T6!的输出信息。至此你已经完成了在 VSCode 环境下从零开始创建、编译、烧录并运行一个 Zephyr 应用程序到 STM32F103C8T6 的全过程。8. 功能进阶测试与验证基础 LED 闪烁跑通后可以尝试更多功能来验证环境的完整性和 Zephyr 的强大之处。8.1 串口打印测试修改prj.conf启用串口驱动和打印功能CONFIG_SERIALy CONFIG_CONSOLEy CONFIG_UART_CONSOLEy # 根据你的板子可能需要指定具体串口如 CONFIG_UART_1y在main.c中使用printk打印更多信息。重新编译烧录后通过串口观察输出。8.2 多线程任务测试Zephyr 的核心是实时内核。可以创建多个线程来测试任务调度void thread1_entry(void *p1, void *p2, void *p3) { while (1) { printk(Thread 1 running\n); k_msleep(500); } } void thread2_entry(void *p1, void *p2, void *p3) { while (1) { printk(Thread 2 running\n); k_msleep(1000); } } // 在 main 函数中使用 k_thread_create 创建线程观察串口输出看两个线程是否交替执行。8.3 使用其他外设如按键中断在prj.conf中确保 GPIO 和中断控制器启用CONFIG_GPIOy CONFIG_GPIO_INTERRUPTy在main.c中配置一个 GPIO 引脚为输入并设置中断回调函数当按键按下时打印信息或切换 LED。这些测试能全面验证你的开发环境是否已正确配置能够支持 Zephyr 的各项核心功能。9. 常见问题与排查方法在配置和运行过程中你可能会遇到以下典型问题。这里提供排查思路。问题现象可能原因排查方式解决方案west命令未找到Python 或west未正确安装或 PATH 未设置。在命令行输入west --version。1. 确认 Python 已安装且 PATH 包含 Scripts 目录。2. 重新运行pip install west。CMake 配置失败找不到工具链Zephyr SDK 未安装或环境变量ZEPHYR_TOOLCHAIN_VARIANT未设置。检查arm-zephyr-eabi-gcc --version。1. 确认 Zephyr SDK 已安装。2. 检查并正确设置ZEPHYR_SDK_INSTALL_DIR和PATH环境变量。编译错误No board found指定的开发板名称错误或该板卡支持未包含在 Zephyr 源码中。运行west boards查看支持的板卡列表。1. 使用west boards确认正确的板卡名称如stm32f103c8t6。2. 确保 Zephyr 源码已通过west update更新到最新。west flash失败无法连接目标1. 硬件连接错误线序、供电。2. ST-Link 驱动未安装。3. 其他程序占用了调试接口。1. 检查杜邦线连接。2. 在设备管理器中查看 ST-Link 是否被识别。3. 尝试使用west flash --runner openocd指定 runner。1. 重新拔插 USB 线检查连接。2. 安装 ST-Link USB 驱动。3. 关闭可能占用 ST-Link 的软件如 Keil, STM32CubeIDE。4. 尝试以管理员身份运行命令行。程序烧录成功但 LED 不闪烁1. LED 引脚定义错误。2. 程序逻辑错误如延时过长。3. 时钟配置问题。1. 查阅开发板原理图确认 LED 连接的正确 GPIO 引脚。2. 使用调试器单步调试或添加更多printk输出。3. 检查prj.conf中时钟配置。1. 修改main.c中的 GPIO 引脚定义或使用设备树别名led0。2. 减小k_msleep的参数值测试。3. 确保CONFIG_CLOCK_CONTROLy。串口无输出1. 串口引脚连接错误。2. 波特率不匹配。3. 串口驱动未正确启用。1. 确认 TX/RX 线是否接反。2. 尝试常见的波特率115200, 9600。3. 检查prj.conf中的串口配置。1. 交换 TX 和 RX 线序尝试。2. 在prj.conf中明确配置CONFIG_UART_1y和CONFIG_UART_CONSOLE_ON_DEV_NAMEUART_1如果使用 USART1。10. 最佳实践与使用建议为了更高效、稳定地使用 VSCode Zephyr 进行开发建议遵循以下实践项目结构标准化始终在 Zephyr 工作空间zephyrproject之外创建你的应用目录。使用清晰的文件夹结构如src/,include/,boards/如有自定义板级文件并将CMakeLists.txt和prj.conf放在根目录。版本控制使用 Git 管理你的应用代码。将zephyrproject目录添加到.gitignore中因为 Zephyr 源码本身应该作为子模块或由 west 管理。只提交你自己的应用代码、配置和文档。善用 VSCode 智能感知正确配置C/C插件的c_cpp_properties.json将ZEPHYR_BASE等路径包含到includePath中这样可以实现完美的代码跳转和自动补全。调试配置虽然本文未详细展开但强烈建议配置 VSCode 的调试功能。你需要创建一个launch.json文件配置调试器路径如arm-zephyr-eabi-gdb和 OpenOCD 作为调试服务器。这能极大提升问题排查效率。资源监控每次编译后关注终端输出的内存占用报告。确保你的应用不会超出 STM32F103C8T6 的 Flash 和 RAM 限制。可以使用west build -t rom_report和west build -t ram_report生成详细的内存使用报告。逐步增加复杂度从一个最简单的 Blinky 开始确保基础环境无误。然后逐步添加功能模块如传感器驱动、文件系统、网络每步都进行测试便于隔离问题。查阅官方文档Zephyr 官方文档非常详尽。遇到问题时首先查阅 Zephyr Project Documentation 特别是关于板卡支持、设备树和 Kconfig 配置的部分。通过本教程你不仅成功在 STM32F103C8T6 上运行了 Zephyr更重要的是掌握了一套现代化的、基于 VSCode 和开源工具链的嵌入式开发流程。这套流程的可扩展性极强你可以将其轻松迁移到其他 Zephyr 支持的数百款开发板上。接下来可以尝试探索 Zephyr 的更多高级特性如电源管理、线程间通信、文件系统或网络连接将这块经典的单片机玩出新的高度。建议将本文涉及的环境配置步骤和命令保存下来作为日后搭建新项目环境的快速参考。
VSCode搭建Zephyr RTOS开发环境:STM32F103C8T6实战指南
这次我们来看一个面向嵌入式开发者的实战项目如何在 VSCode 中搭建 Zephyr RTOS 开发环境并针对经典的 STM32F103C8T6 最小系统板完成一个项目的编译、烧录与运行演示。对于习惯了 Keil、IAR 等传统 IDE 的嵌入式工程师来说使用 VSCode Zephyr 进行开发意味着更现代的代码编辑体验、更强大的版本控制集成以及开源 RTOS 带来的丰富组件和跨平台支持。但这个过程也伴随着一系列环境配置的挑战比如工具链安装、环境变量设置、项目构建等。本文的核心目标就是帮你跨过这些门槛。我们将重点关注这套开发方案的几个关键点环境搭建的完整流程、编译系统的配置、针对特定开发板的适配以及最终的运行验证。整个过程不需要复杂的硬件调试器一块常见的 ST-Link 或 DAP-Link 即可。如果你手头有 STM32F103C8T6俗称“蓝色药丸”或“最小系统板”并且希望尝试更高效的开发方式那么这篇文章可以直接跟着操作。1. 核心能力速览在深入细节之前我们先通过一个表格快速了解本次实践方案的核心要素和门槛让你判断是否值得投入时间。能力项说明目标平台STM32F103C8T6 最小系统板 (Cortex-M3, 64KB Flash, 20KB RAM)操作系统Zephyr RTOS (一个可扩展的实时操作系统)开发环境Visual Studio Code (VSCode) 相关插件工具链Zephyr SDK (包含编译器、调试器、烧录工具等)构建系统CMake West (Zephyr 元工具)硬件门槛任意 x86_64 PC内存建议 8GB 以上需要 ST-Link/V2 或兼容调试器启动方式通过 VSCode 终端执行 West 命令进行构建和烧录主要功能在 VSCode 中完成代码编辑、构建、烧录、调试可选全流程适合场景学习 Zephyr RTOS、为 STM32F103 开发应用、体验现代嵌入式开发流程难点初始环境配置步骤较多需要正确安装和配置 Python、CMake、Git 及 Zephyr SDK2. 适用场景与使用边界这套 VSCode Zephyr STM32F103 的方案主要适合以下几类开发者和场景Zephyr RTOS 初学者想找一个最通用、资料最多的硬件平台入门 ZephyrSTM32F103C8T6 是绝佳选择。传统 IDE 迁移者习惯了 Keil MDK 或 IAR希望转向更开源、更可定制的 VSCode 开发环境提升开发效率。项目原型快速验证利用 Zephyr 内置的丰富组件如文件系统、网络协议栈、传感器驱动快速在 STM32F103 上搭建功能原型。教学与培训成本低廉的硬件和开源的工具链非常适合用于嵌入式操作系统和现代开发工具的教学。需要注意的使用边界性能与资源STM32F103C8T6 资源有限64KB Flash/20KB RAM。运行完整的 Zephyr 内核及复杂组件如 LVGL GUI可能比较紧张更适合用于学习驱动、任务调度、IPC 等核心机制。生产环境考量对于资源极度敏感或对启动时间有严苛要求的量产项目需要深入评估 Zephyr 的尺寸和启动开销。本教程更侧重于开发流程和环境搭建。调试体验虽然可以配置 VSCode 进行源码级调试但其体验可能仍不及 Keil/IAR 的专有调试器流畅尤其是在复杂断点和实时变量查看时。知识储备需要具备基本的嵌入式 C 语言编程、Git 使用和命令行操作知识。3. 环境准备与前置条件开始之前请确保你的开发主机以 Windows 为例满足以下条件。这是后续所有步骤能顺利进行的基础。操作系统Windows 10/11 64位或 Ubuntu 20.04/22.04 LTS 等主流 Linux 发行版。本文以 Windows 为例Linux/macOS 步骤类似。硬件准备STM32F103C8T6 最小系统板一块。ST-Link/V2或兼容的 DAP-Link、J-Link调试器一个。Micro-USB 数据线用于连接调试器和电脑。杜邦线若干连接调试器与开发板。软件前置依赖必须安装Python 3.8 或更高版本Zephyr 的工具链依赖 Python。建议从 python.org 下载安装并勾选 “Add Python to PATH”。Git用于克隆 Zephyr 源码和项目管理。从 git-scm.com 下载安装。CMake 3.20.0 或更高版本Zephyr 使用 CMake 作为构建系统。从 cmake.org 下载安装同样记得添加至 PATH。Visual Studio Code从 code.visualstudio.com 下载安装。VSCode 插件安装以下插件以提升体验C/C(Microsoft)提供代码智能感知、跳转、调试支持。CMake Tools(Microsoft)提供 CMake 项目的配置、构建、调试集成。(可选)Zephyr IDE提供 Zephyr 特定的 Kconfig 和 Devicetree 语法高亮。验证基础环境安装完成后打开一个新的命令提示符CMD或 PowerShell分别执行以下命令确认安装成功且版本符合要求。python --version git --version cmake --version4. 安装 Zephyr SDK 与获取源码这是配置 Zephyr 开发环境的核心步骤。我们将使用官方推荐的west工具来完成。步骤 1安装 West 工具West 是 Zephyr 项目的元工具用于管理多个仓库Zephyr 源码、模块等和执行构建、烧录等命令。通过 pip 安装pip install west安装完成后运行west --version确认安装成功。步骤 2获取 Zephyr 源码并安装 SDK选择一个合适的目录例如C:\Users\YourName\zephyrproject在此打开命令行执行以下命令。此命令会初始化一个 west workspace并自动克隆 Zephyr 主仓库。west init zephyrproject cd zephyrproject west update接下来安装 Zephyr SDK。SDK 包含了针对 ARM Cortex-M 等架构的交叉编译工具链GCC、调试器GDB以及 OpenOCD 等必要工具。运行 SDK 安装脚本# 在 zephyrproject 目录下执行 west zephyr-export # 然后运行 SDK 安装器。请根据你的操作系统从 Zephyr 官网下载对应的安装包。 # Windows 下通常是一个 .exe 文件运行并按照指引安装建议使用默认路径。步骤 3配置环境变量安装完 SDK 后需要设置两个关键的环境变量让系统知道工具链的位置。ZEPHYR_BASE指向 Zephyr 源码根目录例如C:\Users\YourName\zephyrproject\zephyr。将 Zephyr SDK 的bin目录例如C:\zephyr-sdk-0.16.0\arm-zephyr-eabi\bin添加到系统的PATH变量中。在 Windows 中可以通过“系统属性”-“高级”-“环境变量”进行设置。设置完成后务必重新打开命令行终端使环境变量生效。步骤 4验证环境在zephyrproject目录下运行以下命令如果能看到 Zephyr 的版本信息并且没有报错找不到编译器说明环境基本配置正确。west --version arm-zephyr-eabi-gcc --version5. 在 VSCode 中创建与配置项目我们不直接修改 Zephyr 源码树中的示例而是创建一个独立的应用目录这样更清晰也符合项目管理的最佳实践。步骤 1创建应用目录在zephyrproject目录外新建一个项目文件夹例如my_stm32_blinky。然后用 VSCode 打开这个文件夹。步骤 2创建项目基础结构在 VSCode 的资源管理器中于项目根目录创建以下文件和文件夹my_stm32_blinky/ ├── CMakeLists.txt ├── prj.conf └── src/ └── main.c步骤 3编写 CMakeLists.txtCMakeLists.txt文件告诉构建系统如何编译你的项目。内容如下# 指定所需 CMake 最低版本和项目名 cmake_minimum_required(VERSION 3.20.0) find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) project(my_blinky) # 将 src 目录下的源文件加入构建目标 target_sources(app PRIVATE src/main.c)步骤 4编写配置文件 prj.conf这个文件用于配置 Zephyr 内核和组件功能。对于一个简单的 LED 闪烁程序我们只需要启用 GPIO 和系统时钟。# 启用 GPIO 驱动 CONFIG_GPIOy # 启用系统时钟通常需要 CONFIG_CLOCK_CONTROLy步骤 5编写主程序 src/main.c这是一个最简单的 LED 闪烁程序。根据你的 STM32F103C8T6 最小系统板LED 可能连接在不同的引脚上常见的是 PC13。这里以 PC13 为例。#include zephyr/kernel.h #include zephyr/drivers/gpio.h /* 定义 LED 设备树节点标识符。 * 对于 STM32F103C8T6用户 LED 通常通过 led0 别名定义在设备树中。 * 如果板级定义不同可能需要调整。最通用的方式是直接使用 GPIO 端口和引脚号。 */ #define LED0_NODE DT_ALIAS(led0) /* 如果设备树中没有 led0 别名我们可以直接指定 GPIO 端口和引脚 */ #if !DT_NODE_HAS_STATUS(LED0_NODE, okay) #error Unsupported board: led0 devicetree alias is not defined #endif static const struct gpio_dt_spec led GPIO_DT_SPEC_GET(LED0_NODE, gpios); void main(void) { int ret; printk(Hello from Zephyr on STM32F103C8T6!\n); /* 检查 LED 设备是否就绪 */ if (!device_is_ready(led.port)) { printk(Error: LED device is not ready\n); return; } /* 配置 LED 引脚为输出模式初始状态关闭假设低电平点亮 */ ret gpio_pin_configure_dt(led, GPIO_OUTPUT_ACTIVE); if (ret 0) { printk(Error %d: failed to configure LED pin\n, ret); return; } while (1) { /* 切换 LED 状态 */ ret gpio_pin_toggle_dt(led); if (ret 0) { printk(Error %d: failed to toggle LED\n, ret); return; } /* 延时 1000 毫秒 */ k_msleep(1000); } }步骤 6配置 VSCode 的 CMake Tools 插件按下CtrlShiftP输入 “CMake: Configure”选择它。首次配置时它会让你选择一个“Kit”。选择“Zephyr SDK arm-zephyr-eabi”或类似的选项。这对应我们之前安装的交叉编译工具链。接着会让你选择目标。输入stm32f103c8t6或从列表中选择stm32f103c8t6如果可用。CMake 会根据此目标加载对应的板级配置文件。配置成功后在 VSCode 底部状态栏可以看到目标平台和构建类型如[stm32f103c8t6] [Debug]。6. 编译项目配置好 CMake 后编译就非常简单了。方法一使用 VSCode CMake Tools点击 VSCode 底部状态栏的“构建”按钮一个齿轮或播放图标或者按F7键。构建输出会显示在 VSCode 的“终端”面板中。等待构建完成最终应显示[100%] Built target zephyr_final并生成zephyr/zephyr.bin和zephyr/zephyr.elf等文件。方法二使用命令行West你也可以在 VSCode 的集成终端Ctrl中切换到项目根目录使用 west 命令构建west build -b stm32f103c8t6-b参数指定开发板型号。构建输出位于build/目录下。编译成功的关键标志终端无致命错误Error。在build/zephyr/目录下生成了zephyr.bin二进制烧录文件和zephyr.elf带调试信息的可执行文件。输出信息中包含了代码段.text、数据段.data等的大小确保它们没有超过 STM32F103C8T6 的 Flash (64KB) 和 RAM (20KB) 限制。7. 烧录与运行演示我们将使用 OpenOCD已包含在 Zephyr SDK 中通过 ST-Link 进行烧录。步骤 1硬件连接使用杜邦线将 ST-Link 调试器与 STM32F103C8T6 最小系统板连接ST-LinkSWDIO- 板子SWDIO(PA13)ST-LinkSWCLK- 板子SWCLK(PA14)ST-LinkGND- 板子GNDST-Link3.3V- 板子3.3V(可选如果板子不自带供电)连接好后将 ST-Link 通过 USB 线插入电脑。步骤 2烧录固件在项目根目录下使用 west 命令进行烧录west flash这个命令会自动调用合适的 Runner对于 STM32 和 ST-Link通常是openocd或pyocd。你会在终端看到类似以下输出-- west flash: using runner openocd -- runners.openocd: Flashing file: build/zephyr/zephyr.bin ... ** OpenOCD init completed ** ** Programming Started ** ... ** Programming Finished ** ** Verify Started ** ... ** Verified OK ** ** Resetting Target **看到** Verified OK **和** Resetting Target **即表示烧录成功程序已开始运行。步骤 3观察运行效果烧录完成后STM32F103C8T6 板载的 LED通常是连接在 PC13 的蓝色或绿色 LED应该开始以 1 秒的间隔闪烁。同时如果你连接了串口转换器到 USART1 (PA9/PA10)并在 PC 端使用串口助手如 Putty、Tera Term打开对应端口波特率通常为 115200应该能看到Hello from Zephyr on STM32F103C8T6!的输出信息。至此你已经完成了在 VSCode 环境下从零开始创建、编译、烧录并运行一个 Zephyr 应用程序到 STM32F103C8T6 的全过程。8. 功能进阶测试与验证基础 LED 闪烁跑通后可以尝试更多功能来验证环境的完整性和 Zephyr 的强大之处。8.1 串口打印测试修改prj.conf启用串口驱动和打印功能CONFIG_SERIALy CONFIG_CONSOLEy CONFIG_UART_CONSOLEy # 根据你的板子可能需要指定具体串口如 CONFIG_UART_1y在main.c中使用printk打印更多信息。重新编译烧录后通过串口观察输出。8.2 多线程任务测试Zephyr 的核心是实时内核。可以创建多个线程来测试任务调度void thread1_entry(void *p1, void *p2, void *p3) { while (1) { printk(Thread 1 running\n); k_msleep(500); } } void thread2_entry(void *p1, void *p2, void *p3) { while (1) { printk(Thread 2 running\n); k_msleep(1000); } } // 在 main 函数中使用 k_thread_create 创建线程观察串口输出看两个线程是否交替执行。8.3 使用其他外设如按键中断在prj.conf中确保 GPIO 和中断控制器启用CONFIG_GPIOy CONFIG_GPIO_INTERRUPTy在main.c中配置一个 GPIO 引脚为输入并设置中断回调函数当按键按下时打印信息或切换 LED。这些测试能全面验证你的开发环境是否已正确配置能够支持 Zephyr 的各项核心功能。9. 常见问题与排查方法在配置和运行过程中你可能会遇到以下典型问题。这里提供排查思路。问题现象可能原因排查方式解决方案west命令未找到Python 或west未正确安装或 PATH 未设置。在命令行输入west --version。1. 确认 Python 已安装且 PATH 包含 Scripts 目录。2. 重新运行pip install west。CMake 配置失败找不到工具链Zephyr SDK 未安装或环境变量ZEPHYR_TOOLCHAIN_VARIANT未设置。检查arm-zephyr-eabi-gcc --version。1. 确认 Zephyr SDK 已安装。2. 检查并正确设置ZEPHYR_SDK_INSTALL_DIR和PATH环境变量。编译错误No board found指定的开发板名称错误或该板卡支持未包含在 Zephyr 源码中。运行west boards查看支持的板卡列表。1. 使用west boards确认正确的板卡名称如stm32f103c8t6。2. 确保 Zephyr 源码已通过west update更新到最新。west flash失败无法连接目标1. 硬件连接错误线序、供电。2. ST-Link 驱动未安装。3. 其他程序占用了调试接口。1. 检查杜邦线连接。2. 在设备管理器中查看 ST-Link 是否被识别。3. 尝试使用west flash --runner openocd指定 runner。1. 重新拔插 USB 线检查连接。2. 安装 ST-Link USB 驱动。3. 关闭可能占用 ST-Link 的软件如 Keil, STM32CubeIDE。4. 尝试以管理员身份运行命令行。程序烧录成功但 LED 不闪烁1. LED 引脚定义错误。2. 程序逻辑错误如延时过长。3. 时钟配置问题。1. 查阅开发板原理图确认 LED 连接的正确 GPIO 引脚。2. 使用调试器单步调试或添加更多printk输出。3. 检查prj.conf中时钟配置。1. 修改main.c中的 GPIO 引脚定义或使用设备树别名led0。2. 减小k_msleep的参数值测试。3. 确保CONFIG_CLOCK_CONTROLy。串口无输出1. 串口引脚连接错误。2. 波特率不匹配。3. 串口驱动未正确启用。1. 确认 TX/RX 线是否接反。2. 尝试常见的波特率115200, 9600。3. 检查prj.conf中的串口配置。1. 交换 TX 和 RX 线序尝试。2. 在prj.conf中明确配置CONFIG_UART_1y和CONFIG_UART_CONSOLE_ON_DEV_NAMEUART_1如果使用 USART1。10. 最佳实践与使用建议为了更高效、稳定地使用 VSCode Zephyr 进行开发建议遵循以下实践项目结构标准化始终在 Zephyr 工作空间zephyrproject之外创建你的应用目录。使用清晰的文件夹结构如src/,include/,boards/如有自定义板级文件并将CMakeLists.txt和prj.conf放在根目录。版本控制使用 Git 管理你的应用代码。将zephyrproject目录添加到.gitignore中因为 Zephyr 源码本身应该作为子模块或由 west 管理。只提交你自己的应用代码、配置和文档。善用 VSCode 智能感知正确配置C/C插件的c_cpp_properties.json将ZEPHYR_BASE等路径包含到includePath中这样可以实现完美的代码跳转和自动补全。调试配置虽然本文未详细展开但强烈建议配置 VSCode 的调试功能。你需要创建一个launch.json文件配置调试器路径如arm-zephyr-eabi-gdb和 OpenOCD 作为调试服务器。这能极大提升问题排查效率。资源监控每次编译后关注终端输出的内存占用报告。确保你的应用不会超出 STM32F103C8T6 的 Flash 和 RAM 限制。可以使用west build -t rom_report和west build -t ram_report生成详细的内存使用报告。逐步增加复杂度从一个最简单的 Blinky 开始确保基础环境无误。然后逐步添加功能模块如传感器驱动、文件系统、网络每步都进行测试便于隔离问题。查阅官方文档Zephyr 官方文档非常详尽。遇到问题时首先查阅 Zephyr Project Documentation 特别是关于板卡支持、设备树和 Kconfig 配置的部分。通过本教程你不仅成功在 STM32F103C8T6 上运行了 Zephyr更重要的是掌握了一套现代化的、基于 VSCode 和开源工具链的嵌入式开发流程。这套流程的可扩展性极强你可以将其轻松迁移到其他 Zephyr 支持的数百款开发板上。接下来可以尝试探索 Zephyr 的更多高级特性如电源管理、线程间通信、文件系统或网络连接将这块经典的单片机玩出新的高度。建议将本文涉及的环境配置步骤和命令保存下来作为日后搭建新项目环境的快速参考。