从零到一:手把手教你用Zephyr RTOS在STM32上跑第一个Hello World(附源码)
在嵌入式开发领域,实时操作系统(RTOS)正变得越来越重要。Zephyr作为一款专为物联网设备设计的开源RTOS,凭借其轻量级、模块化和跨平台特性,正在获得越来越多开发者的青睐。本文将带你从零开始,在STM32开发板上完成第一个Zephyr应用的开发,让你快速掌握这个强大工具的基本使用方法。
1. 环境准备:搭建Zephyr开发工具链
在开始之前,我们需要准备好开发环境。Zephyr使用一套名为West的工具链来管理项目构建流程,这与传统的嵌入式开发工具链有所不同。
首先,确保你的开发机满足以下基本要求:
- 操作系统:Ubuntu 20.04/22.04 LTS(推荐)或Windows 10/11
- Python 3.8或更高版本
- Git版本控制工具
安装步骤:
bash复制# 安装依赖工具
sudo apt update && sudo apt install -y git cmake ninja-build gperf \
ccache dfu-util device-tree-compiler wget \
python3-dev python3-pip python3-setuptools python3-tk python3-wheel xz-utils file \
make gcc gcc-multilib g++-multilib libsdl2-dev
# 安装West工具
pip3 install --user west
echo 'export PATH=~/.local/bin:"$PATH"' >> ~/.bashrc
source ~/.bashrc
提示:Windows用户可以使用WSL2来获得与Linux相似的环境体验,或者直接使用Windows版的Python和工具链。
验证West安装是否成功:
bash复制west --version
接下来,我们需要获取Zephyr源代码并设置开发环境:
bash复制# 初始化工作区
west init ~/zephyrproject
cd ~/zephyrproject
# 获取Zephyr源代码和所有依赖项
west update
# 导出Zephyr CMake包
west zephyr-export
# 安装Python依赖
pip3 install --user -r ~/zephyrproject/zephyr/scripts/requirements.txt
最后,安装工具链。Zephyr支持多种工具链,这里我们使用Zephyr SDK:
bash复制# 下载Zephyr SDK
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.1/zephyr-sdk-0.16.1_linux-x86_64.tar.xz
# 解压并安装
tar xvf zephyr-sdk-0.16.1_linux-x86_64.tar.xz
cd zephyr-sdk-0.16.1
./setup.sh
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 创建第一个Zephyr项目
现在,我们可以开始创建第一个Zephyr项目了。我们将基于STM32 Nucleo-F401RE开发板进行演示,这是STMicroelectronics推出的一款性价比极高的开发板。
项目创建步骤:
- 首先,创建一个新的应用程序目录:
bash复制mkdir -p ~/zephyr_workspace/hello_world
cd ~/zephyr_workspace/hello_world
- 创建基本的项目结构:
bash复制mkdir src
touch src/main.c CMakeLists.txt prj.conf
- 编辑
CMakeLists.txt文件,添加以下内容:
cmake复制cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(hello_world)
target_sources(app PRIVATE src/main.c)
- 编辑
prj.conf配置文件:
config复制CONFIG_PRINTK=y
CONFIG_STDOUT_CONSOLE=y
CONFIG_SERIAL=y
CONFIG_UART_CONSOLE=y
- 创建
src/main.c源文件:
c复制#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>
void main(void)
{
printk("Hello World from Zephyr on STM32!\n");
while (1) {
k_msleep(1000);
printk("System running for %d seconds\n", k_uptime_get()/1000);
}
}
3. 配置与构建项目
Zephyr使用CMake作为构建系统,West作为前端工具。构建过程会自动处理所有依赖关系,包括板级支持包(BSP)和设备树配置。
构建命令:
bash复制# 在项目目录下执行
west build -b nucleo_f401re .
这个命令会:
- 根据
-b参数指定的开发板名称自动选择正确的BSP - 解析设备树配置,生成必要的头文件
- 编译所有源代码
- 链接生成最终的固件映像
构建完成后,你可以在build/zephyr目录下找到生成的固件文件,主要是:
zephyr.elf:ELF格式的可执行文件zephyr.bin:二进制格式的固件zephyr.hex:Intel HEX格式的固件
4. 烧录与调试
将STM32 Nucleo开发板通过USB连接到电脑,它会被识别为一个虚拟串口设备和调试探头。我们可以使用West直接烧录和调试。
烧录命令:
bash复制west flash
这个命令会自动:
- 检测连接的开发板
- 选择合适的烧录工具(对于Nucleo开发板,通常是OpenOCD)
- 将固件烧录到开发板的Flash中
- 重置开发板使其运行新固件
查看输出:
烧录完成后,我们可以通过串口终端查看程序输出。Nucleo开发板会创建一个虚拟串口设备(在Linux上通常是/dev/ttyACM0,Windows上是COM端口)。
使用你喜欢的串口终端工具(如minicom、picocom或Putty)连接这个串口,配置为:
- 波特率:115200
- 数据位:8
- 停止位:1
- 无校验位
- 无流控
你应该能看到类似这样的输出:
code复制Hello World from Zephyr on STM32!
System running for 1 seconds
System running for 2 seconds
...
5. 深入理解Zephyr项目结构
现在我们已经成功运行了第一个Zephyr程序,让我们更深入地看看项目中的各个部分是如何工作的。
5.1 设备树(DTS)配置
Zephyr使用设备树来描述硬件配置。对于Nucleo-F401RE开发板,其设备树定义位于zephyr/boards/arm/nucleo_f401re目录中。
我们可以查看开发板的设备树配置:
bash复制cat ~/zephyrproject/zephyr/boards/ar
