Skip to main content

Seeed Studio XIAO SAMD21 系列入门指南

Seeed Studio XIAO SAMD21Seeed Studio XIAO SAMD21 Plus

概述​

Seeed Studio XIAO SAMD21 之前被命名为 Seeeduino XIAO,是 Seeed Studio XIAO 家族的首款产品,这是一系列兼容 Arduino 的高性能拇指大小开发板。它搭载了低功耗微控制器 ATSAMD21G18A-MU。另一方面,这块小板子在处理性能方面表现良好,却只需要更低的功耗。它采用超小尺寸设计,可用于可穿戴设备和小型项目。

Seeed Studio XIAO SAMD21 具有 14 个引脚,可通过引脚复用用作 11 个数字接口、11 个模拟接口、10 个 PWM 接口(d1-d10)、1 个 DAC 输出引脚 D0、1 个 SWD 焊盘接口、1 个 I2C 接口、1 个 SPI 接口、1 个 UART 接口、串口通信指示灯(T/R)、闪烁指示灯(L)。LED(电源、L、RX、TX)的颜色分别为绿色、黄色、蓝色和蓝色。此外,Seeed Studio XIAO SAMD21 具有一个 Type-C 接口,可用于供电和下载代码。板载有两个复位焊盘,你可以将它们短接来复位开发板。

由 Microchip 的 SAMD21G18A ARM Cortex-M0+ 32 位处理器提供算力,XIAO SAMD21 Plus 为小巧多用的 XIAO SAMD21 带来了更高的灵活性和可扩展性。在保持包括兼容 Arduino、MicroPython 和 PlatformIO 在内的全部强大特性的同时,Plus 版本重新设计了半孔和背面焊盘布局,提供额外 16 个 GPIO、集成锂电池管理、独立的 Reset 和 Boot 按钮,以及板载可编程 WS2812 RGB LED。它非常适合高级 IoT 项目、电池供电可穿戴设备、嵌入式应用以及可量产的 SoM 设计。

文档​

关于 Seeed Studio XIAO SAMD21 的使用有两份文档,分别侧重不同的内容,请参考下表:

Seeed 官方文档Nanase 编写的文档
引脚图接口
Seeed Studio XIAO SAMD21 入门指南Seeed Studio XIAO SAMD21 与 MicroSD 卡(SPI)
Seeed Studio XIAO SAMD21 GPIO 使用说明Seeed Studio XIAO SAMD21 与 GPS(UART)
Seeed Studio XIAO SAMD21 资源单周期 IOBUS

特性​

  • 强大的 MCU:Microchip ATSAMD21G18A Arm® Cortex®-M0+ 处理器,主频 48 MHz,集成 256 KB Flash、32 KB SRAM,并支持原生 USB。
  • 扩展 I/O:XIAO SAMD21 Plus 保留标准 14 引脚 XIAO 布局,并通过 1.27 mm 背面贴片半孔增加 16 个 GPIO,支持 PWM、DAC、I2C、UART、SPI、I2S 和 SWD。
  • 集成电源管理:支持锂电池直接连接、板载充电、反灌电流保护以及充电状态指示。
  • 灵活开发:兼容 Arduino IDE、PlatformIO、CircuitPython 和 TinyGo。
  • 小巧且适配生态:保持 21 × 17.8 mm 面包板友好 XIAO 外形,同时采用标准化的 XIAO Plus 背面布局,便于扩展板和自定义载板设计。

规格​

Product NameSeeed Studio XIAO SAMD21Seeed Studio XIAO SAMD21 Plus
Chipset

Microchip SAMD21G18

ProcessorArm® Cortex®-M0+ processor running at up to 48 MHz
RAM32 KB SRAM
Flash256 KB Flash
Interface

GPIO Pin ×14
Digital Pin ×11
Analog Pin ×11
DAC ×1
I2C ×1
UART ×1
SPI ×1

GPIO Pin ×30
Digital Pin ×27
Analog Pin ×11
DAC ×1
I2C ×2
UART ×1
SPI ×1
I2S ×1

Onboard

User LED ×1
Power LED ×1
TX/RX Status LED ×2

User LED ×1
Reset Button ×1
Boot Button ×1

