
ESP32-C5HR8 采用 RISC-V 32 位处理器,集成 384 KB HP SRAM、320 KB ROM,支持 2.4 GHz/5 GHz 双频 Wi-Fi 6、蓝牙 5 (LE) 和 IEEE 802.15.4 (Zigbee 3.0、Thread)
DCDC 升降压芯片
贴片天线座 IPEX 4 代
16 MB Flash 存储芯片
ETA6098 充电管理芯片
BQ27220 电量计 可提供电池容量信息
MX1.25 锂电池接口 MX1.25 2P 连接器,可用于接入 3.7 V 锂电池,支持充放电
Type-C 接口,用于烧录程序和日志打印
QMI8658 六轴惯性测量单元(IMU),包含一个 3 轴陀螺仪和一个 3 轴加速度计
MX1.25 喇叭接口
SH1.0 RTC 电池接口 可以接入 CR2032 带 1.0 正向插头
ES8311(背面) 音频采集和编解码芯片
LCD 屏幕接口 用于连接 LCD 显示屏
单麦克风 用于音频信号的采集
PCF85063 RTC 时钟芯片
RST 按键 复位按键,也可配合 BOOT 按键进入下载模式
BOOT 按键 可作为自定义按键使用
PWR 按键 长按三秒可实现开关机功能


