RIOT OS 中的 ESP32-S3-DevKit 开发板支持:BOARD_VERSION 多版本配置、外设布局与烧录实战
2026/9/18 6:55:50 网站建设 项目流程

RIOT OS 中的 ESP32-S3-DevKit 开发板支持:BOARD_VERSION 多版本配置、外设布局与烧录实战

【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT

ESP32-S3-DevKit 是乐鑫官方的一套通用开发板,RIOT 通过esp32s3-devkit这一板级定义为它提供完整支持。本文以 boards/esp32s3-devkit/doc.md 为骨架,结合 Makefile.features、Kconfig、periph_conf.h、board.h 等源码,系统讲解如何用BOARD_VERSION变量在单一板级定义下适配 DevKitC-1/DevKitM-1 的多种 Flash 与 SPI RAM 组合、理解默认 GPIO 复用布局、按需裁剪外设配置,以及通过 Micro-USB 编程口一键烧录。

ESP32-S3-DevKit 板级概览

Espressif ESP32-S3-DevKit 是一系列开发板,它们共用同一份 RIOT 板级定义,但板载模块不同,导致 Flash 容量、集成 SPI PSRAM 与 SPI 电压存在差异。涉及的模块包括:

  • ESP32-S3-MINI-1x模块(对应 ESP32-S3-DevKitM-1 开发板)
  • ESP32-S3-WROOM-1x模块(对应 ESP32-S3-DevKitC-1 开发板)
  • ESP32-S3-WROOM-2模块(对应 ESP32-S3-DevKitC-1 开发板)

RIOT 的做法是用单个板级定义esp32s3-devkit覆盖所有这些版本,编译时通过变量BOARD_VERSION指定实际板子版本:

BOARD=esp32s3-devkit BOARD_VERSION=esp32s3-devkitc-1-n8 make ...

从构建系统源码看,这一机制在两个层面落地:

  1. Make 层面:Makefile.features 在BOARD_VERSION未定义时默认赋值为esp32s3-devkitc-1-n8,然后通过ifeq链将每个版本映射到对应的CPU_MODEL(如esp32s3_wroom_1x_n8esp32s3_mini_1x_n8),未知版本直接报错BOARD_VERSION is unknown
  2. Kconfig 层面:Kconfig 提供了等价的BOARD_VERSION字符串选项与choice单选菜单,供使用 Kconfig 配置系统时选择,并据此select对应 CPU 型号。

支持的板级版本一览

下表完整列出可用版本、Flash 与 SPI RAM 容量及模式,以及对应的BOARD_VERSION取值:

Board VersionFlash (Mode)SPI RAM (Mode)BOARD_VERSION
**ESP32-S3-DevKitC-1-N88 MB (Quad)-esp32s3-devkitc-1-n8(默认)**
ESP32-S3-DevKitC-1-N8R28 MB (Quad)2 MB (Quad)esp32s3-devkitc-1-n8r2
ESP32-S3-DevKitC-1-N8R88 MB (Quad)8 MB (Octal)esp32s3-devkitc-1-n8r8
ESP32-S3-DevKitC-1-N16R8V16 MB (Octal)8 MB (Octal)esp32s3-devkitc-1-n16r8v
ESP32-S3-DevKitC-1-N32R8V32 MB (Octal)8 MB (Octal)esp32s3-devkitc-1-n32r8v
ESP32-S3-DevKitC-1U-N88 MB (Quad)-esp32s3-devkitc-1u-n8
ESP32-S3-DevKitC-1U-N8R28 MB (Quad)2 MB (Quad)esp32s3-devkitc-1u-n8r2
ESP32-S3-DevKitC-1U-N8R88 MB (Quad)8 MB (Octal)esp32s3-devkitc-1u-n8r8
ESP32-S3-DevKitM-1-N88 MB (Quad)-esp32s3-devkitm-1-n8
ESP32-S3-DevKitM-1U-N88 MB (Quad)-esp32s3-devkitm-1u-n8

注:命名中的U表示模块带外置天线连接器(external antenna connector),这一信息也体现在 board.h 的文件头注释中。

关于 SPI RAM 与 GPIO 占用的三个要点

  • 未指定版本时,默认按ESP32-S3-DevKitC-1-N8(8 MB Flash)处理,BOARD_VERSION自动取esp32s3-devkitc-1-n8
  • 使用带集成 SPI RAM 的版本(BOARD_VERSION为任意esp32s3-devkitx-1x-*r*取值)时,会启用esp_spi_ram特性;随后可通过启用esp_spi_ram伪模块(pseudomodule)把 SPI RAM 用作堆内存。
  • 不同版本对应不同的 SPI RAM 模式,GPIO 占用情况不同:
    • Quad SPI 模式BOARD_VERSIONesp32s3_devkitx-1x-*r2):GPIO26 ... GPIO32被占用,不可挪作他用;
    • Octal SPI 模式BOARD_VERSIONesp32s3_devkitx-1x-*r8x):会额外启用esp_spi_oct特性,且一旦通过伪模块esp_spi_ram激活 SPI RAM,GPIO33 ... GPIO37被占用,此时使用这些 GPIO 可能产生冲突。