Battery ManagementNoneOnboard PMIC
Power

Input Voltage (Type-C): 5 V
BAT Input: Not supported

Input Voltage (Type-C): 5 V
BAT Input: 3.7 V single-cell Li-ion/LiPo battery

BAT-to-3V3 Backflow ProtectionNoYes
Working Temperature-40°C to 85°C
Dimensions21 × 17.8 mm
Software Compatibility

Arduino、PlatformIO、MicroPython、CircuitPython、Zephyr 等

硬件概览​

XIAO SAMD21 正面​

XIAO SAMD21 背面​

caution

对于通用 I/O 引脚: MCU 的工作电压为 3.3V。如果接入通用 I/O 引脚的电压高于 3.3V,可能会导致芯片损坏。

对于电源引脚: 板载 DC-DC 转换电路可以将 5V 电压转换为 3.3V,允许通过 VIN-PIN 和 5V-PIN 使用 5V 电源为设备供电。

必须明确的是,XIAO SAMD21 背面的 VIN 和 GND 焊盘并非用于直接连接电池,尤其不能直接连接可充电锂电池(LiPo/Li-Ion)。该开发板缺少安全运行所需的关键电池管理电路。这些焊盘只是一个替代电源输入点,会绕过板载的保护二极管。如果你希望使用电池为项目供电,必须使用专用的外部电池管理模块来提供充电和保护,然后将该模块的稳压输出连接到 XIAO 的 5V 引脚。

请在使用时多加注意,请不要掀开屏蔽罩。

引脚映射​

XIAO PinFunctionXIAO SAMD21XIAO SAMD21 PlusDescription
5VVBUSVBUSVBUSUSB 5 V 电源输入/输出
GNDGNDGNDGND地
3V33V3_OUT3V3_OUT3V3_OUT3.3 V 电源输出
D0A0 / DACPA02PA02GPIO,ADC AIN0,DAC 输出;无硬件 PWM
D1A1PA04PA04GPIO,ADC AIN4
D2A2PA10PA10GPIO,ADC AIN18
D3A3PA11PA11GPIO,ADC AIN19
D4SDA0PA08PA08GPIO,ADC AIN16,I2C 数据
D5SCL0PA09PA09GPIO,ADC AIN17,I2C 时钟
D6TXPB08PB08GPIO,ADC AIN2,UART 发送
D7RXPB09PB09GPIO,ADC AIN3,UART 接收
D8SCKPA07PA07GPIO,ADC AIN7,SPI 时钟
D9MISOPA05PA05GPIO,ADC AIN5,SPI 数据输入
D10MOSIPA06PA06GPIO,ADC AIN6,SPI 数据输出
D11TX_LEDPA19-XIAO SAMD21 上的内部 TX LED;在 Plus 上未定义
D12GPIOPA18 (RX_LED)PA28Plus 扩展 GPIO
D13SCL1PA17 (USER_LED)PA17Plus 扩展 GPIO 和 I2C1 时钟
D14SDA1-PA16Plus 扩展 GPIO 和 I2C1 数据
D15GPIO-PA15Plus 扩展 GPIO
D16GPIO-PA14Plus 扩展 GPIO
D17GPIO-PA13Plus 扩展 GPIO
D18GPIO-PA12Plus 扩展 GPIO
D19I2S_SD-PA19Plus 扩展 GPIO 和 I2S 数据
D20I2S_SCK-PA20Plus 扩展 GPIO 和 I2S 时钟
D21I2S_WS-PA21Plus 扩展 GPIO 和 I2S 字选择
D22GPIO-PB10Plus 扩展 GPIO
D23GPIO-PB11Plus 扩展 GPIO
D24GPIO-PB23Plus 扩展 GPIO
D25GPIO-PA23Plus 扩展 GPIO
D26GPIO-PB2Plus 扩展 GPIO
D27GPIO-PA18Plus 扩展 GPIO
VBAT_ENBattery Enable-PB2Plus 上的电池电源控制
AIN11_VBATVoltage Read-PB3在 Plus 上读取电池电压
ResetRESETNRESETNRESETN低电平有效复位输入,封装引脚 40
TX_LEDLEDPA19-原始板 TX 指示灯,低电平有效
RX_LEDLEDPA18-原始板 RX 指示灯,低电平有效
USER_LEDLEDPA17-原始板用户 LED,低电平有效
POWER_LEDPower indicator3V3-原始板绿色电源 LED;不是 MCU GPIO
RGB_LEDWS2812B data-PA27Plus 可寻址 RGB LED 数据
USER_BUTTONButton-PB22Plus 用户按键,低电平有效
VBAT_ENBattery ADC enable-PB02使能电池电压测量
AIN11_VBATBattery ADC-PB03 / AIN11通过 1/2 分压后的电池电压
CHARGE_LEDCharging indicator--Plus 硬件控制的充电 LED;不是 MCU GPIO
SWDIOSWD debugPA31PA31串行线调试数据
SWCLKSWD debugPA30PA30串行线调试时钟

