Skip to main content

XIAO ESP32S3(sense) 与 Zephyr(RTOS)

本wiki介绍了Seeed Studio XIAO ESP32S3Zephyr的支持。通过本指南的帮助,您将能够利用该开发板的可用功能集。

什么是Zephyr

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

对于每个支持的设备,Zephyr都有一个设备树文件来描述开发板及其功能。Xiao ESP32S3 Zephyr开发板页面描述了当前可用的支持功能,这些功能由开发板的dts文件定义。

参考:Zephyr项目

入门指南

使用Zephyr的第一步是为本地开发设置SDK和工具链。应参考Zephyr入门指南了解您的环境所需的相关设置程序。

一旦Zephyr工具链设置完成并下载了相关的SDK,您就可以开始应用程序开发。

对于Xiao ESP32S3,可以参考开发板描述文件获取进一步的设置信息。

要获取使用ESP32S3所需的blob文件,请运行以下命令:

west blobs fetch hal_espressif

之后可以构建示例并将其烧录到开发板。

最简单的示例是在开发板上运行"Hello World"示例。切换到Zephyr安装目录后,运行以下命令。

west build -p always -b xiao_esp32s3 samples/hello_world
west flash
west espressif monitor

使用最后一个命令,您应该看到显示"Hello World!"问候语的响应。

*** Booting Zephyr OS build v3.6.0-1155-g1a55caf8263e ***
Hello World! xiao_esp32s3

为了协助在Xiao及其扩展板上使用Zephyr的过程,我们构建了一个包含此处使用的多个覆盖层和配置的仓库。本wiki文章中包含的命令假设它位于相对于zephyr根目录的../applications/xiao-zephyr-examples位置。可以通过更新下面的命令为其提供替代路径。

git clone https://github.com/Cosmic-Bee/xiao-zephyr-examples

硬件准备

Seeed Studio XIAO ESP32S3 SenseSeeed Studio 扩展板

开发者知识

XIAO 扩展板

为了在 Seeed Studio XIAO ESP32S3 上使用 Grove 模块,我们将使用 Seeed Studio XIAO 扩展底板 并将 XIAO ESP32S3 连接到上面。

之后,板上的 Grove 连接器可用于连接 Grove 模块

引脚定义

当将 Grove 模块连接到 Seeed Studio XIAO 的 Grove 扩展板上的 Grove 连接器时,您需要按照下图使用相应的内部引脚编号。

主要功能

  • 蓝牙
  • Wi-Fi
  • TFLite

蓝牙

为了测试此设置,我们可以使用 Zephyr 的现有示例:

west build -p always -b xiao_esp32s3 samples/bluetooth/observer
west flash
west espressif monitor

您将看到一个可用于向板发送命令的控制台:

*** Booting Zephyr OS build v3.6.0-1155-g1a55caf8263e ***
Starting Observer Demo
Started scanning...
Exiting main thread.
Device found: EC:11:27:22:AF:D2 (public) (RSSI -77), type 0, AD data len 31
Device found: 02:96:58:9A:B4:64 (random) (RSSI -78), type 3, AD data len 31
Device found: 66:A5:E1:CF:8C:35 (random) (RSSI -58), type 0, AD data len 17
Device found: 62:09:50:DB:85:D0 (random) (RSSI -92), type 0, AD data len 14
Device found: C4:5A:95:A7:96:7D (random) (RSSI -78), type 0, AD data len 20
Device found: E5:44:60:88:DB:99 (random) (RSSI -82), type 0, AD data len 27
Device found: 66:18:ED:DD:74:1C (random) (RSSI -71), type 0, AD data len 17
Device found: 37:D2:FC:F8:FA:B8 (random) (RSSI -75), type 3, AD data len 31
Device found: 40:B8:84:E5:5F:A4 (random) (RSSI -70), type 2, AD data len 28
Device found: 44:EB:7C:AA:89:0B (random) (RSSI -83), type 0, AD data len 18
Device found: 71:AC:4A:98:5E:73 (random) (RSSI -72), type 2, AD data len 4
Device found: 60:D9:62:70:EF:4C (random) (RSSI -95), type 2, AD data len 4
Device found: D8:7D:FC:AE:37:F0 (random) (RSSI -67), type 3, AD data len 8
Device found: 48:1F:C0:29:77:C2 (random) (RSSI -73), type 2, AD data len 4
Device found: 46:B7:35:F5:D7:BE (random) (RSSI -86), type 3, AD data len 17
Device found: E5:4A:F1:1C:3C:39 (random) (RSSI -88), type 3, AD data len 8
CONFIG_BT=y
CONFIG_BT_OBSERVER=y

这里的配置文件为 Zephyr 构建启用了蓝牙相关功能。

Wi-Fi

为了测试此设置,我们可以使用 Zephyr 的现有示例:

