news 2026/9/10 0:55:37

xiaozhi-esp32 M5Stack AtomS3R + Echo Base 固件构建实战:build.py 快速打包、手动 menuconfig 配置与合并固件烧录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
xiaozhi-esp32 M5Stack AtomS3R + Echo Base 固件构建实战:build.py 快速打包、手动 menuconfig 配置与合并固件烧录

xiaozhi-esp32 M5Stack AtomS3R + Echo Base 固件构建实战:build.py 快速打包、手动 menuconfig 配置与合并固件烧录

【免费下载链接】xiaozhi-esp32An MCP-based chatbot | 一个基于MCP的聊天机器人项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32

本文围绕 xiaozhi-esp32 仓库中main/boards/m5stack/atoms3r-echo-base/README.md的板卡构建指南展开,系统讲解 M5Stack AtomS3R 搭配 Echo Base 底座的完整固件构建流程:如何用scripts/build.py一键生成可分发的固件压缩包、如何通过idf.py menuconfig手动配置编译目标/分区表/PSRAM 模式、如何用esptool.py merge_bin手工合并 bootloader、分区表、应用与 SPIFFS 资源为单文件并高速烧录。读完后你能够独立完成该板卡固件的构建、验证与烧录,并理解每个烧录地址在partitions/v2/8m.csv分区表中的对应关系。

一、板卡与构建产物总览

AtomS3R + Echo Base 是 M5Stack 生态中带圆形显示屏的语音助手组合:AtomS3R 提供 ESP32-S3 主控,Echo Base 底座提供圆形 LCD、音频 codec、麦克风阵列供电与按键扩展。在 xiaozhi-esp32 中,该板卡的驱动实现位于 atoms3r_echo_base.cc,引脚定义位于 config.h,构建元数据位于 config.json。

从 config.json 可以确认该板卡的构建关键参数:

{ "manufacturer": "m5stack", "type": "atoms3r-echo-base", "target": "esp32s3", "builds": [ { "name": "atoms3r-echo-base", "sdkconfig_append": [ "CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y", "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/8m.csv\"" ] } ] }

这意味着:编译目标为esp32s3,Flash 固定 8 MB,分区表使用partitions/v2/8m.csvbuild.py在解析该文件时,会把manufacturer与构建项name拼成发布产物名,并与 OTA 上报的 board type/name 保持一致——因此命令中的--name参数必须与config.json中的name字段(atoms3r-echo-base)完全一致。

二、快速构建:使用 build.py 生成完整固件包

文档推荐的方式是直接用仓库自带的构建脚本生成完整固件包:

python scripts/build.py atoms3r-echo-base --name atoms3r-echo-base --zip

参数说明:

  • atoms3r-echo-base:定位到main/boards/m5stack/atoms3r-echo-base/config.json指定的板卡与构建项;
  • --name atoms3r-echo-base:指定 OTA 上报与发布产物使用的板卡名称(须符合小写字母、数字、.-的命名规范,build.py 中有严格校验);
  • --zip:将合并后的build/merged-binary.bin打包为 zip 发布包。

生成成功后,固件压缩包位于:

releases/v2.2.6_atoms3r-echo-base.zip

需要注意版本号的来源:build.py 的get_project_version()会从根 CMakeLists.txt 中读取set(PROJECT_VER ...)的值来拼接releases/v{version}_{name}.zip文件名。当前仓库的PROJECT_VER2.4.2,因此本地实际执行时产物会是releases/v2.4.2_atoms3r-echo-base.zip这样的路径,文档中的v2.2.6是示例版本号,请以你拉取仓库时的实际版本为准。脚本内部通过idf.py merge-bin完成二进制合并(merge_bin()函数),再将build/merged-binary.bin压缩进releases/目录,产物为单一merged-binary.bin,可直接整片烧录。

build.py还会根据目标芯片决定唤醒词引擎:从 build.py 中的_AFE_WAKE_WORD_TARGETS定义可以看到,esp32s3走 AFE(afe_audio_engine)路径,与 audio/engines 下的实现一致。

三、手动配置:menuconfig 全流程

如果不使用打包脚本,也可以手动完成配置与编译,这一步适合排查问题或定制固件。

3.1 设置编译目标

idf.py set-target esp32s3

AtomS3R 搭载 ESP32-S3,set-target会重新生成针对该芯片的 sdkconfig 默认值(对应仓库根目录的 sdkconfig.defaults.esp32s3)。

3.2 打开配置菜单并选择板卡

idf.py menuconfig

在菜单中依次选择:

Xiaozhi Assistant -> Board Type -> AtomS3R + Echo Base

该项对应 Kconfig.projbuild 中的bool "M5Stack AtomS3R + Echo Base"配置项。选中后,编译系统会包含 main/boards/m5stack/atoms3r-echo-base 目录下的atoms3r_echo_base.cc,由文件末尾的DECLARE_BOARD(AtomS3rEchoBaseBoard)宏完成板卡类注册。

3.3 配置 Flash 大小

Serial flasher config -> Flash size -> 8 MB