本章节包含以下部分,请按需阅读:
初次接触 Arduino ESP32 开发,想要快速上手?我们为您准备了一套通用的 入门教程。
请注意:该教程使用 ESP32-S3-Zero 作为教学示例,所有硬件代码均基于其引脚布局。在动手实践前,建议您对照手中的开发板引脚图,确认引脚配置无误。
请参考 安装和配置 Arduino IDE 教程 安装 Arduino IDE,并添加 ESP32 开发板支持。
连接 ESP32-C5-Touch-LCD-1.69 到电脑后,在"工具"菜单中选择对应的串口号。
Arduino 示例位于工程的 example/arduino/examples 目录。运行示例前,先解压 example/arduino/ESP32_C5_Touch_LCD_1in69.zip,再将解压后的库放入 Arduino 默认的 libraries 目录。
Arduino 库文件夹通常位于:
C:\Users\<用户名>\Documents\Arduino\libraries
也可以在 Arduino IDE 中通过"文件 > 首选项"查看"项目文件夹位置",并在该路径下找到 libraries 文件夹。
| 示例程序 | 基础例程说明 |
|---|---|
| 01_RGB_Test | 屏幕刷色测试 |
| 02_Mic_Speaker_Test | 麦克风与扬声器测试 |
| 03_IMU_Test | IMU 测试 |
| 04_Bat_Test | 电池检测测试 |
| 05_RTC_Test | RTC 测试 |
| 06_LVGL_Demo_Test | LVGL 示例测试 |
Colors[] / ColorNames[]:RGB565 颜色值和名称数组(红/绿/蓝/白/黑),用于循环刷屏。bsp_display_init():初始化 SPI 总线和 ST7789 LCD 面板。bsp_display_backlight_on():点亮 LCD 背光。bsp_display_brightness_set(100):设置背光亮度为 100%。bsp_display_fill(Colors[color_index]):用指定 RGB565 颜色填充整屏。Serial.printf(...):通过串口输出当前颜色名称和索引,便于调试。
bsp_audio_init():初始化 I2S 总线和 ES8311 编解码器。bsp_audio_set_speaker_volume(70):设置扬声器音量为 70。bsp_audio_set_mic_gain(18):设置麦克风增益为 18dB。bsp_audio_read(audio_buffer, ...):从麦克风读取 1024 字节音频数据。bsp_audio_write(audio_buffer, ...):将读取的音频数据写入扬声器,实现实时回环。microphone loopback to speaker。bsp_i2c_init():初始化 I2C 总线(SDA=GPIO8,SCL=GPIO9,400kHz)。imu.init(imu_calibration, QMI8658_I2C_ADDRESS):初始化 QMI8658,I2C 地址 0x6B。imu.setAccelRange(8) / imu.setGyroRange(512):设置加速度量程 ±8g、陀螺仪量程 ±512dps。imu.setAccelODR(1000) / imu.setGyroODR(1000):设置加速度和陀螺仪输出数据率为 1000Hz。imu.update():更新传感器数据。imu.getAccel(&accel_data) / imu.getGyro(&gyro_data):读取加速度和陀螺仪数据。imu.getTemp():读取温度数据。QMI8658 ready 后,每 100ms 输出一行加速度(g)、陀螺仪(dps)和温度(℃)数据。
bsp_display_start_partial(&battery_display_cfg):以局部刷新模式启动 LVGL,减少显存占用。bsp_bat_init(battery_capacity_mah):初始化 BQ27220 电量计,设置电池容量为 1500mAh。bsp_get_bat_info(&bat_info):读取电池信息(电压/电流/SOC/温度等)。bsp_display_lock(0) / bsp_display_unlock():获取/释放 LVGL 互斥锁,确保线程安全。lv_label_set_text_fmt(battery_label, ...):格式化并更新电池信息标签。bat_info_changed(...):判断电池数据是否变化,避免无意义刷新。
bsp_i2c_init():初始化 I2C 总线。rtc.begin():初始化 PCF85063A RTC 芯片。rtc.oscillator_stop():检测 RTC 是否停振(掉电),返回 true 表示时间丢失。rtc_set_to_build_time():使用编译时间(__DATE__ / __TIME__)设置 RTC 时间。rtc.time(NULL):读取 RTC 时间戳。localtime(¤t_time):将时间戳转换为本地时间结构体,便于格式化输出。RTC running 或 RTC lost power, set to build time。YYYY-MM-DD HH:MM:SS 格式的时间。
bsp_display_start_full_frame(&lgvl_config):以全帧模式启动 LVGL,启用 PSRAM、双缓冲和全刷新,获得最佳显示效果。bsp_display_brightness_set(100):设置背光亮度为 100%。bsp_display_lock(0) / bsp_display_unlock():获取/释放 LVGL 互斥锁,确保 UI 操作线程安全。lv_demo_benchmark_set_max_speed(true):设置 benchmark 为最大速度模式。lv_demo_benchmark():启动 LVGL benchmark 跑分演示。本章节包含以下内容,请按需阅读:
初次接触 ESP32 ESP-IDF 开发,想要快速上手?我们为您准备了一套通用的 入门教程。
请注意:该教程使用 ESP32-S3-Zero 作为教学示例,所有硬件代码均基于其引脚布局。在动手实践前,建议您对照手中的开发板引脚图,确认引脚配置无误。
ESP32-C5-Touch-LCD-1.69 示例工程需要 ESP-IDF v5.3 或更新版本。
以下内容以 Windows 系统为例,使用 VS Code + ESP-IDF 扩展 的方式进行开发。Mac/Linux 用户请参考 官方说明。
此部分图示以安装 ESP-IDF V5.5.2 为例示范,安装时请选用与您开发板示例匹配的 ESP-IDF 版本。
前往 ESP-IDF Installation Manager 下载 ESP-IDF 安装管理器。这是乐鑫最新推出的跨平台安装工具,下文将演示如何使用其离线安装功能。
在页面中点击 Offline Installer 标签,然后在筛选栏中选择 Windows 操作系统和你需要的 ESP-IDF 版本(图示仅为参考,请以实际为准)。

确认选择无误后,点击下载按钮。浏览器将自动同时下载两个文件:一个是 ESP-IDF 离线整合包(.zst),另一个是 ESP-IDF 安装器(.exe)。

请耐心等待两个文件下载完成。
下载完成后,双击运行 ESP-IDF 安装器(eim-gui-windows-x64.exe)。
启动后,可在右上角将界面语言切换为中文。

安装工具会自动检测同一目录下是否存在离线整合包。点击 从存档安装。