硬件与板级资源配置

MCU

开发板的大部分功能都由 ESP32-S3 SoC 提供。RIOT 的esp32s3-devkit板级定义归属于boards_esp32s3boards_common_esp32s3分组,公共定义(如CPU_FAM = esp32s3)见 boards/common/esp32s3/Makefile.features,并继续向上继承 boards/common/esp32x/Makefile.features(CPU = esp32,所有板至少提供一个 UART)。

板级配置:几乎全 GPIO 引出

ESP32-S3-DevKit 板上除了一颗单引脚 RGB-LED 外没有特殊硬件,所有 GPIO 基本全部引出,因此板级配置是 RIOT 中最为灵活的一种,提供:

  • 最多 20 路 ADC 通道
  • 2 个 SPI
  • 1 个 I2C
  • 2 个 UART
  • 1 颗 RGB-LED

以下 GPIO 未引出:

  • ESP32-S3-DevKitC-1x:GPIO26..GPIO34
  • ESP32-S3-DevKitM-1x:GPIO27..GPIO32

GPIO 的按需复用机制

由于 GPIO 几乎全部引出,同一引脚可以在不同应用里服务于不同外设,但同一时刻只能用于一种外设。例如 GPIO9 既出现在 ADC 通道定义中,又出现在 I2C_DEV(0) 的 SCL 信号定义里。

这种复用之所以可行,是因为 GPIO 只有在以下两种时机之一才被实际占用为特定外设信号:

  • 对应的外设模块被使用,例如启用了periph_i2c
  • 对应的初始化函数被调用,例如adc_init

也就是说,引脚用途取决于先被使用的模块或函数。例如,只要不启用periph_i2c模块,I2C 配置里列出的 GPIO 就可以用于其他用途——GPIO9 此时可作 ADC 通道使用。

在源码层面,这一约定在 periph_conf.h 的注释中反复强调:I2C 引脚仅在启用periph_i2c时被初始化;SPI 引脚仅在首次调用spi_init_csspi_acquire时被初始化;PWM 引脚仅在对应设备调用pwm_init后占用;ADC 引脚仅在调用adc_init后占用。

默认板级配置表

下表是默认的 GPIO 功能分配(按功能排列),可通过应用级配置(application-specific configurations)进行覆盖:

FunctionGPIOsRemarksConfiguration
BUTTON0GPIO0
ADC_LINE(n)GPIO1, GPIO2, GPIO4, GPIO5, GPIO6, GPIO7, GPIO8, GPIO9ADC Channels
PWM_DEV(0)GPIO14, GPIO17, GPIO18, GPIO21-PWM Channels
PWM_DEV(1)GPIO15, GPIO16若未使用模块esp_rtc_timer_32kPWM Channels
I2C_DEV(0) SCLGPIO9I2C Interfaces
I2C_DEV(0) SDAGPIO8I2C Interfaces
RGB-LEDGPIO48由驱动模块ws281x支持
SPI_DEV(0) CLKGPIO12使用 SPI2_HOST (FSPI)SPI Interfaces
SPI_DEV(0) MISOGPIO13使用 SPI2_HOST (FSPI)SPI Interfaces
SPI_DEV(0) MOSIGPIO11使用 SPI2_HOST (FSPI)SPI Interfaces
SPI_DEV(0) CS0GPIO10使用 SPI2_HOST (FSPI)SPI Interfaces
UART_DEV(0) TxDGPIO43Console(配置固定)UART interfaces
UART_DEV(0) RxDGPIO44Console(配置固定)UART interfaces

注意:ESP32-S3-DevKitC-1 revision 1.1 板上的 RGB-LED 连接在GPIO38,而非 GPIO48。

源码级外设配置解析

ADC 与 I2C:GPIO9 的双重身份

periph_conf.h 将 ADC1 上几乎全部引出的引脚声明为 ADC 通道(GPIO3 因是 strapping pin 被排除),ADC_GPIOS默认为{ GPIO1, GPIO2, GPIO4, GPIO5, GPIO6, GPIO7, GPIO8, GPIO9 }。I2C 则只定义了一个接口I2C_DEV(0)I2C0_SCL = GPIO9I2C0_SDA = GPIO8I2C0_SPEED = I2C_SPEED_FAST。全部定义均以#ifndef包裹,允许应用级配置覆盖。

PWM:两组设备与 32 kHz 晶振的取舍

PWM_DEV(0)使用{ GPIO14, GPIO17, GPIO18, GPIO21 }PWM_DEV(1)使用{ GPIO15, GPIO16 },但仅当模块esp_rtc_timer_32k未启用时才生效(periph_conf.h)——因为 GPIO15/GPIO16 正是外部 32 kHz 晶振的接入引脚。