west build -p always -b xiao_esp32s3 samples/net/wifi
west flash
west espressif monitor

您将看到一个可用于向板发送命令的控制台:

*** Booting Zephyr OS build v3.6.0-1155-g1a55caf8263e ***
uart:~$

存在多个命令允许您查看和连接到本地网络,更多信息请参见示例说明文档

uart:~$ wifi scan
Scan requested

Num | SSID (len) | Chan (Band) | RSSI | Security | BSSID | MFP
1 | Zephytopia 10 | 6 (2.4GHz) | -42 | WPA2-PSK | | Disable
2 | Maceronia 9 | 6 (2.4GHz) | -43 | WPA2-PSK | | Disable

让我们深入了解这个示例,看看它为什么有效:

&wifi {
status = "okay";
};

应用程序覆盖文件用于设置各种板组件。使用此文件,示例可以被利用,因为覆盖文件通知示例逻辑启用 Wi-Fi。

CONFIG_WIFI=y

CONFIG_NETWORKING=y
CONFIG_NET_L2_ETHERNET=y

CONFIG_NET_IPV6=n
CONFIG_NET_IPV4=y
CONFIG_NET_DHCPV4=y
CONFIG_ESP32_WIFI_STA_AUTO_DHCPV4=y

CONFIG_NET_LOG=y

这里的配置文件为 Zephyr 构建启用了多个网络相关功能。

TFLite - Hello World

使用 Zephyr 启用 TFLite 并更新:

west config manifest.project-filter -- +tflite-micro
west update

构建示例并烧录到您的板:

west build -p always -b xiao_esp32s3 samples/modules/tflite-micro/hello_world
west flash
west espressif monitor

您将看到从控制台返回的结果:

*** Booting Zephyr OS build v3.6.0-1155-g1a55caf8263e ***
x_value: 1.0*2^-127, y_value: 1.0*2^-127

x_value: 1.2566366*2^-2, y_value: 1.4910772*2^-2

x_value: 1.2566366*2^-1, y_value: 1.1183078*2^-1

x_value: 1.8849551*2^-1, y_value: 1.677462*2^-1

x_value: 1.2566366*2^0, y_value: 1.9316229*2^-1

x_value: 1.5707957*2^0, y_value: 1.0420598*2^0

x_value: 1.8849551*2^0, y_value: 1.9146791*2^-1

x_value: 1.0995567*2^1, y_value: 1.6435742*2^-1

x_value: 1.2566366*2^1, y_value: 1.0674761*2^-1

x_value: 1.4137159*2^1, y_value: 1.8977352*2^-3

关于 TFLite 的其他信息超出了本指南的范围,但该示例可以作为设备功能和运行 TFLite 设置所需组件的指南。

其他组件

Grove - 扩展板 - I2C 显示屏

要测试此设置,我们可以使用 Zephyr 的现有示例:

west build -p always -b xiao_esp32s3 samples/drivers/display --  -DSHIELD=seeed_xiao_expansion_board
west flash

您将看到显示屏显示多个黑色方框和角落中的闪烁方框,因为此显示屏仅支持两种颜色。

让我们深入了解这个示例,看看它为什么有效:

/ {
chosen {
zephyr,display = &ssd1306;
};
};