接下来,选择安装路径。建议使用默认路径;若需自定义,请确保路径中不包含中文或空格。确认无误后,点击 开始安装。

当看到如下界面时,表示 ESP-IDF 已安装成功。

建议同时安装驱动程序。点击 完成安装,然后点击 安装驱动程序。

下载并安装 Visual Studio Code。
安装时建议勾选 通过 Code 打开操作添加到 Windows 资源管理器文件上下文菜单,以便快速打开项目文件夹。
在 VS Code 中,点击侧边活动栏中的 扩展图标(或使用快捷键 Ctrl + Shift + X)打开 扩展 视图。
在搜索框中输入 ESP-IDF,找到 ESP-IDF 扩展并点击安装。

当 ESP-IDF 扩展版本 ≥ 2.0 时,扩展会自动检测并识别上述步骤中安装的 ESP-IDF 环境,无需手动配置。
若安装失败或需重装,可尝试删除 C:\Users\%Username%\esp 与 C:\Users\%Username%\.espressif 后重试。
进入 ESP-IDF 示例工程目录后执行:
cd example/esp-idf
idf.py build flash monitor
如果需要指定串口,请将 COMx 替换为实际串口号,例如 COM5:
idf.py -p COMx build flash monitor
ESP-IDF 示例位于工程的 example/esp-idf/main/examples 目录,工程入口为 example/esp-idf/main/main.c。同一时间只保留一个示例或应用宏为 1,其他宏保持为 0。
#define EXAMPLE_RGB_TEST 1
#define EXAMPLE_MIC_SPEAKER_TEST 0
#define EXAMPLE_IMU_TEST 0
#define EXAMPLE_BAT_TEST 0
#define EXAMPLE_RTC_TEST 0
#define EXAMPLE_LVGL_DEMO_TEST 0
#define EXAMPLE_Brookesia_TEST 0
#define APPS_WIFI_Connect 0
#define APPS_Clock 0
#define APPS_Honeycomb_Demo 0
默认配置运行 RGB 刷色测试。如需运行其他示例,将目标示例对应宏改为 1,并将其他宏改为 0。
| 示例程序 | 基础例程说明 |
|---|---|
| 01_RGB_Test | 屏幕刷色测试 |
| 02_Mic_Speaker_Test | 麦克风与扬声器测试 |
| 03_IMU_Test | IMU 测试 |
| 04_Bat_Test | 电池检测测试 |
| 05_RTC_Test | RTC 测试 |
| 06_LVGL_Demo_Test | LVGL 示例测试 |
| 07_Brookesia_Test | Brookesia 示例测试 |
| 08_WIFI_Connect | Wi-Fi 配网应用 |
| 09_Clock_Display | 时钟显示应用 |
| 10_Honeycomb_Demo | 蜂窝图标交互演示 |
bsp_display_new(&display_cfg, &panel, NULL):初始化 LCD 面板,返回 panel 句柄。bsp_display_brightness_init() / bsp_display_brightness_set(100):初始化并设置背光亮度为 100%。heap_caps_malloc(..., MALLOC_CAP_DMA):分配 DMA 兼容的绘制缓冲区,用于批量像素传输。rgb_test_draw_color(panel, draw_buffer, colors[color_index]):将指定颜色按 20 行分块写入 LCD,逐块刷新整屏。vTaskDelay(pdMS_TO_TICKS(RGB_TEST_DELAY_MS)):每种颜色停留 1 秒。
bsp_audio_init(NULL):初始化 I2S 总线和 ES8311 编解码器。bsp_audio_codec_speaker_init() / bsp_audio_codec_microphone_init():分别初始化扬声器和麦克风编解码设备。esp_codec_dev_open(speaker, &codec_fs):以 16bit 单声道格式打开扬声器设备。esp_codec_dev_set_out_vol(speaker, 70):设置扬声器音量为 70。esp_codec_dev_set_in_gain(microphone, 18):设置麦克风增益为 18dB。esp_codec_dev_read(...) / esp_codec_dev_write(...):从麦克风读取 1024 字节数据并写入扬声器,实现实时回环。microphone loopback to speaker。bsp_i2c_init():初始化 I2C 总线(SDA=GPIO8,SCL=GPIO9,400kHz)。bsp_qmi8658_init():初始化 QMI8658 六轴传感器,I2C 地址 0x6B。bsp_qmi8658_get_data(&data):读取加速度、陀螺仪和温度数据到 qmi8658_data_t 结构体。ESP_LOGI(TAG, ...):通过串口输出加速度(m/s²)、陀螺仪(rad/s)和温度(℃)数据。vTaskDelay(pdMS_TO_TICKS(IMU_TEST_DELAY_MS)):按宏设定的间隔读取一次数据。
bsp_display_start():启动 LVGL 显示。bsp_bat_init(battery_capacity_mah):初始化 BQ27220 电量计,设置电池容量(入口参数传入,默认 1000mAh)。bsp_get_bat_info(&bat_info):读取电池信息(电压/电流/SOC/温度/容量等)。bsp_display_lock(0) / bsp_display_unlock():获取/释放 LVGL 互斥锁,确保 UI 操作线程安全。lv_label_set_text_fmt(label, ...):格式化并更新电池信息标签,包含状态、电压、电流、SOC、温度和容量。
bsp_rtc_init():初始化 PCF85063A RTC 芯片。bsp_set_rtc_time_date(time):设置 RTC 初始时间(示例中设为 2026-01-01 12:00:00)。bsp_get_rtc_time_date(&time):从 RTC 读取当前时间到 pcf85063a_datetime_t 结构体。bsp_datetime_to_str(datetime_str, ...):将时间结构体转换为字符串,便于输出显示。vTaskDelay(pdMS_TO_TICKS(RTC_TEST_DELAY_MS)):按宏设定的间隔读取一次时间。rtc time: YYYY-MM-DD HH:MM:SS 格式的时间。
bsp_display_start():启动 LVGL 显示,初始化 LCD 面板和 LVGL 核心。bsp_display_brightness_set(100):设置背光亮度为 100%。bsp_display_lock(0) / bsp_display_unlock():获取/释放 LVGL 互斥锁,确保 UI 操作线程安全。lv_demo_widgets():启动 LVGL Widgets 演示,展示按钮、滑块、开关、图表等常用控件。
ESP_Brookesia_Phone(display):创建 Brookesia Phone 实例,绑定 LVGL 显示。ESP_Brookesia_PhoneStylesheet_t(...):使用默认深色主题样式表。phone->addStylesheet(stylesheet) / phone->activateStylesheet(stylesheet):添加并激活样式表。phone->setTouchDevice(bsp_display_get_input_dev()):设置触摸输入设备。phone->registerLvLockCallback(...) / phone->registerLvUnlockCallback(...):注册 LVGL 锁回调,确保线程安全。phone->begin():启动 Phone 界面框架。phone->installApp(&minimal_app):安装最小化示例应用(显示 "Hello Brookesia" 文本)。
wifi_connect_init_stack():初始化 NVS、网络接口和默认事件循环。wifi_connect_start_network():创建 AP(SSID 基于 MAC 地址),启动 HTTP 服务器和 DNS 服务器,实现 Captive Portal。bsp_display_set_partial_mode(true, 40):设置 LVGL 局部刷新模式,降低显存占用。wifi_connect_create_screen():创建包含二维码和状态栏的配网页面,二维码包含 AP 的 SSID 和密码。
bsp_i2c_init() / bsp_rtc_init():初始化 I2C 总线和 PCF85063A RTC,为时钟提供时间源。bsp_display_set_partial_mode(true, 40):设置 LVGL 局部刷新模式,降低显存占用。bsp_display_start():启动 LVGL 显示。bsp_display_brightness_set(100):设置背光亮度为 100%。bsp_display_lock(0) / bsp_display_unlock():获取/释放 LVGL 互斥锁,确保 UI 操作线程安全。clock_app_create_screen():创建时钟界面,加载 Classic 表盘并启动定时器刷新指针位置。vTaskDelay(pdMS_TO_TICKS(CLOCK_APP_IDLE_MS)):按宏设定的间隔进入空闲等待。bsp_display_start():启动 LVGL 显示。honeycomb_demo_create_screen():创建蜂窝布局界面,生成 25 个圆形图标,按 5 列蜂窝阵排列。honeycomb_demo_drag_event_cb(...):触摸拖拽回调,根据手指滑动偏移量更新图标位置。honeycomb_demo_refresh_layout():刷新图标布局,根据图标到屏幕中心的距离计算缩放比例,越靠近中心图标越大。honeycomb_demo_calculate_scale(distance):基于距离的二次方衰减计算图标缩放值,实现鱼眼放大效果。
XiaozhiAI(小智 AI)是一个基于 ESP32 开发板的开源 AI 语音聊天机器人项目,旨在将大语言模型(LLM)的通用智能赋予边缘设备。它提供了一套软硬件结合的解决方案,支持全双工语音对话及 IoT 设备控制,致力于协助开发者低成本、快速地构建高定制度的实体 AI 智能体。
本文演示如何为微雪电子支持小智 AI 的 ESP32 开发板烧录固件,包括无开发环境烧录(直接烧录预编译固件)和有开发环境烧录(从源码编译并烧录)两种方式。
本文以 ESP32-S3-Touch-AMOLED-1.8 开发板为例进行演示,若使用其他开发板,操作步骤类似。
请先确认你的硬件在 小智 AI 适配产品列表 中。