SPI:FSPI(SPI2_HOST)

SPI_DEV(0)配置为SPI0_CTRL = FSPI,SCK/MISO/MOSI/CS0 分别落在 GPIO12/13/11/10(对应 FSPICLK/FSPIQ/FSPID/FSPICS0)。

UART:固定不可改的 Console

UART_DEV(0)的 TxD/RxD 固定为 GPIO43/GPIO44(periph_conf.h),作为 RIOT Console,不可更改。ESP32-S3 最多提供 3 个 UART 接口,此处UART_DEV(1)未使用。

按钮、RGB-LED 与 SAUL 注册

board.h 定义了板级元件:

  • BUTTON0:BOOT 按钮接 GPIO0,因上拉而信号反相,按下为低电平,模式为GPIO_IN_PU,默认下降沿触发中断(BTN0_INT_FLANK = GPIO_FALLING);
  • RGB-LED:板载 SK68XXMINI-HS 智能 RGB LED,WS281X_PARAM_PIN默认 GPIO48、WS281X_PARAM_NUMOF = 1,可用 ws281x 驱动控制(DevKitC-1 rev 1.1 为 GPIO38)。

gpio_params.h 把 BOOT 按钮注册为 SAUL GPIO 设备(名BOOTSAUL_GPIO_INVERTED标志),因此使用saul_default模块时按钮可自动出现在 SAUL 设备列表中(对应 Makefile.dep 中saul_default拉入saul_gpio的逻辑)。

Arduino 兼容映射

arduino_iomap.h 提供了完整的 Arduino 引脚映射:D0/D1 对应 UART_DEV(0)(GPIO44/43),D10-D13 对应 SPI_DEV(0)(CS0/MOSI/MISO/SCK),A0-A5 为 GPIO1/2/4/5/8/9(即 ADC_LINE(7)/(8)/(2)/(6)/(14)/(15)),引脚 3/5/6/9 映射到PWM_DEV(0)的通道 0-3。板级特性arduino_analog/arduino_i2c/arduino_pins/arduino_pwm/arduino_spi/arduino_uart在 Makefile.features 中统一提供。

构建系统与特性清单

Makefile.features 汇总了该板提供的全部特性:

  • 基础外设:periph_adcperiph_i2cperiph_pwmperiph_spi(UART 由公共定义继承)
  • 调试:esp_jtag
  • Arduino 兼容:arduino_analogarduino_i2carduino_pinsarduino_pwmarduino_spiarduino_uart
  • USB:periph_usbdevtinyusb_device

Makefile.include 为每种板级版本声明了对应伪模块(如esp32s3_devkitc_1_n8esp32s3_devkitc_1_n8r2等),用于编译期版本标识;同时设置了 TTY 自动选择过滤器:仅在MOST_RECENT_PORT=1时匹配 Silicon Labs CP2102N USB to UART Bridge Controller 设备,避免多串口环境下选错烧录口。

烧录 RIOT 固件

烧录非常简单。开发板自带 Micro-USB 连接器,内置 reset/boot/flash 逻辑,只需把板子接到宿主机,然后在编程口(programming port)上执行:

BOARD=esp32s3-devkit make flash ...

实际烧录时请根据手中板子的具体型号补充BOARD_VERSION,例如:

# DevKitC-1-N8(默认版本,可省略 BOARD_VERSION) BOARD=esp32s3-devkit make flash # 带 8 MB Octal SPI PSRAM 的 DevKitC-1-N8R8 BOARD=esp32s3-devkit BOARD_VERSION=esp32s3-devkitc-1-n8r8 make flash # DevKitM-1-N8 BOARD=esp32s3-devkit BOARD_VERSION=esp32s3-devkitm-1-n8 make flash

更完整的 ESP32-S3 配置、编译与烧录说明,可参考仓库内 ESP32 SoC 相关的 RIOT 文档(esp32_riot章节),以及 boards/common/esp32s3/doc.md 中关于公共配置的说明。

小结

RIOT 的esp32s3-devkit板级定义通过BOARD_VERSION变量在单一定义下优雅地覆盖了 ESP32-S3-DevKitC-1(含 WROOM-1x/WROOM-2 模块)与 DevKitM-1(含 MINI-1x 模块)的全部常见版本,自动适配 Flash 容量、SPI PSRAM 容量与 Quad/Octal 模式下的 GPIO 占用。得益于几乎全部 GPIO 引出的设计,该板提供了 ADC、SPI、I2C、UART、PWM、RGB-LED、USB(tinyusb)与 Arduino 兼容在内的全套外设能力,且所有外设配置均支持按需复用与应用级覆盖。理解 periph_conf.h 中的#ifndef覆盖机制与“先使用先占用”的 GPIO 复用规则,是高效使用这块开发板的关键。

【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询