Zephyr 中 Serpente 开发板移植与实战:基于 ATSAMD21E18A 的极简原型板使用指南
【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr
Serpente 是 Arturo182 推出的一款极小型、低成本开发与原型验证板,搭载 ATSAMD21E18A(ARM Cortex-M0+)处理器,配备 4MiB 额外 SPI Flash、PWM 可调 RGB LED 和 6 个 I/O 引脚,并以原生 USB 接口作为主要通信与烧录通道。本文以 Zephyr 仓库中该板卡的官方文档为骨架,结合 board 源码 的 devicetree、Kconfig 与构建脚本,完整讲解 Serpente 的硬件规格、时钟树、USB 设备模式、BOSSA/UF2 烧录流程及 Zephyr 支持的功能清单,帮助读者在 Zephyr 上快速完成 blinky 等样例的构建与烧录,并理解板卡级移植背后的实现细节。
Arturo182 Serpente 开发板:极小型 ATSAMD21 原型板,带 USB 接口与 RGB LED
板卡概述与硬件规格
Serpente 是一块面向嵌入式原型开发的小尺寸开发板,其核心定位是"小而全":板载主控、存储、LED 与 USB 一应俱全,无需外接调试器即可通过 USB 直接烧录与通信。
根据 boards/others/serpente/doc/index.rst 的官方说明,板卡核心特性包括:
- 4MiB 板载 Flash 存储:除主控内部 Flash 外,额外提供 4MiB SPI Flash,可用于数据存储或文件系统;
- PWM 可调 RGB LED:红、绿、蓝三色 LED 均支持 PWM 控制,可实现任意颜色与亮度调节;
- 6 个 I/O 引脚:面向小型化原型设计,引脚数量精简但覆盖常用外设;
- 三种 USB 连接器选项:同一块板提供 USB Type-C 公头(plug)、USB Type-C 母座(socket)与 USB Type-A 公头(plug)三种变体,可直插电脑或 USB 供电设备。
硬件配置一览
| 项目 | 规格 |
|---|---|
| 处理器 | ATSAMD21E18A,ARM Cortex-M0+,主频 48 MHz |
| 内部 Flash | 256 KiB |
| RAM | 32 KiB |
| 外部存储 | 额外 4MiB SPI Flash |
| 用户 LED | RGB 三色 PWM LED |
| 按键 | Reset 复位键 |
| USB | 原生 USB 设备端口 |
上述硬件参数在 serpente.yaml 中也有对应声明:flash: 256、ram: 32,架构为arch: arm,工具链支持zephyr与gnuarmemb。
支持的板级功能
Zephyr 通过 serpente.yaml 中的supported字段声明该板卡在当前版本中可用的驱动/子系统,覆盖了 SAMD21 上常用的大部分外设:
- adc:模数转换
- counter:计数器
- gpio:通用输入输出
- hwinfo:硬件信息读取
- i2c:I2C 总线
- pwm:PWM(驱动 RGB LED 的核心)
- spi:SPI 总线(用于外部 4MiB Flash 等)
- uart:串口(默认控制台)
- usb_device:USB 设备
- watchdog:看门狗
这些能力在 devicetree 中均有对应的节点启用(详见下文),意味着上述外设驱动已随板卡移植被 Zephyr 原生支持,可直接用于应用开发。
引脚连接与 I/O 布局
Serpente 的完整引脚定义与原理图可参考板卡厂商的官方文档(详见原文档 References 中的Serpente documentation、pinouts与schematic链接)。在 Zephyr 侧,引脚复用关系由 serpente-pinctrl.dtsi 明确定义,这里给出关键复用组:
| 功能 | 引脚(PINMUX) | 对应外设 |
|---|---|---|
| PWM 输出(红/绿/蓝) | PA22F_TCC0_WO4 / PA19F_TCC0_WO3 / PA23F_TCC0_WO5 | TCC0 |
| I2C | PA4D_SERCOM0_PAD0 / PA5D_SERCOM0_PAD1 | SERCOM0 |
| SPI(外部 Flash 等) | PA18D_SERCOM3_PAD2 / PA16D_SERCOM3_PAD0 / PA17D_SERCOM3_PAD1 | SERCOM3 |
| UART 控制台 | PA9D_SERCOM2_PAD1 / PA8D_SERCOM2_PAD0 | SERCOM2 |
| USB D+/D- | PA25G_USB_DP / PA24G_USB_DM | USB |
从 serpente.dts 可以看到,默认控制台与 shell 串口被绑定到sercom2(zephyr,console = &sercom2; zephyr,shell-uart = &sercom2;),串口波特率为 115200。同时sercom0、sercom2(UART)、sercom3(SPI)、tcc0(PWM)与usb0(USB 设备)均在 devicetree 中被置为status = "okay"。
RGB LED 的 GPIO 与 PWM 双重驱动
Serpente 的 RGB LED 在 serpente.dts 中被定义了两套节点:
gpio-leds节点:红、绿、蓝分别位于 PA22、PA19、PA23,且均为GPIO_ACTIVE_LOW(低电平点亮),并通过aliases暴露为led0/led1/led2与red-led/green-led/blue-led;pwm-leds节点:三色 LED 分别由tcc0的通道 0、3、1 驱动,周期为PWM_MSEC(20)(20ms,即 50Hz 刷新率),通过aliases暴露为pwm-led0/1/2与red-pwm-led/green-pwm-led/blue-pwm-led。
因此应用层既可以使用 GPIO 接口做简单开关/闪烁,也可以使用 PWM 接口实现颜色渐变,这正是原文档所称 "PWM enabled RGB led" 的源码级体现。
系统时钟配置
SAMD21 默认的时钟方案为:使用8 MHz 内部振荡器(OSC8M)作为主时钟源,再经由片内 PLL 倍频生成48 MHz 系统时钟。
这一配置在 serpente_defconfig 中直接可见:
CONFIG_SOC_ATMEL_SAMD_OSC8M=y CONFIG_SOC_ATMEL_SAMD_OSC8M_AS_MAIN=y同时在 serpente.dts 中显式声明了 CPU 工作频率:
&cpu0 { clock-frequency = <48000000>; };从源码结构看,SOC_ATMEL_SAMD_OSC8M_AS_MAIN将 8MHz 内部振荡器设定为主时钟源,再通过 SAMD21 的 DPLL 倍频到 48MHz,以满足 USB 与 UART 等工作所需的稳定时钟。
USB 设备端口
SAMD21 自带原生 USB 设备控制器,Serpente 通过 USB 口即可与主机 PC 通信,无需额外硬件。Zephyr 侧 USB 外设节点在 serpente.dts 中启用:
zephyr_udc0: &usb0 { status = "okay"; pinctrl-0 = <&usb_dc_default>; pinctrl-names = "default"; };其中usb_dc_default引脚组将 PA25/PA24 复用为 USB D+/D-。开发者可以参考 Zephyr 的usb样例类别,例如usb-cdc-acm样例——它会在主机 PC 上枚举出一个虚拟串口,并向主机打印 "Hello World!",是验证 Serpente USB 通路是否正常的最快途径。
编程与调试:BOSSA 兼容的 UF2 Bootloader
Serpente 出厂预装BOSSA 兼容的 UF2 bootloader。BOSSA(Basic Open Source SAM-BA)是 Atmel/Microchip SAM 系列 MCU 常用的烧录工具链,UF2 则是 Adafruit 推动的"拖拽式"固件格式;Serpente 将两者结合,使烧录体验非常友好:
- 将板卡插入电脑后,它会枚举为一个可移动磁盘(UF2 模式);
- 双击 Reset 按键(快速连按两次)即可随时进入 bootloader 模式;
- 把编译好的
.uf2固件直接复制到磁盘即可完成烧录。
Zephyr 侧对 bootloader 的支持体现在 serpente_defconfig:
CONFIG_BOOTLOADER_BOSSA=y CONFIG_BOOTLOADER_BOSSA_ADAFRUIT_UF2=y以及 serpente.dts 中的 Flash 分区布局:
boot_partition: partition@0 { label = "uf2"; reg = <0x00000000 DT_SIZE_K(8)>; read-only; }; code_partition: partition@2000 { label = "code"; reg = <0x2000 DT_SIZE_K(256-8)>; read-only; };即:Flash 起始的 8KiB 被保留给 UF2 bootloader(只读),其余约 248KiB 用作应用代码分区(zephyr,code-partition)。这样的分区设计保证应用固件不会覆盖 bootloader,从而始终保持双击复位即可重新烧录的能力。
支持的烧录工具链
board.cmake 引入了 Zephyr 通用烧录脚本:
include(${ZEPHYR_BASE}/boards/common/bossac.board.cmake)即 Serpente 默认使用bossac(BOSSA 命令行工具)作为 runner,west flash会自动调用 bossac 完成固件写入。
烧录示例:从构建 blinky 到 LED 闪烁
以下步骤完全遵循官方文档的烧录流程,可在 Zephyr 环境下直接复现。
第一步:构建 blinky 样例
构建 Zephyr 内核与blinky样例应用(目标板为serpente):
west build -b serpente samples/basic/blinkyblinky是 Zephyr 中最基础的点灯样例,它通过led0别名驱动板载 LED 周期性闪烁。由于 Serpente 的 LED 均为GPIO_ACTIVE_LOW,devicetree 已正确声明极性,样例无需任何修改即可工作。
第二步:连接板卡
使用 USB 线将 Serpente 连接到主机电脑。注意板卡有 USB Type-C 公头、Type-C 母座、Type-A 公头三种变体,请根据手头板卡选择合适的连接方式。
第三步:进入 bootloader 模式
快速双击 Reset 按键(两次轻触),板卡将进入 UF2 bootloader 模式,并在主机上呈现为一个可移动磁盘。
第四步:烧录固件
west flashwest flash会通过 bossac runner 生成并烧录固件。烧录完成后复位运行,即可看到板载 User LED 开始闪烁。
若使用手工方式,也可以将 west 构建产物中的.uf2文件直接拖入 bootloader 暴露的可移动磁盘完成烧录。
总结
Serpente 以极小的尺寸提供了完整的开发闭环:ATSAMD21E18A 提供 48MHz Cortex-M0+ 算力,256KiB 内部 Flash + 32KiB RAM + 4MiB 外部 SPI Flash 满足原型存储需求,PWM RGB LED 便于状态指示,原生 USB 既是通信口也是烧录口。在 Zephyr 中,该板卡的移植已相当成熟:devicetree 完整定义了引脚复用、分区与外围设备,Kconfig 预设了 OSC8M 主时钟与 BOSSA/UF2 bootloader 支持,west build -b serpente+ 双击复位 +west flash三步即可完成从源码到点灯的全流程。对于需要快速验证 Zephyr 应用或做小型 USB 外设原型开发的场景,Serpente 是一个非常轻量且顺手的起点。
【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考