← 返回实战项目

编译并刷入小智固件——从空板子到能开机的第一步

最后更新 2026-07-01
⏱ 约 14 分钟 🟢 软件/低风险
⎇ 基于开源项目(学习解读,非搬运)
作者:78 等开源贡献者
协议:MIT

本文讲解原理与流程、引用关键片段并注明出处,版权归原作者,遵循其开源协议;一切以上游仓库最新版本为准。

上一节挑硬件你已经把板子定下来了——多半是块 ESP32-S3。这一节干一件让人上瘾的事:把小智固件真正编译出来、刷进这块板子,让它第一次开机、连网、在你眼前活过来。 从"我买了块板子"到"我手上有台能开机的小智",就隔着这一关。

这一关卡人的地方几乎全在环境,不在代码——小智的构建流程本身很标准,真正让新手折腾半天的是工具链没装利索、板型选错、串口不认。所以这一节的重点不是教你写代码(小智的代码是现成的,你先当黑盒把它跑起来),而是陪你把编译、烧录、看日志这条链一次走通

📌 说明

本节讲的是编译流程,具体命令一律以小智上游仓库 README 为准。 小智代码版权归原作者 78 及社区贡献者,遵循 MIT 协议。仓库在持续更新,编译步骤、依赖版本、menuconfig 里的选项都可能变——我们把"怎么走这套流程、每步该看到什么、卡住怎么办"讲清楚,但不搬运整套构建脚本冒充教程。任何与本页不一致处,以仓库最新 README 为准。动手前先读免责声明

先决条件:ESP-IDF 环境得先架好

编译小智靠的是 ESP-IDF(乐鑫官方 C 语言开发框架),小智要求 5.4 及以上版本(低版本编译会报缺组件、缺 API 的怪错,别用旧的)。

这套环境怎么装,L1 那节搭好 ESP-IDF 环境已经手把手讲透了——VS Code + ESP-IDF 扩展一键拉工具链,或者命令行装好后每开终端先跑一次 export.sh(Windows 是 export.bat)激活环境。这里不重复,你按那节把环境架好,能跑通 Blink,就说明工具链没问题,回来接着往下走。

装的时候记牢一条:版本选 5.4 或更高。L1 那节为通用写的是 5.x,到小智这里要卡死下限——装之前先去上游 README 顶部确认它当前要求的具体版本,照它来最稳。

🚧 避坑

别拿一个装了好几年、版本很老的 ESP-IDF 直接来编小智。 小智用到了新版才有的组件和 API,旧版编译会甩一堆"找不到组件""未定义符号"的错,你会以为是自己哪弄错了,其实是版本不够。真遇到这类报错,第一件事是 idf.py --version 看一眼版本对不对,而不是去改代码。

第一步:把上游仓库 clone 下来

环境就绪,先把小智代码拉到本地。找一个纯英文、无空格的路径(中文路径是 ESP-IDF 的经典坑,编译会报莫名其妙的错):

git clone https://github.com/78/xiaozhi-esp32.git
cd xiaozhi-esp32

你应该看到什么:git 拉下整个仓库,进目录后你能看到 main/(小智的主代码)、CMakeLists.txt(工程入口)、README.md(跟着走的说明书)这些眼熟的 ESP-IDF 工程结构。

💡 提示

clone 时网络不稳、拉一半断掉,是境外仓库的常态。断了别慌,cd 进去删掉半成品目录重来,或者挂代理再拉。这跟你的板子、代码都没关系,纯网络问题——跟 L1 里下工具链卡住是一个道理。

第二步:设定芯片型号

进了工程目录,先告诉 ESP-IDF 你这块板子是哪颗芯片。ESP32-S3 就是:

idf.py set-target esp32s3

你买的是别的型号(比如 C3、P4),就换成对应的 target。这一步必须在 menuconfig 之前做——它决定了后面能配的选项,设错了后面全乱。

你应该看到什么:终端刷一段配置生成信息,末尾提示 target 已设为 esp32s3。这一步会生成 sdkconfig 配置文件,下一步就是去改它。

第三步:menuconfig 选板型、配 WiFi

这是小智编译里最需要你亲手动的一步。打开配置菜单:

idf.py menuconfig

会弹出一个上古风格的文字菜单(方向键移动、回车进子菜单、空格选中、Q 退出问你存不存)。小智把自己的配置项集中在一个专属菜单下(README 里会写明确切名字,通常是 Xiaozhi Assistant 之类的分组),你要在里面确认两件事:

  • 选对板型(Board Type):小智适配 70+ 款开发板,menuconfig 里有个板型下拉列表。选你手上那块板子对应的型号——这一步选错,编出来的固件引脚、屏幕、音频芯片全对不上,刷进去要么不亮要么乱套。不确定选哪个,回上一节挑硬件对一下你板子的确切型号,再去 README 的支持清单里查它对应哪个选项。
  • 配网方式:小智支持 WiFi 配网。多数板型默认走开机后热点配网(板子开个热点,你手机连上去填 WiFi 账号密码),这种不用在这里写死账号密码。有的构建也支持在编译期填死 WiFi——具体以 README 当前说明为准。第一次上手,建议就用默认的热点配网,别在编译期折腾,先把固件跑起来。

改完按 Q,它问你存不存,选 Yes

🚧 避坑

