Skip to main content

XIAO RP2040 与 Zephyr(RTOS)

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

什么是Zephyr​

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

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

参考:Zephyr项目

入门指南​

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

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

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

要对Xiao RP2040进行编程,可以采取以下步骤:

  1. 构建一个示例或您的应用程序
  2. 插入Xiao RP2040
  3. 按住标记为B(启动)的按钮并按下R(复位),这将把设备挂载为大容量存储设备
  4. 运行flash命令来刷写设备 west flash -r uf2

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

west build -p always -b xiao_rp2040 samples/subsys/usb/console

按照之前描述的方法进入引导加载程序模式,然后刷写设备:

west flash -r uf2

设备接收到文件后将重置,您的机器现在应该通过USB进行串行连接。

找到您设备的端口,例如在Ubuntu上输入ls /dev/tty*,并确认插入USB时出现的设备。

在我的示例中,我看到/dev/ttyACM0作为新添加的设备。

使用screen,您可以连接并监控串行响应:

screen /dev/ttyACM0 115200

你应该看到类似以下的响应:

*** Booting Zephyr OS build v3.6.0-2212-gc38ea288eee9 ***
Hello World! arm
Hello World! arm
Hello World! arm

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

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

硬件准备​

Seeed Studio XIAO RP2040Seeed Studio 扩展板

开发者知识​

XIAO 扩展板​

为了在 Seeed Studio XIAO RP2040 上使用 Grove 模块,我们将使用 Seeed Studio Expansion Base for XIAO 并将 XIAO RP2040 连接到其上。

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

引脚定义​

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

主要功能​

  • WS2812 LED
  • LED PWM
  • 时钟
  • TFLite

WS2812 LED​

在此示例中,Xiao RP2040 利用其板载 LED 并持续闪烁红色、绿色和蓝色。

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

cd ~/zephyrproject/zephyr
west build -p always -b xiao_rp2040 samples/drivers/led_strip

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

west flash -r uf2

您将看到板载的 WS2812 LED 持续以闪烁模式循环显示红色、蓝色和绿色。

让我们深入了解这个示例,看看它为什么能够工作:


/ {
aliases {
led-strip = &ws2812;
};
}
&gpio0 {
status = "okay";
neopixel-power-enable {
gpio-hog;
gpios = <11 GPIO_ACTIVE_HIGH>;
output-high;
};
};
&pio0 {
status = "okay";

pio-ws2812 {
compatible = "worldsemi,ws2812-rpi_pico-pio";
status = "okay";
pinctrl-0 = <&ws2812_pio0_default>;
pinctrl-names = "default";
bit-waveform = <3>, <3>, <4>;

ws2812: ws2812 {
status = "okay";
gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
chain-length = <1>;
color-mapping = <LED_COLOR_ID_GREEN
LED_COLOR_ID_RED
LED_COLOR_ID_BLUE>;
reset-delay = <280>;
frequency = <800000>;
};
};
};

设备树的这些元素显示了板载 WS2812 及其使用方式。由于 WS2812 的 VCC 线连接到 RP2040 的引脚 11,设备树利用 gpio-hog 功能允许通过环境变量启用 LED。在这种情况下,引脚 12 是为 WS2812 数据线设置的,因此在启用 CONFIG_GPIO_HOGS 环境变量的情况下,LED 灯带能够用于示例。

这之所以有效,部分原因是示例在其 boards 目录中有一个 xiao_rp2040.conf 文件,因此它将该配置与板子的配置合并并启用它。

CONFIG_GPIO=y
CONFIG_GPIO_HOGS=y

如果您希望使用板载的 WS2812,建议启用此变量以允许其获得电源。

LED PWM​

在这个示例中,我们将演示 Xiao RP2040 的 PWM 功能。为此,我们将使用板载蓝色 LED 并使用 PWM 使其持续淡入淡出。

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

cd ~/zephyrproject/zephyr
west build -p always -b xiao_rp2040 samples/basic/fade_led

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

west flash -r uf2

您将看到板载RGB LED的蓝光缓慢淡出,然后重复这个过程。

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

&pwm {
status = "okay";
divider-int-4 = <255>;
};

这段在示例的 boards/xiao_rp2040.overlay 中的逻辑启用了设备树中通常被禁用的 PWM 功能。Xiao RP2040 设置将板载蓝色 RGB LED 设置为默认 PWM。

从 zephyr 板文件中的 xiao_rp2040-pinctrl.dtsi 可以看到存在以下内容:

 pwm_ch4b_default: pwm_ch4b_default {
group1 {
pinmux = <PWM_4B_P25>;
};
};

在这种情况下,PWM 使用配置的设备树 pwm LED,它与引脚 25(蓝色 LED)相关联。PWM 引脚可以从 RP2040 文档 中参考。

时钟​

为此,我们将使用现有的示例和我们的控制台覆盖:

cd ~/zephyrproject/zephyr
west build -p always -b xiao_rp2040 samples/drivers/counter/alarm -- -DDTC_OVERLAY_FILE=$(dirname $(pwd))/applications/xiao-zephyr-examples/console.overlay -DEXTRA_CONF_FILE=$(dirname $(pwd))/applications/xiao-zephyr-examples/console.conf

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

west flash -r uf2

连接到显示器(在快速重置开发板以确保它重新启动后):

screen /dev/ttyACM0 115200

您将看到一系列定时器在设定的延迟后依次触发:

*** Booting Zephyr OS build v3.6.0-2212-gc38ea288eee9 ***
Counter alarm sample

Set alarm in 2 sec (2000000 ticks)
!!! Alarm !!!
Now: 2
Set alarm in 4 sec (4000000 ticks)
!!! Alarm !!!
Now: 6
Set alarm in 8 sec (8000000 ticks)
!!! Alarm !!!
Now: 14
Set alarm in 16 sec (16000000 ticks)
!!! Alarm !!!
Now: 30
Set alarm in 32 sec (32000000 ticks)

TFLite - Hello World​

使用 Zephyr 启用 TFLite 并更新:

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

在这个示例中,我们将使用示例 tflite "Hello World" 以及我们的控制台覆盖层和配置来通过 USB 串口读取响应。

cd ~/zephyrproject/zephyr
west build -p always -b xiao_rp2040 samples/modules/tflite-micro/hello_world -- -DDTC_OVERLAY_FILE=$(dirname $(pwd))/applications/xiao-zephyr-examples/console.overlay -DEXTRA_CONF_FILE=$(dirname $(pwd))/applications/xiao-zephyr-examples/console.conf

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

west flash -r uf2

Connect to monitor:

screen /dev/ttyACM0 115200

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

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

附加组件​

Grove - 扩展板 - I2C 显示屏​

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

cd ~/zephyrproject/zephyr
west build -p always -b xiao_rp2040 samples/drivers/display -- -DSHIELD=seeed_xiao_expansion_board

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

west flash -r uf2

您将看到一个显示多个黑色方块和角落中一个闪烁方块的显示,因为这个显示器只支持两种颜色。

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

/ {
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 的现有示例,我们将把它与 USB 控制台覆盖和配置一起使用。

cd ~/zephyrproject/zephyr
west build -p always -b xiao_rp2040 samples/basic/button -- -DDTC_OVERLAY_FILE="$(dirname $(pwd))/applications/xiao-zephyr-examples/console.overlay" -DEXTRA_CONF_FILE=$(dirname $(pwd))/applications/xiao-zephyr-examples/console.conf -DSHIELD=seeed_xiao_expansion_board

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

west flash -r uf2

Connect to monitor:

screen /dev/ttyACM0 115200

按下带有示例的按钮将触发板载LED点亮。

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

*** Booting Zephyr OS build v3.6.0-2212-gc38ea288eee9 ***
Set up button at gpio@40014000 pin 27
Set up LED at gpio@40014000 pin 25
Press the button
Button pressed at 1934761489
Button pressed at 2178879257
Button pressed at 3084766465
Button pressed at 3388674993

让我们深入探讨这个例子,看看为什么它能够起作用:

/ {
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 配置按钮并使其可用于相关代码。

在这种情况下,GPIO 27 对应于 Xiao RP2040 上的引脚 A1/D1。它在此覆盖中被设置为充当按钮,并被别名为 sw0 名称,以允许它用于具有期望此功能的代码的示例。

Grove - 扩展板 - 蜂鸣器​

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

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

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

west flash -r uf2

刷入 uf2 文件后,您应该开始听到一系列蜂鸣声,这些声音会随着示例程序的运行而发生变化。

让我们看看这是如何工作的:

/delete-node/ &pwm_led0;

/ {
aliases {
pwm-led = &pwm_led0;
};
};

&{/pwm_leds} {
status = "okay";
compatible = "pwm-leds";

pwm_led0: pwm_led0 {
status = "okay";
pwms = <&pwm 13 PWM_HZ(880) PWM_POLARITY_NORMAL>;
};
};

&pinctrl {
pwm_ch6b_default: pwm_ch6b_default {
group1 {
pinmux = <PWM_6B_P29>;
};
};
};

&pwm {
status = "okay";
pinctrl-0 = <&pwm_ch6b_default>;
divider-frac-6 = <15>;
divider-int-6 = <255>;
};

这里使用的覆盖层首先移除现有的 pwm_led0 节点,因为该开发板通过板载 LED 设置支持 PWM。然后它配置 A3 引脚用作 PWM。

我们在这里使用通道 6B 进行 PWM,因为 Xiao RP2040 上 A3 的关联引脚是引脚 29。有关更多信息/其他引脚的引脚映射,请参阅 RP2040 pinctrl 文档。

Grove - 扩展板 - SD 卡​

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

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

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

west flash -r uf2

Connect to monitor:

screen /dev/ttyACM0 115200
*** Booting Zephyr OS build v3.6.0-2566-gc9b45bf4672a ***
[00:00:00.201,000] <inf> sd: Maximum SD clock is under 25MHz, using clock of 24000000Hz
[00:00:00.202,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 RP2040 连接到扩展板。然后使用 grove 连接线将 Grove SHT31 与扩展板上的其中一个 I2C 端口连接。

为了测试这个设置,我们可以使用 Zephyr 的现有示例,我们将通过覆盖层和配置文件启用 USB 控制台支持。

cd ~/zephyrproject/zephyr
west build -p always -b xiao_rp2040 samples/sensor/sht3xd -- -DDTC_OVERLAY_FILE="$(dirname $(pwd))/applications/xiao-zephyr-examples/sht31.overlay $(dirname $(pwd))/applications/xiao-zephyr-examples/console.overlay" -DEXTRA_CONF_FILE=$(dirname $(pwd))/applications/xiao-zephyr-examples/console.conf

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

west flash -r uf2

Connect to monitor:

screen /dev/ttyACM0 115200

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

*** Booting Zephyr OS build v3.6.0-2212-gc38ea288eee9 ***
SHT3XD: 26.20 Cel ; 52.49 %RH
SHT3XD: 26.19 Cel ; 52.69 %RH
SHT3XD: 26.20 Cel ; 52.75 %RH
SHT3XD: 26.24 Cel ; 52.88 %RH
SHT3XD: 26.24 Cel ; 52.67 %RH
SHT3XD: 26.23 Cel ; 52.49 %RH
SHT3XD: 26.23 Cel ; 52.48 %RH
SHT3XD: 26.24 Cel ; 52.30 %RH

让我们深入探讨这个例子,看看为什么它能够起作用:

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

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

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

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

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

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

接下来在硬件准备好后,我们可以构建用于刷写的uf2文件:

cd ~/zephyrproject/zephyr
west build -p always -b xiao_rp2040 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 -r uf2

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

✨ 贡献者项目​

技术支持与产品讨论​

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

Loading Comments...