AtomS3R 的 Flash 为 8 MB,与config.jsonCONFIG_ESPTOOLPY_FLASHSIZE_8MB=y的追加项一致。Flash size 配置影响 bootloader 的烧录地址计算与可用分区空间上限。

3.4 配置分区表

Partition Table -> Custom partition CSV file -> partitions/v2/8m.csv

该分区表是理解后续合并固件地址的关键,partitions/v2/8m.csv 内容如下:

# ESP-IDF Partition Table # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x4000, otadata, data, ota, 0xd000, 0x2000, phy_init, data, phy, 0xf000, 0x1000, ota_0, app, ota_0, 0x20000, 0x2f0000, ota_1, app, ota_1, , 0x2f0000, assets, data, spiffs, 0x600000, 2M

可以看到:

  • ota_00x20000开始,大小0x2f0000(约 3 MB),ota_1紧随其后同样 3 MB,双区 OTA 是 xiaozhi 固件支持在线升级的基础;
  • assets是 SPIFFS 格式的资源分区,固定在0x600000,占 2 MB,存放本地音频素材(对应main/assets下打包进generated_assets.bin的资源);
  • 分区表文件本身烧录在0x8000(由 ESP-IDF 约定)。

3.5 配置 PSRAM

Component config -> ESP PSRAM -> SPI RAM config -> Mode (QUAD/OCT) -> Octal Mode PSRAM

AtomS3R 的 PSRAM 为八线(Octal)模式,必须选择Octal Mode PSRAM,否则系统无法识别外部 RAM,LVGL 显示帧缓冲与音频缓存都会受影响。

3.6 编译

idf.py build

构建完成后,build/目录下会生成bootloader/bootloader.binpartition_table/partition-table.binota_data_initial.binxiaozhi.bingenerated_assets.bin等产物。

四、合并固件与高速烧录

手动构建后,需要把各段产物合并成一个整片二进制,再用高速模式一次性写入。文档给出的标准命令为:

esptool.py --chip esp32s3 merge_bin \ --flash_mode dio \ --flash_freq 80m \ --flash_size 8MB \ 0x0 build/bootloader/bootloader.bin \ 0x8000 build/partition_table/partition-table.bin \ 0xd000 build/ota_data_initial.bin \ 0x20000 build/xiaozhi.bin \ 0x600000 build/generated_assets.bin \ -o AtomS3R-EchoBase-XiaoZhi-v2.2.6_0x00.bin

参数与地址逐一对照 partitions/v2/8m.csv 验证:

参数含义
--flash_mode dioFlash 引脚模式 DIO,与 AtomS3R 硬件封装匹配
--flash_freq 80mFlash 时钟 80 MHz,保证高速写入
--flash_size 8MB与 menuconfig 中 Flash size 保持一致
0x0 bootloader.binbootloader 固定起始地址
0x8000 partition-table.bin分区表固定地址
0xd000 ota_data_initial.bin对应分区表otadata0xd000),标记当前 OTA 分区
0x20000 xiaozhi.bin对应ota_0应用分区起始地址
0x600000 generated_assets.bin对应assetsSPIFFS 资源分区

合并完成后烧录:

esptool.py -b 1500000 write_flash -z 0 AtomS3R-EchoBase-XiaoZhi-v2.2.6_0x00.bin
  • -b 1500000:将 UART 波特率提到 1.5 Mbps,显著缩短 8 MB 整片写入时间;
  • -z:写入完成后对 Flash 做校验;
  • 0:从地址 0 开始按合并后的布局写入。

使用build.py快速构建时,上述merge_bin步骤已由idf.py merge-bin自动完成(产物为build/merged-binary.bin),你只需执行--zip打包后的烧录即可。

五、使用说明:供电与 USB 口分工

文档末尾给出了一条关键的硬件使用说明:

Echo Base 正常运行时请从 Echo Base 底座的 USB-C 口供电;AtomS3R 的 USB-C 口主要用于烧录。

即日常使用请让 AtomS3R 扣在 Echo Base 上、由底座 USB-C 供电;AtomS3R 本体的 USB-C 口主要用于连接电脑进行串口烧录/调试。若烧录时无响应,优先检查是否插对了 USB 口。

六、源码级原理补充:上电自检与硬件探测

结合 atoms3r_echo_base.cc 的源码,可以了解该板卡固件上电后实际做了什么,这对排查"黑屏/无声/不联网"类问题很有帮助。

6.1 Echo Base 连接检测(I2C 扫描)

构造函数中依次执行InitializeI2c()I2cDetect()CheckEchoBaseConnection()。其中I2cDetect()会扫描主 I2C 总线(SDA=GPIO38、SCL=GPIO39,见 config.h)的全部 128 个地址,只有同时探测到0x180x43(Pi4IOE IO 扩展芯片)两个器件时,才判定 Echo Base 已连接。若未连接,CheckEchoBaseConnection()会点亮屏幕显示Echo Base not connected错误页并进入死循环,每秒重新探测一次,直到检测到重新插好后调用esp_restart()重启——所以若开机卡在错误页,基本可以确定是 AtomS3R 未与 Echo Base 正确扣合。

