Skip to main content

XIAO ESP32-C5 与 Zephyr(RTOS)

Zephyr 操作系统基于一个小体积内核设计,用于资源受限和嵌入式系统:从简单的嵌入式环境传感器和 LED 可穿戴设备,到复杂的嵌入式控制器、智能手表和物联网无线应用。

入门指南

硬件准备

请准备一块 XIAO ESP32-C5 开发板,以支持后续的验证和相关工作。

Seeed Studio XIAO ESP32-C5

软件准备

本文基于 Ubuntu 24.04 LTS 进行开发和验证。请参考相关文档,在 Ubuntu、Mac 和 Windows 上部署开发环境。Zephyr 入门指南

tip

官方推荐使用 Ubuntu 24.04 LTS 及更高版本,这可以有效避免由环境依赖问题带来的麻烦,节省你的时间。

  1. 激活虚拟环境。

创建一个新的虚拟环境:

python3 -m venv ~/zephyrproject/.venv

激活虚拟环境:

source ~/zephyrproject/.venv/bin/activate
  1. 打开 blinky 文件夹。
cd ~/zephyrproject/zephyr/samples/basic/blinky
  1. 更新 overlay 文件和 prj.conf 文件。

默认串口日志输出映射到 GPIO11 和 GPIO12,对应 XIAO ESP32‑C5 上的 D6 和 D7。 若要使用 USB Serial/JTAG 进行日志输出,需要将串口引脚重新映射到 USB Serial/JTAG 对应的引脚。同时,根据 XIAO ESP32‑C5 的硬件设计,还必须将用户 LED 引脚配置为 GPIO27。

tip

如果你不熟悉 XIAO ESP32-C5 的引脚分布,可以查看 Pinlist

创建一个新的 overlay 文件

nano ~/zephyrproject/zephyr/samples/basic/blinky/boards/esp32c5_devkitc_esp32c5_hpcore.overlay

添加 overlay 内容

/ {
chosen {
zephyr,console = &usb_serial;
zephyr,shell-uart = &usb_serial;
};

aliases {
led0 = &led0;
};

leds {
compatible = "gpio-leds";
led0: led_0 {
gpios = <&gpio0 27 GPIO_ACTIVE_HIGH>;
label = "LED0";
};
};
};

&usb_serial {
status = "okay";
};

添加完成后,按 Ctrl + O 保存文件,然后按 Ctrl + X 退出。

修改 prj.conf 的内容

nano ~/zephyrproject/zephyr/samples/basic/blinky/boards/prj.conf

将内容修改为如下所示,主要是调整 UART 的映射关系。

CONFIG_USB_DEVICE_STACK=y
CONFIG_USB_CDC_ACM=y
CONFIG_UART_LINE_CTRL=y
CONFIG_GPIO=y
CONFIG_LOG=y
  1. 将目标开发板设置为 esp32c5_devkitc 并开始编译。
tip

hpcore 代表 High Performance Core(高性能内核)。它通常用于运行主程序和对性能要求较高的任务。

west  build -p always -b esp32c5_devkitc/esp32c5/hpcore ~/zephyrproject/zephyr/samples/basic/blinky

编译成功现象

  1. 烧录设备
tip

在将程序烧录到设备之前,必须先将 XIAO ESP32-C5 设置为 Bootloader 下载模式。

方法: 按住 BOOT 按钮,然后给设备上电。

检查串口设备。设备通常为 /dev/ttyACM0

ls /dev/ttyACM*

由于串口设备文件存在访问权限限制,需要修改其权限以支持读写操作。

sudo chmod 666 /dev/ttyACM0

指定串口设备并开始下载。

west flash --esp-device /dev/ttyACM0

下载成功的示例输出

  1. 现象演示

下载成功后,LED 将开始闪烁。

打开串口,将打印 LED ON 或 LED OFF 的日志信息。

west espressif monitor --port /dev/ttyACM0

应用