&xiao_i2c {
status = "okay";

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

该屏蔽层在 0x3C 寄存器处设置了一个 SSD1306 OLED 屏幕。它在 chosen 部分被选为 zephyr 显示屏。

Grove - 扩展板 - 按钮

要测试此设置,我们可以使用 Zephyr 的现有示例:

west build -p always -b xiao_esp32s3 samples/basic/button -- -DSHIELD=seeed_xiao_expansion_board
west flash
west espressif monitor

在示例中按下按钮将触发板载 LED 点亮。

您将从控制台看到返回的结果:

*** Booting Zephyr OS build v3.6.0-1155-g1a55caf8263e ***
Set up button at gpio@60004000 pin 2
Set up LED at gpio@60004000 pin 21
Press the button
Button pressed at 842621292
Button pressed at 1164489270
Button pressed at 1329015357
Button pressed at 1577684271
Button pressed at 1728636675
Button pressed at 1728755988
Button pressed at 1822426500

让我们深入了解这个示例,看看它为什么有效:

/ {
aliases {
sw0 = &xiao_button0;
};

buttons {
compatible = "gpio-keys";
xiao_button0: button_0 {
gpios = <&xiao_d 1 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
label = "SW0";
zephyr,code = <INPUT_KEY_0>;
};
};
};

屏蔽层/覆盖文件用于设置各种板组件。使用此文件,按钮示例可以被利用,因为覆盖允许 Zephyr 配置按钮并使其可用于相关代码。

在这种情况下是 Xiao ESP32S3 上的 D1。它在此覆盖中设置为充当按钮,并别名为 sw0 名称,以允许它用于具有期望此功能的代码的示例。

Grove - 扩展板 - 蜂鸣器

我们将使用闪烁 PWM 示例激活蜂鸣器,通过 PWM 信号控制其激活。为此,我们将使用自定义覆盖,该覆盖为 A3 引脚启用 PWM。

cd ~/zephyrproject/zephyr
west build -p always -b xiao_esp32s3 samples/basic/blinky_pwm -- -DDTC_OVERLAY_FILE="$(dirname $(pwd))/applications/xiao-zephyr-examples/xiao-esp32s3/xiao_expansion_buzzer.overlay"

刷写后,您应该开始听到一系列蜂鸣声,随着示例运行过程中声音会发生变化。

让我们看看这为什么有效:

#include <zephyr/dt-bindings/pwm/pwm.h>

/ {
aliases {
pwm-0 = &ledc0;
pwm-led0 = &pwm_buzzer;
};

pwmleds {
compatible = "pwm-leds";
pwm_buzzer: pwm_led_gpio0_4 {
label = "PWM Buzzer";
pwms = <&ledc0 0 1000 PWM_POLARITY_NORMAL>;
};
};
};

&pinctrl {
ledc0_default: ledc0_default {
group1 {
pinmux = <LEDC_CH0_GPIO4>;
output-enable;
};
};
};

&ledc0 {
pinctrl-0 = <&ledc0_default>;
pinctrl-names = "default";
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
channel0@0 {
reg = <0x0>;
timer = <0>;
};
};

覆盖为引脚 4 配置 PWM 逻辑,该引脚对应于 ESP32S3 引脚图中的 A3 引脚。

Grove - 扩展板 - SD 卡

我们将在这里使用文件系统示例以及 Xiao 扩展板屏蔽层来尝试通过 SPI 与 SD 卡读卡器接口。扩展板屏蔽层为相关的 &xiao_d 2 引脚配置了 CS 引脚,因此您无需为将此功能与板关联而做任何工作,除了添加屏蔽层。为了进一步准备,我们使用启用 SD 卡功能的自定义配置。

cd ~/zephyrproject/zephyr
west build -p always -b xiao_esp32s3 samples/subsys/fs/fs_sample -- -DEXTRA_CONF_FILE="$(dirname $(pwd))/applications/xiao-zephyr-examples/xiao_expansion_sd.conf" -DSHIELD=seeed_xiao_expansion_board

现在刷写并监控:

west flash
west espressif monitor

您应该看到类似于此的响应:

*** Booting Zephyr OS build v3.6.0-2566-gc9b45bf4672a ***
[00:00:00.208,000] <inf> sd: Maximum SD clock is under 25MHz, using clock of 24000000Hz
[00:00:00.208,000] <inf> main: Block count 15519744
Sector size 512
Memory Size(MB) 7578
Disk mounted.
Listing dir /SD: ...
[FILE] IMAGE1.JPG (size = 58422)
[FILE] IMAGE2.JPG (size = 97963)

在这种情况下,我的SD卡有两个文件。它们的名称和大小被输出到我的控制台。

让我们看看这里涉及的相关元素:

CONFIG_SPI=y
CONFIG_DISK_DRIVER_SDMMC=y
CONFIG_GPIO=y

在相关配置中,我们启用了SPI、SDMMC磁盘驱动程序和GPIO。如果没有这个配置,覆盖层将导致错误,因为示例无法找到SD卡。

Xiao扩展板屏蔽的相关部分如下所示:

&xiao_spi {
status = "okay";
cs-gpios = <&xiao_d 2 GPIO_ACTIVE_LOW>;

sdhc0: sdhc@0 {
compatible = "zephyr,sdhc-spi-slot";
reg = <0>;
status = "okay";
mmc {
compatible = "zephyr,sdmmc-disk";
status = "okay";
};
spi-max-frequency = <24000000>;
};
};

如前所述,&xiao_d 2引脚映射用于允许选择D2引脚,无论使用什么板子,只要它支持&xiao_d引脚设置。

Grove - 温湿度传感器 (SHT31)

首先焊接引脚并将您的Xiao ESP32S3连接到扩展板。然后在Grove SHT31和扩展板上的I2C端口之一之间连接grove连接器电缆。

要测试这个设置,我们可以使用Zephyr的现有示例:

west build -p always -b xiao_esp32s3 samples/sensor/sht3xd -- -DDTC_OVERLAY_FILE=$(dirname $(pwd))/applications/xiao-zephyr-examples/sht31.overlay
west flash
west espressif monitor

您将看到从控制台返回的结果:

*** Booting Zephyr OS build v3.6.0-1155-g1a55caf8263e ***
SHT3XD: 25.54 Cel ; 53.39 %RH
SHT3XD: 25.58 Cel ; 53.42 %RH
SHT3XD: 25.60 Cel ; 53.57 %RH
SHT3XD: 25.68 Cel ; 53.71 %RH
SHT3XD: 25.68 Cel ; 53.72 %RH
SHT3XD: 25.71 Cel ; 53.67 %RH
SHT3XD: 25.75 Cel ; 53.60 %RH
SHT3XD: 25.76 Cel ; 53.48 %RH
SHT3XD: 25.82 Cel ; 53.31 %RH
SHT3XD: 25.84 Cel ; 53.16 %RH

让我们深入了解这个示例,看看它为什么有效:

 &xiao_i2c {
sht3xd@44 {
compatible = "sensirion,sht3xd";
reg = <0x44>;
};
};

应用覆盖文件用于设置各种板组件。使用此文件,SHT31示例可以被利用,因为覆盖层告诉示例逻辑如何为我们的板配置传感器。

1.69英寸LCD显示模块,240×280分辨率,SPI接口

对于这个示例,我们将使用SPI连接到一个240x280分辨率的1.69英寸LCD。

首先使用以下图像作为指南将您的板连接到LCD屏幕(在这种情况下我们使用Xiao ESP32S3,但这里连接使用相同的引脚布局)。

1.69英寸LCD SPI显示屏XIAO ESP32S3
VCC3V3
GNDGND
DIND10
CLKD8
CSD1
DCD3
RSTD0
BLD6

我们现在可以构建和刷写固件:

cd ~/zephyrproject/zephyr
west build -p always -b xiao_esp32s3 samples/drivers/display -- -DDTC_OVERLAY_FILE=$(dirname $(pwd))/applications/xiao-zephyr-examples/240x280_st7789v2.overlay -DEXTRA_CONF_FILE=$(dirname $(pwd))/applications/xiao-zephyr-examples/240x280_st7789v2.conf
west flash

有了新固件,设备现在显示我们之前在扩展板上看到的相同演示屏幕,只是现在更新为通过SPI的彩色LCD。

Xiao圆形显示屏

要测试这个设置,我们可以使用Zephyr的现有示例:

west build -p always -b xiao_esp32s3 samples/drivers/display --  -DSHIELD=seeed_xiao_round_display

进入引导加载程序模式并刷写您的设备:

west flash

您将看到一个显示多个彩色角落的显示屏,其中一个黑色角落在闪烁。

另一个示例演示了触摸屏的使用:

west build -p always -b xiao_esp32s3 samples/modules/lvgl/demos --  -DSHIELD=seeed_xiao_round_display -DCONFIG_LV_Z_DEMO_MUSIC=y

这里显示的音乐演示只是实际屏幕的一部分,但仍然演示了触摸屏的操作。如您所见,触摸播放按钮会打开音乐动画。

您可以从屏蔽文件看到,这通过SPI与GC9A01圆形显示驱动程序接口,并通过i2c与CHSC6X触摸模块接口来工作。

让我们深入了解这个示例,看看它是如何工作的:

/ {
chosen {
zephyr,display = &gc9a01_xiao_round_display;
};

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

/*
* xiao_serial uses pins D6 and D7 of the Xiao, which are used respectively to
* control the screen backlight and as touch controller interrupt.
*/
&xiao_serial {
status = "disabled";
};

&xiao_i2c {
clock-frequency = < I2C_BITRATE_FAST >;

chsc6x_xiao_round_display: chsc6x@2e {
status = "okay";
compatible = "chipsemi,chsc6x";
reg = <0x2e>;
irq-gpios = <&xiao_d 7 GPIO_ACTIVE_LOW>;
};
};

&xiao_spi {
status = "okay";
cs-gpios = <&xiao_d 1 GPIO_ACTIVE_LOW>, <&xiao_d 2 GPIO_ACTIVE_LOW>;

gc9a01_xiao_round_display: gc9a01@0 {
status = "okay";
compatible = "galaxycore,gc9x01x";
reg = <0>;
spi-max-frequency = <DT_FREQ_M(100)>;
cmd-data-gpios = <&xiao_d 3 GPIO_ACTIVE_HIGH>;
pixel-format = <PANEL_PIXEL_FORMAT_RGB_565>;
width = <240>;
height = <240>;
display-inversion;
};
};

这个扩展板执行以下功能:

  • 选择 GC9A01 显示屏作为所选的 Zephyr 显示器
  • 设置 LVGL 指针逻辑使用 CHSC6X 模块
  • 禁用串口,因为引脚用于背光和触摸中断(如上所示:irq-gpios = <&xiao_d 7 GPIO_ACTIVE_LOW>;
  • 配置圆形显示屏使用 D1、D2 和 D3 引脚进行 SPI 通信

示例逻辑 依赖于 LVGL 演示示例代码,可以进一步研究。

✨ 贡献者项目

技术支持与产品讨论

感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您使用我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...