<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Zephyr on Hacper&#39;s Blog</title>
    <link>https://hacperme.com/tags/zephyr/</link>
    <description>Recent content in Zephyr on Hacper&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh</language>
    <lastBuildDate>Tue, 01 Sep 2026 00:00:00 +0800</lastBuildDate>
    <atom:link href="https://hacperme.com/tags/zephyr/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>WSL2 下搭建 ESP32-C3 Zephyr 开发环境</title>
      <link>https://hacperme.com/posts/notes/2026/wsl2-esp32c3-zephyr/</link>
      <pubDate>Tue, 01 Sep 2026 00:00:00 +0800</pubDate>
      <guid>https://hacperme.com/posts/notes/2026/wsl2-esp32c3-zephyr/</guid>
      <description>在 WSL2 中从零搭建 ESP32-C3（XIAO ESP32C3）Zephyr 开发环境：环境依赖、USB 设备直通、编译、烧录与串口监视的完整流程。</description>
      <content:encoded><![CDATA[<h1 id="wsl2-下搭建-esp32-c3-zephyr-开发环境">WSL2 下搭建 ESP32-C3 Zephyr 开发环境</h1>
<h2 id="背景">背景</h2>
<p>Zephyr 是一个面向资源受限设备的小型实时操作系统（RTOS），支持 500+ 开发板，包括乐鑫的 ESP32 系列。ESP32-C3 是乐鑫的 RISC-V 单核 Wi-Fi/BLE SoC（160MHz，4MB Flash），开发板用的是 Seeed XIAO ESP32C3。</p>
<p>Zephyr 官方对 Ubuntu 支持最好，下面以 Ubuntu（WSL2）为例。</p>
<h2 id="前置条件">前置条件</h2>
<ul>
<li>Windows 10/11，已安装 WSL2（<code>wsl --install</code>），发行版建议 Ubuntu 22.04/24.04</li>
<li>一个 ESP32-C3 开发板（本文用 Seeed XIAO ESP32C3）</li>
<li>管理员权限的 PowerShell（后面 usbipd 需要）</li>
</ul>
<h2 id="1-安装环境依赖工具">1. 安装环境依赖工具</h2>
<p>参考官方指导：<a href="https://docs.zephyrproject.org/latest/develop/getting_started/index.html">Zephyr Getting Started</a></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt update
</span></span><span class="line"><span class="cl">sudo apt upgrade
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">sudo apt install --no-install-recommends git cmake ninja-build gperf <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 验证版本</span>
</span></span><span class="line"><span class="cl">cmake --version
</span></span><span class="line"><span class="cl">python3 --version
</span></span><span class="line"><span class="cl">dtc --version
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="2-安装-west-与-zephyr-源码">2. 安装 west 与 Zephyr 源码</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python3 -m venv ~/zephyrproject/.venv
</span></span><span class="line"><span class="cl"><span class="nb">source</span> ~/zephyrproject/.venv/bin/activate
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">pip install west
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">west init -m https://github.com/zephyrproject-rtos/zephyr ~/zephyrproject
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> ~/zephyrproject
</span></span><span class="line"><span class="cl">west update
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">west packages pip --install
</span></span><span class="line"><span class="cl">west zephyr-export
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><code>west update</code> 会拉取 Zephyr 主仓库和所有模块（hal、mcuboot 等），网络不好时容易卡，可以挂代理或换国内镜像加速。</p>
</blockquote>
<h2 id="3-安装-zephyr-sdk">3. 安装 Zephyr SDK</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> ~/zephyrproject/zephyr
</span></span><span class="line"><span class="cl">west sdk install
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="4-共享-usb-设备到-wsl2">4. 共享 USB 设备到 WSL2</h2>
<p>WSL2 是虚拟机，默认访问不到宿主机 USB 设备，需要借助微软官方的 <a href="https://github.com/dorssel/usbipd-win">usbipd-win</a> 做 USB/IP 直通。</p>
<h3 id="41-安装-usbipd-win">4.1 安装 usbipd-win</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">winget</span> <span class="n">install</span> <span class="n">usbipd</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="42-命令行绑定并连接">4.2 命令行绑定并连接</h3>
<p>在<strong>管理员 PowerShell</strong> 中执行：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="c"># 列出 USB 设备，找到 ESP32-C3 对应的 BUSID</span>
</span></span><span class="line"><span class="cl"><span class="n">usbipd</span> <span class="n">list</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># 绑定（只需做一次，绑定后设备对 WSL 可见）</span>
</span></span><span class="line"><span class="cl"><span class="n">usbipd</span> <span class="n">bind</span> <span class="p">-</span><span class="n">-busid</span><span class="p">=&lt;</span><span class="n">BUSID</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># 连接到当前 WSL 发行版</span>
</span></span><span class="line"><span class="cl"><span class="n">usbipd</span> <span class="n">attach</span> <span class="p">-</span><span class="n">-wsl</span> <span class="p">-</span><span class="n">-busid</span><span class="p">=&lt;</span><span class="n">BUSID</span><span class="p">&gt;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>之后在 WSL 里用 <code>lsusb</code> 验证，能看到 <code>303a:1001</code>（Espressif USB JTAG/serial debug unit）就说明直通成功：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ lsusb
</span></span><span class="line"><span class="cl">Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
</span></span><span class="line"><span class="cl">Bus 001 Device 004: ID 303a:1001 Espressif USB JTAG/serial debug unit
</span></span><span class="line"><span class="cl">Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="43-图形界面方案wsl-dashboard可选">4.3 图形界面方案：wsl-dashboard（可选）</h3>
<p>不想敲命令行的话，可以装 <a href="https://github.com/owu/wsl-dashboard">wsl-dashboard</a>，在它的 UI 里直接绑定和连接 USB 设备，适合偶尔用一下的场景。</p>
<h3 id="44-串口权限dialout-组">4.4 串口权限（dialout 组）</h3>
<p>设备直通后，<code>/dev/ttyACM0</code> 默认属于 <code>dialout</code> 组，普通用户没有读写权限：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ ls -l /dev/ttyACM*
</span></span><span class="line"><span class="cl">crw-rw---- 1 root dialout 166, 0 Sep  1 16:15 /dev/ttyACM0
</span></span></code></pre></td></tr></table>
</div>
</div><p>把自己加进 <code>dialout</code> 组，然后<strong>重启 WSL</strong>（<code>wsl --shutdown</code> 后重开）生效：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo usermod -aG dialout <span class="nv">$USER</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="5-编译-hello_world">5. 编译 hello_world</h2>
<p>用 sysbuild 方式编译（会自动带上 mcuboot 二级引导）：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> ~/zephyrproject/zephyr
</span></span><span class="line"><span class="cl">west build -p always -b xiao_esp32c3 --sysbuild samples/hello_world
</span></span></code></pre></td></tr></table>
</div>
</div><p>关键输出：CMake 会先构建 mcuboot，再构建 hello_world，最后生成 ESP32-C3 镜像：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">-- Board: xiao_esp32c3, qualifiers: esp32c3
</span></span><span class="line"><span class="cl">-- Zephyr version: 4.4.99
</span></span><span class="line"><span class="cl">-- Found toolchain: zephyr 1.0.1 (/home/xx/zephyr-sdk-1.0.1)
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">[239/239] Linking C executable zephyr/zephyr.elf
</span></span><span class="line"><span class="cl">Memory region         Used Size  Region Size  %age Used
</span></span><span class="line"><span class="cl">     mcuboot_hdr:          32 B         32 B    100.00%
</span></span><span class="line"><span class="cl">        metadata:          80 B         96 B     83.33%
</span></span><span class="line"><span class="cl">           FLASH:      134116 B    4194176 B      3.20%
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">esptool v5.3.1
</span></span><span class="line"><span class="cl">Successfully created ESP32-C3 image.
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="6-烧录">6. 烧录</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">west flash
</span></span></code></pre></td></tr></table>
</div>
</div><p>west 会自动选择 <code>/dev/ttyACM0</code>，走 USB-Serial/JTAG 直连烧录（921600bps）：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">-- west flash: using runner esp32
</span></span><span class="line"><span class="cl">Detecting chip type... ESP32-C3
</span></span><span class="line"><span class="cl">Auto-selected /dev/ttyACM0 for esp32c3
</span></span><span class="line"><span class="cl">Chip type:          ESP32-C3 (QFN32) (revision v0.3)
</span></span><span class="line"><span class="cl">Features:           Wi-Fi, BT 5 (LE), Single Core, 160MHz, Embedded Flash 4MB (XMC)
</span></span><span class="line"><span class="cl">Crystal frequency:  40MHz
</span></span><span class="line"><span class="cl">USB mode:           USB-Serial/JTAG
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">Wrote 32576 bytes at 0x00000000 in 0.4 seconds   # mcuboot
</span></span><span class="line"><span class="cl">Wrote 134284 bytes at 0x00020000 in 0.7 seconds   # hello_world
</span></span><span class="line"><span class="cl">Hash of data verified.
</span></span><span class="line"><span class="cl">Hard resetting via RTS pin...
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="7-串口监视">7. 串口监视</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">west espressif monitor
</span></span></code></pre></td></tr></table>
</div>
</div><p>启动后能看到完整启动日志和 Hello World 输出：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">--- idf_monitor on /dev/ttyACM0 115200 ---
</span></span><span class="line"><span class="cl">--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
</span></span><span class="line"><span class="cl">ESP-ROM:esp32c3-api1-20210207
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">I (soc_init): MCUboot 2nd stage bootloader
</span></span><span class="line"><span class="cl">I (boot): Loading image 0 - slot 0 from flash, area id: 2
</span></span><span class="line"><span class="cl">*** Booting Zephyr OS build v4.4.0-13771-gb9df9f46ae46 ***
</span></span><span class="line"><span class="cl">Hello World! xiao_esp32c3/esp32c3
</span></span></code></pre></td></tr></table>
</div>
</div><p>看到 <code>Hello World! xiao_esp32c3/esp32c3</code> 就说明环境全部打通了。</p>
<h2 id="常见问题">常见问题</h2>
<ol>
<li>
<p><strong>WSL 里 lsusb 看不到 ESP32-C3</strong>
确认在管理员 PowerShell 里执行过 <code>usbipd bind --busid=&lt;BUSID&gt;</code>，且 <code>usbipd attach --wsl --busid=&lt;BUSID&gt;</code> 成功。<strong>Windows 重启或 WSL 重启后，attach 会失效，需要重新 attach</strong>（bind 一次即可）。</p>
</li>
<li>
<p><strong>/dev/ttyACM0 权限不足</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">could not open port /dev/ttyACM0: Permission denied
</span></span></code></pre></td></tr></table>
</div>
</div><p>加入 dialout 组并重启 WSL：<code>sudo usermod -aG dialout $USER</code>。</p>
</li>
</ol>
<h2 id="参考">参考</h2>
<ul>
<li><a href="https://docs.zephyrproject.org/latest/develop/getting_started/index.html">Zephyr Getting Started Guide</a></li>
<li><a href="https://github.com/dorssel/usbipd-win">usbipd-win：WSL2 USB 设备共享</a></li>
<li><a href="https://github.com/owu/wsl-dashboard">wsl-dashboard：USB 管理 GUI（可选）</a></li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>