XIAO ESP32-C5 支持使用兼容 XIAO 系列的扩展板,从而轻松扩展外设和应用场景。

使用 Expansion Board Base for XIAO

Expansion Board Base for XIAO 配备 IIC 接口和板载 0.96 英寸 OLED 屏幕。

硬件准备

Seeed Studio XIAO ESP32-C5Seeed Studio Expansion Board Base for XIAO with Grove OLED

软件准备

根据 XIAO ESP32-C5 的引脚定义,GPIO23 对应 SDA,即 D4;GPIO24 对应 SCL,即 D5。需要创建并修改设备树节点的内容。

  1. 打开显示示例。
cd ~/zephyrproject/zephyr/samples/drivers/display
  1. 添加 overlay 文件。
nano esp32c5_devkitc_esp32c5_hpcore.overlay

添加设备树节点内容。

#include <zephyr/dt-bindings/pinctrl/esp32c5-pinctrl.h>
#include <zephyr/dt-bindings/i2c/i2c.h>

&pinctrl {
i2c0_custom: i2c0_custom {
group1 {
pinmux = <I2C0_SDA_GPIO23>,
<I2C0_SCL_GPIO24>;
bias-pull-up;
drive-open-drain;
output-high;
};
};
};

&i2c0 {
status = "okay";
clock-frequency = <I2C_BITRATE_FAST>;
pinctrl-0 = <&i2c0_custom>;
pinctrl-names = "default";

ssd1306_128x64: ssd1306@3c {
compatible = "solomon,ssd1306";
reg = <0x3c>;
width = <128>;
height = <64>;
segment-offset = <0>;
page-offset = <0>;
display-offset = <0>;
multiplex-ratio = <63>;
segment-remap;
com-invdir;
prechargep = <0x22>;
};
};

/ {
chosen {
zephyr,display = &ssd1306_128x64;
};
};
  1. 编译并烧录
west build -p always -b esp32c5_devkitc/esp32c5/hpcore   ~/zephyrproject/zephyr/samples/drivers/display

sudo chmod 666 /dev/ttyACM0

west flash

结果

Expansion Board Base for XIAO 将显示屏幕效果。

使用 Round Display for Seeed Studio XIAO

Round Display for Seeed Studio XIAO 是一款专为 XIAO 系列设计的圆形显示屏,板载 GC9A01 驱动芯片,并采用标准 SPI 通信协议。

硬件准备

Seeed Studio XIAO ESP32-C5Round Display for Seeed Studio XIAO

软件准备

  1. 打开显示示例。
cd ~/zephyrproject/zephyr/samples/drivers/display
  1. 添加 overlay 文件。
nano esp32c5_devkitc_esp32c5_hpcore.overlay

添加设备树节点内容。

esp32c5_devkitc_esp32c5_hpcore.overlay
/*
* Copyright (c) 2026
* SPDX-License-Identifier: Apache-2.0
*
* Standalone overlay for GC9A01 round display on XIAO ESP32-C5.
* Does not depend on seeed_xiao_round_display shield.
*
* Pin mapping (XIAO ESP32-C5):
* D1 = GPIO0 -> display CS (active low)
* D2 = GPIO25 -> SD card CS (active low)
* D3 = GPIO7 -> display DC (active high)
* D4 = GPIO23 -> SDA
* D5 = GPIO24 -> SCL
* D6 = GPIO11 -> TX (disabled, reused for backlight control)
* D7 = GPIO12 -> touch IRQ (active low)
* D8 = GPIO8 -> SCK
* D9 = GPIO9 -> MISO
* D10 = GPIO10 -> MOSI
*/

#include <freq.h>
#include <zephyr/dt-bindings/pinctrl/esp32c5-pinctrl.h>
#include <zephyr/dt-bindings/display/panel.h>