6.2 圆形屏驱动:GC9107/ST7735 自动识别

该板卡的 128×128 圆形屏(显示参数DISPLAY_WIDTH 128 / DISPLAY_HEIGHT 128,Y 向偏移 32,见 config.h)通过 SPI3(MOSI=GPIO21、SCLK=GPIO15、CS=GPIO14、DC=GPIO42、RST=GPIO48)驱动。ReadLcdPanelId()会用RDDID命令读取面板 ID:0x7683/0x897C识别为 ST7735,0x079100识别为 GC9107,未知 ID 回退到 GC9107 驱动(DetectLcdPanel())。因此该固件对两批不同屏控芯片的硬件自动兼容,无需手动选择。

6.3 音频链路与按键

  • 音频 codec 为 ES8311(I2C 地址ES8311_CODEC_DEFAULT_ADDR,I2S 引脚 WS=GPIO6、BCLK=GPIO8、DIN=GPIO7、DOUT=GPIO5),采样率 24 kHz(AUDIO_INPUT_SAMPLE_RATE/AUDIO_OUTPUT_SAMPLE_RATE);
  • 扬声器静音控制通过 Pi4IOE(0x43)的IO_OUT寄存器切换,构造时默认取消静音;
  • 背光由内部 I2C(SDA=GPIO45、SCL=GPIO0)上的 LP5562 灯驱芯片控制,CustomBacklight类将 0~100 亮度映射为 LP5562 的 0~255 PWM 值;
  • BOOT_BUTTON_GPIOGPIO41)在启动阶段按下会进入 Wi-Fi 配网模式,运行中按下则切换对话状态(InitializeButtons())。

七、常见问题排查清单

  1. 烧录无响应:确认使用 AtomS3R 本体 USB-C 口,且设备处于下载模式;烧录速率可先用默认 115200 试连,再用-b 1500000提速。
  2. 开机卡在 "Echo Base not connected" 错误页:重新扣紧 AtomS3R 与底座,等待固件自动重启;若仍失败,用串口日志确认 I2C 扫描是否同时看到0x180x43
  3. OTA 升级失败/资源加载异常:确认 Flash size 为 8 MB、分区表为partitions/v2/8m.csv、PSRAM 为 Octal Mode,三者缺一都可能导致assets分区(0x600000起 2 MB)越界或帧缓冲分配失败。
  4. 版本号疑问build.py产物名跟随根 CMakeLists.txt 的PROJECT_VER,文档命令中的v2.2.6仅为示例,实际以仓库版本为准。

参考文件

  • 板卡构建文档:main/boards/m5stack/atoms3r-echo-base/README.md
  • 板卡驱动:main/boards/m5stack/atoms3r-echo-base/atoms3r_echo_base.cc
  • 引脚与显示参数:main/boards/m5stack/atoms3r-echo-base/config.h
  • 构建元数据:main/boards/m5stack/atoms3r-echo-base/config.json
  • 构建脚本:scripts/build.py
  • 分区表:partitions/v2/8m.csv
  • 板卡 Kconfig:main/Kconfig.projbuild
  • ESP32-S3 默认配置:sdkconfig.defaults.esp32s3

【免费下载链接】xiaozhi-esp32An MCP-based chatbot | 一个基于MCP的聊天机器人项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 0:48:30

51单片机AD/DA转换实验:AD0809与DA0832汇编代码及调试要点

简介:针对51单片机汇编语言中AD 0809模数转换与DA0832数模转换实验,这份附件压缩包提供了可运行的Keil5工程及参考代码注释,适合电子、自动化、计算机等专业正在学习单片机接口编程的初学者和开发者。包内共10个文件,以uvproj工程…

作者头像 李华
网站建设 2026/9/10 0:47:16

Qt界面嵌入实战:从ui加载到qcustomplot与部署避坑指南

简介:这套Qt嵌入UI界面Demo主要面向希望在Visual Studio 2022中使用Qt构建图形界面的C开发者,旨在演示从环境配置到界面加载的完整流程。压缩包共87个文件,总量108.06MB,其中包含多个.ui界面设计文件、对应C源码与头文件、.qrc资源…

作者头像 李华
网站建设 2026/9/10 0:46:38

Python函数进阶:从内置函数到闭包与装饰器的完整认知

函数是Python里绕不开的核心概念,这个题目看起来基础,但我发现很多代码写得吃力的同学,问题往往就出在对函数理解不够深。看最近搜索热词就知道,"内置函数""回调函数""lambda函数""open函数&q…

作者头像 李华
网站建设 2026/9/10 0:45:59

2026年9月最新AI大模型榜单

GPT-6 发布后,2026年9月最新AI大模型榜单 最近全网都在传"GPT-6 Astra发布,登顶最强模型",我本来也信了,结果去查了一下独立评测数据(Artificial Analysis智能指数),发现事情不是这样…

作者头像 李华