访问 小智 GitHub 下载对应设备的固件文件,点击 Assets 展开全部文件列表:

参考 Flash 固件的烧录与擦除教程 完成固件烧录。
此仓库 汇总了微雪电子支持小智 AI 的 ESP32 开发板固件,所有固件均已在对应开发板上测试验证,方便用户集中查找和下载。固件版本更新可能略晚于小智官方仓库。
访问 微雪 GitHub 仓库,根据需求选择合适版本的固件进行下载:

参考 Flash 固件的烧录与擦除教程 完成固件烧录。
访问 XiaoZhi AI Chatbot 仓库下载完整工程代码:

参考 ESP-IDF 环境搭建教程 完成开发环境的配置。
点击 选择目标设备,根据您的开发板选择对应的芯片型号(如
esp32s3):

设置目标设备时,ESP-IDF 会自动配置相应的工具链和库,此过程可能需要一些时间,请耐心等待。更多详情请参阅 官方文档。
点击 打开 ESP-IDF 终端,执行
idf.py menuconfig 命令进入配置界面,选择 Xiaozhi Assistant:

选择 Board Type 进入开发板类型选择:

选择与您的开发板对应的产品型号:

按 S 键保存配置并退出,然后点击 一键构建、烧录和监视图标,自动完成编译、烧录和串口监视。
使用手机或电脑连接设备的 WiFi 热点:Xiaozhi-xxxxxx。连接成功后通常会自动跳转到配置页面,若未自动跳转,请手动在浏览器中访问 http://192.168.4.1。
在网络配置页面选择要连接的 WiFi 名称(仅支持 2.4G 频段;若要连接 iPhone 热点,需在手机系统设置中开启最大兼容性),SSID 将自动填入,输入密码后点击 Connect 开始连接:

确保设备已成功连接到互联网,此时设备会播报 6 位设备验证码(可重复唤醒设备再次播报)。
访问 小智 AI 控制面板,如未注册请先完成账号注册并登录:


输入 6 位验证码后,设备将自动激活并显示在设备管理页面,即可正常使用。


说出唤醒词 "你好,小智" 即可唤醒设备,开始语音对话。
ESP32-S3-Touch-AMOLED-1.8 按键说明: