Skip to main content

Seeed Studio XIAO RP2350 与 C/C++ SDK

介绍

Seeed Studio XIAO RP2350 配备 RP2350 微控制器,提供强大的性能,且体积小巧。本指南将提供设置和使用 C/C++ SDK 的基本步骤,帮助您在 XIAO RP2350 上开始开发。

前提条件

在开始之前,请确保您具备以下条件:

  • 一台运行 Windows、macOS 或 Linux 的计算机。
  • 一根用于将 XIAO RP2350 连接到计算机的 USB 电缆。
  • 基本的 C/C++ 编程知识。

通过 Vscode 安装指南

info

对于那些喜欢本地开发体验的用户,可以参考 Raspberry Pi Pico C/C++ SDK 文档Raspberry Pi Pico SDK | GitHub

为了获得更简单和更流畅的 SDK 编程体验,尤其适合新手,您可以为 Visual Studio Code (VSCode) 安装 Raspberry Pi Pico 扩展。

此扩展简化了设置过程,通过引导您完成必要的工具链安装,避免了手动单独安装每个工具。不过,您仍然需要确保您的系统符合平台要求:Windows x64、macOS(Sonoma 及更新版本)、Linux x64 或 arm64。

有关适合您操作系统的详细安装说明,请参考 Raspberry Pi Pico Extension for VSCode 页面。

步骤 1:安装扩展

在 VSCode 中安装扩展

步骤 2:创建新项目

页面加载后,您将看到所需的内容。

从示例中创建新项目

尝试通过 从示例创建新项目 创建一个项目。

步骤 3:配置您的项目

  • 名称: 通常这是示例项目的名称;在此,我们选择 blink 项目。
  • 板类型: Pico 2
  • 位置: 选择您希望存储 XIAO RP2350 项目的位置。
  • SDK 版本: 必须是 v2.0.0 或更高版本。
  • 调试器: 如果您计划使用 SWD 调试接口,请勾选 SWD 调试器选项以便以后启用调试。

如果这是您第一次运行设置,当您点击 创建 时,扩展会为您下载并管理 SDK。在 Windows 上,SDK 通常会放置在 %userprofile%\.pico-sdk 目录下。安装所需时间取决于您的互联网速度。完成后,将会打开一个新窗口,显示您的项目。

步骤 4:构建项目

注意

第一次设置项目时,您需要手动修改 CMake 项目中的板类型,因为扩展默认不包含 XIAO RP2350 板。将板类型设置为 seeed_xiao_rp2350,如下所示:

修改板类型后,请清理 build 文件夹,以确保使用 %userprofile%/.pico-sdk/sdk/2.0.0/src/boards/include/boards/seeed_xiao_rp2350.h 中的正确板配置。然后输入以下命令,在构建文件夹中生成 CMake 缓存:

cmake .. # 在 build 文件夹中执行

这将使扩展的编译任务正常工作。

现在您可以按 编译 按钮来构建项目。此操作将在 build 文件夹中生成 blink.uf2 文件,您可以将其拖放到计算机识别的 RP2350 驱动器中。

我们刚刚设置了开发环境,并成功使用 Raspberry Pi Pico 扩展创建了一个新项目。项目已准备就绪,工具也已配置好,您可以轻松地编译并在 XIAO RP2350 上运行您的代码,从而简化开发流程。

示例 1:LED 闪烁

为了演示基本的 SDK 使用方法,以下示例展示了如何编程控制板载 LED 闪烁:

blink.c
#include "pico/stdlib.h"

const int sleep_time = 250;

int main() {
const uint LED_PIN = PICO_DEFAULT_LED_PIN; // GPIO25
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
while (true) {
gpio_put(LED_PIN, 1);
sleep_ms(sleep_time);
gpio_put(LED_PIN, 0);
sleep_ms(sleep_time);
}
}

示例 2: RGB 闪烁

/**
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/

#include <stdio.h>
#include <stdlib.h>

#include "pico/stdlib.h"
#include "hardware/pio.h"
#include "hardware/clocks.h"
#include "ws2812.pio.h"

#define IS_RGBW true
#define NUM_PIXELS 1

#ifdef PICO_DEFAULT_WS2812_PIN
#define WS2812_PIN PICO_DEFAULT_WS2812_PIN
#else
// 如果板子没有默认的 WS2812 引脚定义,则默认为引脚 2
#define WS2812_PIN 22
#endif

static inline void put_pixel(uint32_t pixel_grb) {
pio_sm_put_blocking(pio0, 0, pixel_grb << 8u);
}

static inline uint32_t urgb_u32(uint8_t r, uint8_t g, uint8_t b) {
return
((uint32_t) (r) << 8) |
((uint32_t) (g) << 16) |
(uint32_t) (b);
}

void pattern_snakes(uint len, uint t) {
for (uint i = 0; i < len; ++i) {
uint x = (i + (t >> 1)) % 64;
if (x < 10)
put_pixel(urgb_u32(0xff, 0, 0));
else if (x >= 15 && x < 25)
put_pixel(urgb_u32(0, 0xff, 0));
else if (x >= 30 && x < 40)
put_pixel(urgb_u32(0, 0, 0xff));
else
put_pixel(0);
}
}

void pattern_random(uint len, uint t) {
if (t % 8)
return;
for (int i = 0; i < len; ++i)
put_pixel(rand());
}

void pattern_sparkle(uint len, uint t) {
if (t % 8)
return;
for (int i = 0; i < len; ++i)
put_pixel(rand() % 16 ? 0 : 0xffffffff);
}

void pattern_greys(uint len, uint t) {
int max = 100; // 为了不消耗过多电流!
t %= max;
for (int i = 0; i < len; ++i) {
put_pixel(t * 0x10101);
if (++t >= max) t = 0;
}
}

typedef void (*pattern)(uint len, uint t);
const struct {
pattern pat;
const char *name;
} pattern_table[] = {
{pattern_snakes, "蛇形!"},
{pattern_random, "随机数据"},
{pattern_sparkle, "闪光"},
{pattern_greys, "灰度"},
};

int main() {
//set_sys_clock_48();
stdio_init_all();

const int RGB_POWER = 23;
gpio_init(RGB_POWER);
gpio_set_dir(RGB_POWER, GPIO_OUT);
gpio_put(RGB_POWER, 1);

printf("WS2812 烟雾测试,使用引脚 %d", WS2812_PIN);

// todo 获取空闲的状态机
PIO pio = pio0;
int sm = 0;
uint offset = pio_add_program(pio, &ws2812_program);

ws2812_program_init(pio, sm, offset, WS2812_PIN, 800000, IS_RGBW);

int t = 0;
while (1) {
int pat = rand() % count_of(pattern_table);
int dir = (rand() >> 30) & 1 ? 1 : -1;
puts(pattern_table[pat].name);
puts(dir == 1 ? "(正向)" : "(反向)");
for (int i = 0; i < 1000; ++i) {
pattern_table[pat].pat(NUM_PIXELS, t);
sleep_ms(10);
t += dir;
}
}
}

示例 3: UART 打印

USB 串口

如果你想通过 USB 启用 printf 输出到计算机,你需要在项目的 CMakeLists.txt 文件中添加以下行:

pico_enable_stdio_usb(your_project_name 1)
CMake USB Enabled

另外,确保在你的代码中初始化标准 I/O,通过在主函数中添加stdio_init_all();

hello_uart.c
#include "hardware/uart.h"
#include "pico/stdlib.h"
#include <pico/stdio.h>
#include <pico/time.h>
#include <stdio.h>

#define UART_ID uart0
#define BAUD_RATE 115200

// 我们使用的是引脚 0 和 1,更多可用引脚请参见数据手册中的 GPIO 功能选择表
#define UART_TX_PIN 0
#define UART_RX_PIN 1

int main() {
stdio_init_all();
// 设置我们所需的波特率来初始化 UART
uart_init(UART_ID, BAUD_RATE);

// 通过使用 GPIO 的功能选择设置 TX 和 RX 引脚
// 更多信息请参见数据手册中的功能选择
gpio_set_function(UART_TX_PIN, UART_FUNCSEL_NUM(UART_ID, UART_TX_PIN));
gpio_set_function(UART_RX_PIN, UART_FUNCSEL_NUM(UART_ID, UART_RX_PIN));

// 使用一些 UART 函数来发送数据
// 在默认系统中,printf 也会通过默认 UART 输出

// 发送一个字符,不做任何转换
uart_putc_raw(UART_ID, 'A');

// 发送一个字符,进行 CR/LF 转换
uart_putc(UART_ID, 'B');

// 发送一个字符串,进行 CR/LF 转换
uart_puts(UART_ID, " Hello, UART!\n");

// 打印测试
int i = 0;
for (;;) {
sleep_ms(500);
printf("Hello %d", i++);
}
}

示例 4: 读取电池电压

hello_adc.c
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "hardware/adc.h"

void init_gpio() {
const int gpio = 19;

gpio_init(gpio);
gpio_set_dir(gpio, GPIO_OUT);
gpio_put(gpio, 1);
}

int main() {
stdio_init_all();
printf("ADC 电池示例 - GPIO29 A3\n");

init_gpio();
adc_init();

// 确保GPIO为高阻抗,没有上拉等
adc_gpio_init(29);
// 选择ADC输入 0(GPIO26)
adc_select_input(3);

while (1) {
// 12位转换,假设最大值 == ADC_VREF == 3.3 V
const float conversion_factor = 3.3f / (1 << 12);
uint16_t result = adc_read();
printf("原始值: 0x%03x, 电压: %f V\n", result, result * conversion_factor * 2);
sleep_ms(500);
}
}

常见问题解答

TinyUSB 子模块未初始化;USB 支持不可用

问题: 在构建项目时,您可能会看到以下警告:

TinyUSB 子模块尚未初始化;USB 支持将不可用

解决方案:

  1. 在 Linux/macOS 上打开终端,或在 Windows 上打开命令提示符/PowerShell/Git Bash。

  2. 进入 Pico SDK 目录:

    cd /path/to/your/pico-sdk
  3. 初始化子模块:

    git submodule update --init

这将为您的项目启用 USB 支持。

资源

技术支持与产品讨论

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

Loading Comments...