进入 Bootloader 模式​

适用于 XIAO SAMD21​

有时在用户编程过程失败时,Seeed Studio XIAO SAMD21 的端口可能会消失。我们可以通过以下操作来解决这个问题:

  • 将 Seeed Studio XIAO SAMD21 连接到你的电脑。
  • 使用镊子或短导线将图中的 RST 引脚短接两次。
  • 橙色 LED 灯会闪烁并点亮。

此时,芯片进入 Bootloader 模式,烧录端口会再次出现。由于 samd21 芯片有两个分区,一个是 Bootloader,另一个是用户程序。产品在出厂时会在系统存储器中烧录一段 bootloader 代码。我们可以通过执行上述步骤在两种模式之间切换。

pir

适用于 XIAO SAMD21 Plus​

将 XIAO SAMD21 Plus 连接到你的电脑。连续按下 Reset 按钮两次即可进入 Bootloader 模式。

复位​

如果你想复位 Seeed Studio XIAO SAMD21,请执行以下步骤:

  • 将 Seeed Studio XIAO SAMD21 连接到你的电脑。
  • 使用镊子或短导线将 RST 引脚只短接一次
  • 橙色 LED 灯会闪烁并点亮。

请注意:板载 LED 的行为与 Arduino 上的是相反的。在 Seeed Studio XIAO SAMD21 上,引脚必须被拉低,而在其他微控制器上则必须被拉高。  

中断​

Seeed Studio XIAO SAMD21 上的所有引脚都支持中断,但有两个引脚不能同时使用:5 号引脚和 7 号引脚。关于中断的更多细节请查看这里。

入门指南​

硬件​

Seeed Studio XIAO SAMD21Seeed Studio XIAO SAMD21 Plus

所需材料

  • Seeed Studio XIAO SAMD21 x1
  • 电脑 x1
  • USB Type-C 线缆 x1
tip

有些 USB 线缆只能供电,不能传输数据。如果你没有 usb 线缆,或者不知道你的 usb 线缆是否可以传输数据,你可以查看 seeed USB type C support USB 3.1。

  • 步骤 1. 准备一块 Seeed Studio XIAO SAMD21 和一根 Type-C 线缆。

  • 步骤 2. 将 Seeed Studio XIAO SAMD21 连接到你的电脑。然后黄色电源 LED 应该会亮起。

软件​

note

如果这是你第一次使用 Arduino,我们强烈建议你参考 Getting Started with Arduino

  • 步骤 1. 你需要安装 Arduino 软件。

启动 Arduino 应用程序

双击你之前下载的 Arduino 应用程序(arduino.exe)。

note

如果 Arduino 软件以其他语言加载,你可以在首选项对话框中更改它。详情请参阅 Arduino Software (IDE) 页面。

  • 步骤 2. 打开 Blink 示例

打开 LED 闪烁示例草图:File > Examples >01.Basics > Blink。

pir

  • 步骤 3. 将 Seeeduino 添加到你的 Arduino IDE

点击 File > Preference,并在 Additional Boards Manager URLs 中填入以下 URL:

https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json

pir

点击 Tools-> Board-> Boards Manager...,在搜索框中输入关键字 "Seeed Studio XIAO SAMD21"。此时会出现 Seeed SAMD Boards。安装它。

pir

