STM32F103C8T6上Zephyr RTOS环境搭建与项目实战指南
这次我们来看一个针对 STM32F103C8T6 最小系统板的 Zephyr RTOS 项目创建全流程。Zephyr 作为 Linux 基金会主导的开源实时操作系统近年来在嵌入式领域关注度持续上升特别是其对 STM32 系列的广泛支持让开发者能在资源受限的 MCU 上构建现代化嵌入式应用。如果你正在寻找 FreeRTOS 之外的替代方案或者希望体验更完整的物联网开发生态Zephyr 值得一试。本文将基于 STM32F103C8T6 这块经典的最小系统板完整演示从环境配置、项目创建到烧录验证的全过程。重点解决两个问题Zephyr 环境搭建到底复不复杂在 Cortex-M3 核心的 STM32F103 上运行效果如何1. 核心能力速览能力项说明RTOS 类型开源实时操作系统Linux 基金会项目STM32 支持官方支持超过 190 种 STM32 开发板包括 STM32F103C8T6开发环境基于 West 工具链的跨平台开发Windows/Linux/macOS硬件要求STM32F103C8T664KB Flash, 20KB RAM ST-Link 调试器启动方式命令行编译 OpenOCD/ST-Link 烧录主要功能多线程调度、内存管理、设备驱动、网络协议栈适合场景物联网终端设备、工业控制、需要现代 RTOS 特性的嵌入式项目从规格可以看出Zephyr 不是简单的任务调度器而是一个完整的操作系统生态这对资源有限的 STM32F103 是个不小的挑战但也是其价值所在。2. 适用场景与使用边界Zephyr 适合需要以下特性的 STM32 项目多任务管理需要同时处理传感器数据、用户交互和通信协议硬件抽象希望代码在不同 STM32 系列间移植时更简单物联网协议后续可能需要 Bluetooth LE、LoRaWAN、MQTT 等协议栈长期维护项目生命周期较长需要稳定的开源 RTOS 支持不适合以下场景极致性能追求对每字节内存、每时钟周期都有严苛要求的场景简单单任务只需要实现一个简单循环的裸机程序学习基础 RTOS第一次接触实时操作系统建议从 FreeRTOS 开始特别提醒Zephyr 相对复杂适合有一定嵌入式基础的开发者。如果是完全的新手建议先掌握 STM32 裸机开发和 FreeRTOS 基础。3. 环境准备与前置条件3.1 硬件准备主控板STM32F103C8T6 最小系统板蓝色药丸板调试器ST-Link V2 编程调试器连接线杜邦线若干SWDIO、SWCLK、GND、3.3VUSB 线用于供电和调试通信3.2 软件环境操作系统Windows 10/11、Ubuntu 20.04 或 macOS本文以 Windows 为例Python3.8 或更高版本Zephyr 工具链依赖Git用于获取 Zephyr 源码和示例终端工具Windows 推荐使用 PowerShell 或 Git Bash3.3 磁盘空间Zephyr 环境相对较大建议预留 5-10GB 可用空间包括工具链约 2GBZephyr 源码及模块约 3GB编译输出约 1-2GB4. 安装部署与启动方式4.1 安装 Zephyr 工具链Zephyr 提供了专门的安装脚本但国内环境可能需要一些调整。# 使用国内镜像加速安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple west # 初始化 Zephyr 工作空间 west init zephyrproject cd zephyrproject west update # 导出 Zephyr 环境变量 export ZEPHYR_BASE$PWD/zephyr export PATH$PATH:$PWD/zephyr/scripts对于 Windows 用户可以使用 Chocolatey 或直接下载工具链# 使用 Chocolatey 安装依赖 choco install cmake --installargs ADD_CMAKE_TO_PATHSystem choco install git python ninja gperf cc65 dtc-msys24.2 安装工具链和 SDKZephyr SDK 包含了编译所需的所有工具# 下载 Zephyr SDK约 1.5GB wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.1/zephyr-sdk-0.16.1_windows-x86_64.7z # 解压并安装 7z x zephyr-sdk-0.16.1_windows-x86_64.7z cd zephyr-sdk-0.16.1 setup.cmd4.3 验证安装安装完成后验证环境是否正确# 检查 west 工具 west --version # 检查工具链 arm-zephyr-eabi-gcc --version # 检查环境变量 echo $ZEPHYR_BASE如果所有命令都能正常执行说明基础环境准备就绪。5. 创建第一个 Zephyr 项目5.1 基于示例项目创建Zephyr 提供了丰富的示例我们从最简单的 LED 闪烁开始# 进入工作目录 cd zephyrproject # 创建项目目录 mkdir my_stm32_project cd my_stm32_project # 复制基础示例 cp -r ../zephyr/samples/basic/blinky . cd blinky5.2 配置项目板型Zephyr 使用 CMake 构建系统需要为 STM32F103C8T6 配置正确的板型# 查看支持的板型列表 west boards | grep stm32f103 # 应该能看到类似stm32f103c8t6_mini创建构建目录并配置# 创建构建目录 mkdir build cd build # 配置板型根据实际显示的板型名称 cmake -DBOARDstm32f103c8t6_mini .. # 或者如果上面的板型不存在尝试通用板型 cmake -DBOARDstm32f103c8t6 ..5.3 编写应用代码可选如果使用 blinky 示例代码已经准备好。也可以创建自定义项目// src/main.c #include zephyr/kernel.h #include zephyr/drivers/gpio.h #define LED0_NODE DT_ALIAS(led0) static const struct gpio_dt_spec led GPIO_DT_SPEC_GET(LED0_NODE, gpios); void main(void) { gpio_pin_configure_dt(led, GPIO_OUTPUT_ACTIVE); while (1) { gpio_pin_toggle_dt(led); k_msleep(1000); } }对应的设备树配置// boards/stm32f103c8t6_mini.overlay / { aliases { led0 led0; }; leds { compatible gpio-leds; led0: led_0 { gpios gpioa 5 GPIO_ACTIVE_HIGH; label User LED; }; }; };6. 编译与烧录验证6.1 编译项目在构建目录中执行编译# 编译项目 west build # 或者使用 ninja 直接编译 ninja编译成功后会在build/zephyr目录生成zephyr.bin、zephyr.hex等文件。6.2 连接硬件将 ST-Link 与 STM32F103C8T6 正确连接SWDIO→ PA13SWCLK→ PA14GND→ GND3.3V→ 3.3V6.3 烧录程序使用 west 工具烧录# 自动检测并烧录 west flash # 如果自动检测失败指定编程器 west flash --runner stlink烧录过程中观察 ST-Link 指示灯和终端输出确认烧录成功。6.4 运行验证烧录完成后程序会自动运行。观察 STM32F103C8T6 板载的 PC13 LED如果有的板型是 PA5应该能看到 LED 以 1 秒间隔闪烁。7. 资源占用与性能观察7.1 查看编译大小编译完成后查看固件大小信息# 查看内存占用 arm-zephyr-eabi-size build/zephyr/zephyr.elf # 输出示例 # text data bss dec hex filename # 12345 678 912 13935 366f zephyr.elf对于 STM32F103C8T664KB Flash, 20KB RAM典型的 Zephyr 最小应用Flash 占用15-25KB文本段 数据段RAM 占用4-8KB数据段 BSS 段7.2 运行时内存监控可以通过串口输出内存使用情况#include zephyr/kernel.h #include zephyr/sys/printk.h void print_memory_info(void) { struct k_mem_slab_stats stats; k_mem_slab_runtime_stats_get(my_slab, stats); printk(Free memory: %zu bytes\n, k_mem_free_get()); printk(Slab blocks: %u used, %u max\n, stats.num_used_blocks, stats.num_max_used_blocks); }7.3 性能基准测试Zephyr 提供了性能测试套件可以评估上下文切换时间等关键指标# 运行基准测试 west build -t run -b stm32f103c8t6_mini ../zephyr/tests/benchmarks/sys_kernel8. 常见问题与排查方法8.1 环境配置问题问题现象可能原因排查方式解决方案west命令未找到Python 环境问题检查 Python 和 pip 安装重新安装 westpip install west编译找不到工具链环境变量未设置检查ZEPHYR_BASE执行source zephyr/zephyr-env.sh板型不支持板型名称错误west boards查看列表使用正确的板型名称8.2 编译问题问题现象可能原因排查方式解决方案内存不足错误STM32F103 资源限制查看编译大小优化代码禁用不必要功能设备树编译错误设备树语法错误检查.dts文件验证设备树语法和节点定义链接错误缺少驱动或配置查看完整错误信息在prj.conf中启用所需驱动8.3 烧录问题问题现象可能原因排查方式解决方案无法连接 ST-Link驱动问题或连接错误检查设备管理器安装 ST-Link 驱动检查接线烧录超时复位电路问题检查 NRST 连接手动复位板子后重试烧录校验失败Flash 保护或损坏读取芯片信息使用 ST-Link Utility 解除保护8.4 运行问题问题现象可能原因排查方式解决方案LED 不闪烁GPIO 配置错误检查原理图和设备树确认 LED 引脚号和极性程序卡死堆栈溢出增加堆栈大小在prj.conf中调整堆栈配置随机复位看门狗未喂食检查看门狗配置禁用看门狗或定期喂食9. 高级功能扩展9.1 添加串口调试STM32F103C8T6 的 USART1 通常用于调试输出#include zephyr/drivers/uart.h const struct device *uart_dev DEVICE_DT_GET(DT_NODELABEL(usart1)); void uart_init(void) { if (!device_is_ready(uart_dev)) { printk(UART device not ready\n); return; } // 配置串口参数 uart_configure(uart_dev, (struct uart_config){ .baudrate 115200, .parity UART_CFG_PARITY_NONE, .stop_bits UART_CFG_STOP_BITS_1, .data_bits UART_CFG_DATA_BITS_8, .flow_ctrl UART_CFG_FLOW_CTRL_NONE }); }9.2 多线程创建Zephyr 的核心优势之一是多线程管理#define STACK_SIZE 512 #define THREAD_PRIORITY 5 K_THREAD_STACK_DEFINE(thread_stack, STACK_SIZE); struct k_thread thread_data; void thread_function(void *arg1, void *arg2, void *arg3) { while (1) { printk(Thread running\n); k_msleep(500); } } void create_thread(void) { k_thread_create(thread_data, thread_stack, K_THREAD_STACK_SIZEOF(thread_stack), thread_function, NULL, NULL, NULL, THREAD_PRIORITY, 0, K_NO_WAIT); }9.3 外设驱动使用Zephyr 提供了统一的外设驱动接口// 使用 I2C 读取传感器 const struct device *i2c_dev DEVICE_DT_GET(DT_NODELABEL(i2c1)); uint8_t buffer[2]; int ret i2c_burst_read(i2c_dev, sensor_addr, reg_addr, buffer, 2); if (ret 0) { printk(Sensor data: %02X %02X\n, buffer[0], buffer[1]); }10. 项目优化建议10.1 内存优化策略针对 STM32F103 的有限资源// 在 prj.conf 中优化配置 CONFIG_HEAP_MEM_POOL_SIZE1024 CONFIG_MAIN_STACK_SIZE2048 CONFIG_IDLE_STACK_SIZE512 // 禁用不必要功能 # CONFIG_BOOTLOADER_MCUBOOT is not set # CONFIG_NETWORKING is not set10.2 电源管理添加低功耗支持#include zephyr/pm/pm.h #include zephyr/pm/policy.h // 进入低功耗模式 void enter_low_power(void) { k_cpu_idle(); // 空闲时进入睡眠 }10.3 调试技巧利用 Zephyr 的日志系统#include zephyr/logging/log.h LOG_MODULE_REGISTER(main, LOG_LEVEL_DBG); // 不同级别的日志输出 LOG_INF(System started); LOG_DBG(Debug information: %d, value); LOG_ERR(Error occurred);Zephyr 在 STM32F103C8T6 上的运行表现令人满意虽然资源相对紧张但完整保留了 RTOS 的核心功能。对于从裸机或 FreeRTOS 迁移的项目Zephyr 提供了更现代化的开发体验和更丰富的软件生态。建议在实际项目中先从小功能开始验证逐步迁移关键模块。STM32F103 的性能边界需要特别关注合理配置内核选项和优化内存使用是项目成功的关键。这个环境搭建流程也适用于其他 STM32 系列芯片只需调整板型配置即可快速适配。