板型(Board Type)选错,是这一节最高频的翻车点。 症状很迷惑:固件能编译成功、能刷进去,但开机后屏幕不亮、或者说话没反应、或者一直重启——你会满世界找代码 bug,其实只是 menuconfig 里的板型和你实际的板子对不上。刷之前,务必回头核一遍板型选对没有。

第四步:build → flash → monitor,一条龙

配置就绪,接下来就是 L1 里你已经练熟的那条龙。把板子用能传数据的 USB 线插上电脑,选对端口(拔插板子看哪个口新冒出来,方法见 L1),然后:

idf.py build flash monitor

这三个动作连着跑:build 编译(小智比 Blink 大得多,第一次编几分钟很正常,别以为卡死了)、flash 烧进板子、monitor 打开串口盯着板子的输出。

你应该看到什么

  • 编译阶段终端滚一大堆编译信息,最后 Project build complete
  • 烧录阶段出现 Connecting....、一行行 Writing at 0x... 进度、最后 Done
  • 串口监视刷出小智的启动日志——你能看到它打印固件版本、初始化各个模块、连 WiFi 的过程。

Ctrl + ] 退出串口监视。

💡 提示

第一次 build 很慢是正常的(小智是个大工程,要编一堆组件),后面改点东西再编就快了(增量编译)。真卡在 Connecting........_____ 连不上芯片,是烧录问题不是编译问题——按住板上 BOOT 键、点一下 EN/RST、松开 BOOT 进下载模式再试,这招 L1 讲过,对小智一样管用。

第五步:看串口日志,确认它真的活了

固件刷进去了不等于它活了。串口日志是你唯一的"体检报告"——盯着 idf.py monitor 刷出来的日志,确认这几件事发生了:

  • 启动没进 boot loop:如果日志刷几行就复位、又刷几行又复位(不停重启),说明固件在崩溃。最常见还是板型选错导致初始化某个不存在的外设挂了——回第三步核板型。
  • WiFi 连上了:默认热点配网的话,日志会提示进入配网模式,你用手机连它开的热点、填好家里 WiFi 就能让它上网。看到日志打印拿到 IP 地址,网络这关就通了。
  • 各模块初始化正常:日志里能看到音频、显示等模块依次初始化的打印,没有大段红色 error。

看到它开机、连网、日志跑得顺,恭喜——你手上这台小智,从一块空板子变成了能开机联网的实物。 到这一步,编译刷固件这关就过了。

📌 说明

日志里偶尔有一两行 warning(黄色)多数无伤大雅,别被吓到;真正要警惕的是大段红色 error + 不停重启。看不懂某段报错,把那段日志原样复制,连同"我用 ESP-IDF 5.4+、芯片 ESP32-S3、编的是小智固件、板型选的是 XXX"一起发给 AI copilot,让它帮你定位——这是 L1 里就养成的习惯。

常见坑速查

编译刷固件这关,卡点高度集中,照「现象 → 原因 → 怎么办」对号入座:

现象 最可能的原因 怎么办
编译报"找不到组件/未定义符号" ESP-IDF 版本太老(低于 5.4) idf.py --version 核版本;升到小智 README 要求的版本
编译报一堆莫名其妙的路径错 工程放在了中文/带空格的路径 把 clone 下来的目录移到纯英文无空格路径重来
能编能刷,但开机屏不亮/无反应/重启 menuconfig 里板型选错 回第三步,核对板型和你实际板子一致(最高频坑)
flash 卡在 Connecting........_____ 板子没进下载模式 / 串口选错 按 BOOT + 点 EN/RST 手动进下载模式;确认端口选的是板子那个口
端口列表没有板子的口 USB 线只能充电 / 缺串口驱动 换能传数据的线;装 CH340 或 CP2102 驱动(见 L1 排查表
开机后不停 boot loop 板型不符 / 依赖没拉全 先核板型;确认按 README 装齐了子模块/依赖
🚧 避坑

别自己瞎改小智的代码去"修"编译错误。 上游代码是能编过的,你遇到的编译/烧录错,99% 是环境问题(版本、路径、板型、线、驱动),不是代码 bug。第一反应永远是照上面这张表查环境,而不是动 main/ 里的源码——改了反而给自己埋雷。

小结 · 下一步

这一节你做成了一件实在事:

  • 你确认了小智要 ESP-IDF 5.4+,环境沿用 L1 那套(搭好 ESP-IDF 环境),不重复造轮子。
  • 你 clone 了上游仓库set-target 设好芯片、在 menuconfig 里选对板型、配好网——这是小智区别于 Blink 的关键动作。
  • 你用 idf.py build flash monitor 把固件编出来、刷进去、看串口日志确认它开机联网。
  • 你手上有了一张编译刷固件的坑速查表,认得"能编能刷但不亮=多半板型选错"这个最迷惑的坑。

板子活过来了,但它现在还是个"哑巴"——不会录音、也不会出声。下一步:去让小智能听会说,把 I2S 数字音频接进来,给它装上"耳朵和嘴"。想回看工具链细节,随时翻 L1 ESP-IDF 环境点亮第一个 LED

📄 来源 / 自校链接

本文为公开资料整理,非亲测。关键参数与代码请结合实物与下列官方来源验证。

内容有错、看不懂、或想看下一期?告诉我们 →

本文为公开资料的学习整理,非亲测。涉接线/花钱/合规的步骤请结合实物与官方最新资料验证,风险自负。见免责声明