XIAO SAMD21 闪烁​

  • 步骤 4. 选择你的开发板和端口

安装好开发板后,点击 Tools-> Board,找到 Seeed Studio XIAO 并选择它。现在你已经为 Arduino IDE 设置好了 Seeed Studio XIAO SAMD21 开发板。

pir

在 Tools | Serial Port 菜单中选择 Arduino 开发板的串口设备。这通常是 COM3 或更高(COM1 和 COM2 通常保留给硬件串口)。要确认的话,你可以断开 Arduino 开发板并重新打开菜单;消失的那个条目应该就是 Arduino 开发板。重新连接开发板并选择该串口。

pir

  • 步骤 5. 上传程序

现在,只需点击环境中的 Upload 按钮。等待几秒钟,如果上传成功,状态栏中会出现 "Done uploading." 的消息。

pir

上传完成几秒钟后,你应该会看到板子上的 13 号引脚(L)LED 开始闪烁(橙色)。如果是这样,恭喜你!你已经成功运行 Arduino。如果遇到问题,请查看故障排除建议。

note

最大闪存容量为 8 KB。更多信息请参考资源部分中的 ATSAMD21G18A-MU 数据手册。

XIAO SAMD21 Plus 闪烁​

在 XIAO SAMD21 Plus 上,L(LED)引脚已被移除。它被 RGB_LED 取代,通过引脚 PA27 控制。

‑ 将目标开发板更改为 XIAO M0 Plus。

pir

  • 安装 Adafruit_NeoPixel 库并更新到最新版本。

pir

‑ 将代码替换为下面的代码片段。RGB_LED 的数据引脚是 PA27(PIN_NEOPIXEL)。电源控制引脚是 D11 —— 请在你的草图中添加 '#define NEOPIXEL_POWER 11'。

caution

如果在过高亮度下运行,RGB LED 可能会导致眼睛疲劳或损伤;建议佩戴适当的眼部防护。

#include <Adafruit_NeoPixel.h>
#define NEOPIXEL_POWER 11

#define NUMPIXELS 1

Adafruit_NeoPixel pixels(NUMPIXELS, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800);

void setup() {
pixels.begin();

pinMode(NEOPIXEL_POWER, OUTPUT);
digitalWrite(NEOPIXEL_POWER, HIGH);

// Set overall brightness (0~255)
// Recommended eye-friendly range: 10~50
pixels.setBrightness(50);
}


void loop() {

pixels.clear();
pixels.setPixelColor(0, pixels.Color(15, 25, 205));
pixels.show();
delay(400);


pixels.clear();
pixels.setPixelColor(0, pixels.Color(103, 25, 205));
pixels.show();
delay(400);


pixels.clear();
pixels.setPixelColor(0, pixels.Color(233, 242, 205));
pixels.show();
delay(400);


pixels.clear();
pixels.setPixelColor(0, pixels.Color(233, 23, 23));
pixels.show();
delay(400);


pixels.clear();
pixels.setPixelColor(0, pixels.Color(12, 66, 101));
pixels.show();
delay(400);


pixels.clear();
pixels.show();
delay(500);
}

‑ 点击 Upload 烧录程序。完成后,RGB‑LED 将会点亮。

pir

note

最大闪存容量为 8 KB。更多信息请参考资源部分中的 ATSAMD21G18A-MU 数据手册。

引脚复用​

我们不需要自己配置引脚,使用引脚之后,你可以直接调用函数。

数字输入和输出​

  • 使用引脚 6 作为数字引脚:
const int buttonPin = 6;     // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin

int buttonState = 0; // variable for reading the pushbutton status

void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}

void loop() {
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);

// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (buttonState == HIGH) {
// turn LED on:
digitalWrite(ledPin, HIGH);
} else {
// turn LED off:
digitalWrite(ledPin, LOW);
}
}

AnalogRead​

  • 使用引脚 6 作为模拟引脚:


void setup() {
// declare the ledPin as an OUTPUT:
pinMode(ledPin, OUTPUT);
}

void loop() {
// read the value from the sensor:
sensorValue = analogRead(sensorPin);
// turn the ledPin on
digitalWrite(ledPin, HIGH);
// stop the program for <sensorValue> milliseconds:
delay(sensorValue);
// turn the ledPin off:
digitalWrite(ledPin, LOW);
// stop the program for for <sensorValue> milliseconds:
delay(sensorValue);
}

串口​

  • 使用引脚 6 作为 UART 的 TX 引脚(UART 的 RX 引脚是引脚 7):

void setup() {
Serial1.begin(115200);
while (!Serial);
}

void loop() {
Serial1.println("Hello,World");
delay(1000);
}

I2C​

  • 使用引脚 5 作为 IIC 的 SCL 引脚(IIC 的 SDA 引脚是引脚 4):
// Wire Master Writer
// by Nicholas Zambetti <http://www.zambetti.com>

// Demonstrates use of the Wire library
// Writes data to an I2C/TWI slave device
// Refer to the "Wire Slave Receiver" example for use with this

// Created 29 March 2006

// This example code is in the public domain.


#include <Wire.h>

void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
}

byte x = 0;

void loop()
{
Wire.beginTransmission(4); // transmit to device #4
Wire.write("x is "); // sends five bytes
Wire.write(x); // sends one byte
Wire.endTransmission(); // stop transmitting
x++;
delay(500);
}

SPI​

  • 使用引脚 8 作为 SPI 的 SCK 引脚(SPI 的 MISO 引脚是引脚 9,MOSI 引脚是引脚 10):
#include <SPI.h>
const int CS = 7;
void setup (void) {
digitalWrite(CS, HIGH); // disable Slave Select
SPI.begin ();
SPI.setClockDivider(SPI_CLOCK_DIV8);//divide the clock by 8
}

void loop (void) {
char c;
digitalWrite(CS, LOW); // enable Slave Select
// send test string
for (const char * p = "Hello, world!\r" ; c = *p; p++) {
SPI.transfer (c);
}
digitalWrite(CS, HIGH); // disable Slave Select
delay(2000);
}

QTouch​

关于如何使用 QTouch,我们提供了一个示例项目:如何在 Seeed Studio XIAO SAMD21 的 Q-Touch 功能上制作水果钢琴。

模拟输入和输出​

虽然它仍然具有基于 PWM 的“模拟输出”,但 SAMD21 还具有真正的模拟输出,即数模转换器(DAC)。该模块可以产生 0 到 3.3V 之间的模拟电压。它可以用来产生更自然声音的音频,或者作为一种“数字电位器”来控制模拟设备。

DAC 仅在 Arduino 引脚 A0 上可用,并使用 analogWrite(A0, <value>) 进行控制。DAC 最多可以设置为 10 位分辨率(请确保在 setup 中调用 analogWriteResolution(10)),这意味着 0 到 1023 之间的数值会将电压设置在 0 到 3.3V 之间的某个值。

除了 DAC 之外,SAMD21 的 ADC 通道也不同于 ATmega328:它们支持最高 12 位分辨率。这意味着模拟输入值可以在 0-4095 之间变化,对应 0 到 3.3V 之间的电压。要在 12 位模式下使用 ADC,请确保在 setup 中调用 analogReadResolution(12)。

串口绘图显示 DAC

下面是一个同时演示 DAC 和 ADC 的示例。要搭建这个实验,请将 A0 连接到 A1 —— 我们用模拟电压驱动 A0,然后用 A1 读取它。这是我们在教程中用过的最简单电路:

note

Seeed Studio XIAO SAMD21 使用了 Seeed Studio XIAO SAMD21 扩展板

该示例在 A0 上产生一个正弦波输出,电压范围为 0 到 3.3V。然后使用 A1 将该输出读入其 ADC,并将其转换为 0 到 3.3V 之间的电压。

当然,你可以打开串口监视器来查看电压值的变化。但如果通过文本难以想象正弦波的形状,可以通过依次点击 Tools > Serial Plotter 来查看 Arduino 新的串口绘图器。

感谢 Aleksei Tertychnyi 提交代码,所有相关功能均由他开发并贡献。

#define DAC_PIN A0 // Make code a bit more legible
float x = 0; // Value to take the sin of
float increment = 0.02; // Value to increment x by each time
// Frequency of sine wave is about 1.37 Hz

void setup()
{
analogWriteResolution(10); // Set analog out resolution to max, 10-bits
analogReadResolution(12); // Set analog input resolution to max, 12-bits

Serial.begin(9600);
}

void loop()
{
// Generate a voltage value between 0 and 1023.
// Let's scale a sin wave between those values:
// Offset by 511.5, then multiply sin by 511.5.
int dacVoltage = (int)(511.5 + 511.5 * sin(x));
x += increment; // Increase value of x

// Generate a voltage between 0 and 3.3V.
// 0= 0V, 1023=3.3V, 512=1.65V, etc.
analogWrite(DAC_PIN, dacVoltage);

// Now read A1 (connected to A0), and convert that
// 12-bit ADC value to a voltage between 0 and 3.3.
float voltage = analogRead(A1) * 3.3 / 4096.0;
Serial.println(voltage); // Print the voltage.
delay(1); // Delay 1ms
}

结果

pir

电池使用​

note

只有 XIAO SAMD21 Plus 在背面带有 BAT 电池连接器,请注意区分。

XIAO SAMD21 Plus 可以使用 3.7V 锂电池作为电源输入。你可以参考下图了解接线方式。


caution

焊接时请务必注意不要让正负极短路,以免烧毁电池和设备。如果电池本身带电,切勿直接焊接到电路板上,否则可能烧毁电路板。在电路上电的情况下发生短路风险极大,建议使用转接头进行连接。

电池电压读取示例​

根据原理图,SGM40567-4.2XG/TR 提供单节锂电池充电功能,充电电流约为 200 mA。充电过程中 Charge_LED 会闪烁。

电池电压测量由 TPS22916CNYFPR 负载开关通过 PB2/VBAT_EN 控制,从而降低待机功耗。电池电压经电阻分压为一半后,通过 PB3/AIN11_VBAT ADC 引脚进行测量。


电池电压是通过电阻分压电路测量的。ADC 读取到的电压是实际电池电压的一半,因此软件必须将 ADC 测量值乘以 2 才能得到实际电池电压。

在 Arduino 内核中,PB02 和 PB03 分别映射为引脚编号 31 和 32。按如下方式进行定义:

// VBAT_EN on PB02
#define PIN_VBAT_EN (31u)

// AIN11_VBAT on PB03
#define PIN_VBAT_ADC (32u)
电池读取示例
constexpr float ADC_VREF = 3.3f;
constexpr float ADC_MAX = 4095.0f;
constexpr float DIVIDER_RATIO = 2.0f; // R5 = R6 = 10 kΩ

float readBatteryVoltage() {
digitalWrite(PIN_VBAT_EN, HIGH);
delay(10);

analogRead(PIN_VBAT_ADC); // Discard a stale reading

uint32_t sum = 0;
constexpr int samples = 16;

for (int i = 0; i < samples; i++) {
sum += analogRead(PIN_VBAT_ADC);
delay(2);
}

digitalWrite(PIN_VBAT_EN, LOW);

float adcRaw = sum / static_cast<float>(samples);
float adcVoltage = adcRaw * ADC_VREF / ADC_MAX;

return adcVoltage * DIVIDER_RATIO;
}

void setup() {
Serial.begin(115200);

pinMode(PIN_VBAT_EN, OUTPUT);
digitalWrite(PIN_VBAT_EN, LOW);

analogReadResolution(12); // SAMD21 ADC: 0–4095
}

void loop() {
float batteryVoltage = readBatteryVoltage();

Serial.print("Battery: ");
Serial.print(batteryVoltage, 3);
Serial.println(" V");

delay(1000);
}

note

对于低功耗应用,在完成电池电压测量后,请关闭 BAT_EN,以减少由分压电阻引起的静态功耗。

  • 电池充电时,Charge_LED 会闪烁。

  • 电池电压测量结果:锂离子电池的实测电压可能与电池上标注的标称值不同,请以实际测量值为准。

示例应用​

资源​

XIAO SAMD21​

硬件设计

机械设计

软件与工具

XIAO SAMD21 Plus​

硬件设计

机械设计

课程资源​

技术支持与产品讨论​

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

Loading Comments...