/ {
chosen {
zephyr,display = &gc9a01_round_display;
zephyr,touch = &chsc6x_round_display;
};

lvgl_pointer {
compatible = "zephyr,lvgl-pointer-input";
input = <&chsc6x_round_display>;
};

vbatt {
compatible = "voltage-divider";
io-channels = <&adc0 0>;
output-ohms = <470000>;
full-ohms = <940000>;
};

aliases {
rtc = &pcf8563_round_display;
};
};

&pinctrl {
/* I2C0: SDA = GPIO23 (D4), SCL = GPIO24 (D5) */
i2c0_custom: i2c0_custom {
group1 {
pinmux = <I2C0_SDA_GPIO23>,
<I2C0_SCL_GPIO24>;
bias-pull-up;
drive-open-drain;
output-high;
};
};

/* SPI2: SCK = GPIO8 (D8), MISO = GPIO9 (D9), MOSI = GPIO10 (D10) */
spim2_custom: spim2_custom {
group1 {
pinmux = <SPIM2_MISO_GPIO9>,
<SPIM2_SCLK_GPIO8>;
};
group2 {
pinmux = <SPIM2_MOSI_GPIO10>;
output-low;
};
};
};

/* D6 = GPIO11 reused for backlight, disable UART TX */
&uart0 {
status = "disabled";
};

&adc0 {
status = "okay";
};

&i2c0 {
status = "okay";
clock-frequency = <I2C_BITRATE_FAST>;
pinctrl-0 = <&i2c0_custom>;
pinctrl-names = "default";

/* RTC, address 0x51 */
pcf8563_round_display: pcf8563@51 {
status = "okay";
compatible = "nxp,pcf8563";
reg = <0x51>;
};

/* Touch controller, IRQ = GPIO12 (D7) */
chsc6x_round_display: chsc6x@2e {
status = "okay";
compatible = "chipsemi,chsc6x";
reg = <0x2e>;
irq-gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
screen-width = <240>;
screen-height = <240>;
};
};

&spi2 {
status = "okay";
pinctrl-0 = <&spim2_custom>;
pinctrl-names = "default";
/* D1 = GPIO0 -> display CS
* D2 = GPIO25 -> SD card CS */
cs-gpios = <&gpio0 0 GPIO_ACTIVE_LOW>,
<&gpio0 25 GPIO_ACTIVE_LOW>;

/* MIPI DBI SPI wrapper for GC9A01, DC = GPIO7 (D3) */
round_display_mipi_dbi: mipi_dbi {
compatible = "zephyr,mipi-dbi-spi";
spi-dev = <&spi2>;
dc-gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;
write-only;
#address-cells = <1>;
#size-cells = <0>;

gc9a01_round_display: gc9a01@0 {
status = "okay";
compatible = "galaxycore,gc9x01x";
reg = <0>;
mipi-max-frequency = <DT_FREQ_M(100)>;
pixel-format = <PANEL_PIXEL_FORMAT_RGB_565>;
width = <240>;
height = <240>;
display-inversion;
};
};

/* SD card slot, CS = GPIO25 (D2) */
sdhc_round_display: sdhc@1 {
compatible = "zephyr,sdhc-spi-slot";
reg = <1>;
status = "okay";
spi-max-frequency = <DT_FREQ_M(24)>;
mmc {
compatible = "zephyr,sdmmc-disk";
disk-name = "SD";
status = "okay";
};
};
};
  1. 编译并烧录
west build -p always -b esp32c5_devkitc/esp32c5/hpcore   ~/zephyrproject/zephyr/samples/drivers/display

sudo chmod 666 /dev/ttyACM0

west flash

结果

在烧录固件后,按下按键,屏幕内容将显示在 Round Display for Seeed Studio XIAO 上。

总结

相信此时你已经基本掌握了在 XIAO ESP32-C5 上进行 Zephyr 开发。如果你有任何创意想法,欢迎自由开发你的项目并与社区分享,让更多人看到你的优秀作品。

技术支持与产品讨论

感谢你选择我们的产品!我们将为你提供多种支持,以确保你在使用我们产品的过程中尽可能顺利。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...