Skip to main content

XIAO ESP32S3(sense) 与 Zephyr(RTOS)

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

什么是Zephyr

Zephyr OS基于一个小占用空间的内核,专为资源受限和嵌入式系统而设计:从简单的嵌入式环境传感器和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

With the final command you should see the response showing the "Hello World!" greeting.

*** 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 Expansion Base for XIAO 并将 XIAO ESP32S3 连接到其上。

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

引脚定义

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

主要功能

  • 蓝牙
  • Wi-Fi
  • TFLite

蓝牙

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

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

You will see a console available for sending commands to the board:

*** 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

You will see a console available for sending commands to the board:

*** 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

conf 文件在这里为 Zephyr 构建启用了几个网络相关功能。

TFLite - Hello World

启用 TFLite 与 Zephyr 并更新:

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

Build the sample and flash to your board:

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

You will see results returned from the console:

*** 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

Let's dive into this example a bit to see why it works:

/ {
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 卡读卡器进行接口通信。扩展板护盾的 CS 引脚配置为关联的 &xiao_d 2 引脚,因此除了添加护盾外,您无需为将此功能与开发板关联而做任何工作。为了进一步准备,我们使用了启用 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

Now flash and monitor:

west flash
west espressif monitor

You should see a response similar to this:

*** 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 连接线将 Grove SHT31 连接到扩展板上的其中一个 I2C 端口。

要测试此设置,我们可以使用 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

You will see results returned from the console:

*** 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

Let's dive into this example a bit to see why it works:

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

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

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

在这个示例中,我们将使用SPI连接到一个1.69英寸、240x280分辨率的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

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

您可以从shield文件中看到,这是通过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...