☰
Zephyr应用: 20-ESP32S3
2026/9/30 2:32:41 网站建设 项目流程

本课目录

  • 第一部分 认识 ESP32-S3
  • 第二部分 安装 ESP32 Toolchain
  • 第三部分 查看支持哪些 ESP32-S3 Board
  • 第四部分 编译 Hello World
  • 第五部分 烧录
  • 第六部分 查看串口
  • 第七部分 Board Directory
  • 第八部分 Device Tree
  • 第九部分 与 STM32 的区别
  • 第十部分 本课实验

摘要:本课带领你体验 Zephyr 的跨平台能力,将同一份 Zephyr 程序从 STM32 迁移到 ESP32-S3 上运行。课程涵盖 ESP32-S3 硬件特性、ESP-IDF 工具链安装、开发板选择、Hello World 编译烧录、串口监视、Board 目录与 Device Tree 结构,并通过与 STM32 的对比,展示 Zephyr 在 GPIO、线程、信号量等 API 上“代码几乎不用修改”的核心优势。最后通过 Hello World、Blinky、Button、UART、Thread 五个实验,掌握 Zephyr 跨平台开发流程。

本课前置要求

在开始本课之前,请先确认你已具备以下基础与条件,以便顺利跟上实验节奏:

  • Zephyr 基础:已完成 STM32 平台的 Hello World 实验,熟悉west build、west flash等基本命令;了解设备树(Device Tree)的基本概念,知道led0、button0等节点别名的作用。
  • 硬件准备:
    • 一块 ESP32-S3 开发板(如官方 DevKitC、WeAct、XIAO 等,本课以esp32s3_devkitc为例);
    • 一根 USB 数据线(需支持数据传输,部分开发板通过 USB Serial/JTAG 直接烧录与监视,无需额外 USB-UART 转接器);
    • 一台已安装 Zephyr 开发环境的电脑(本课基于 Mac + Ubuntu VM 环境演示)。
  • 预计耗时:约 60~90 分钟。其中工具链确认与 Hello World 编译烧录约占一半时间,其余实验(Blinky、Button、UART、Thread)可在此基础上快速完成。

如果你已满足以上条件,就可以直接进入第一部分 认识 ESP32-S3开始学习。

这一课开始学习Zephyr 在第二个平台上的使用,体会 Zephyr 的跨平台能力。

20-ESP32S3

本课目标

学习如何让同一份 Zephyr 程序运行在 ESP32-S3 上。

完成以后你应该能够:

Mac └── Ubuntu VM │ ├── west build ├── west flash └── west espressif monitor │ ▼ ESP32-S3

第一部分 认识 ESP32-S3

ESP32-S3 主要特性:

双核 Xtensa LX7 最高 240MHz WiFi Bluetooth LE USB Serial/JTAG(很多开发板无需额外 USB-UART 转接器) Flash PSRAM(部分型号)

Zephyr 已经支持很多 ESP32-S3 开发板,包括官方 DevKitC、WeAct、XIAO 等。

第二部分 安装 ESP32 Toolchain

Zephyr 使用Espressif SDK(ESP-IDF)。
安装:

west blobs fetch hal_espressif

然后

west update

如果此前已完成 Zephyr 官方安装,这一步通常已经准备好了。

确认:

west zephyr-export

第三部分 查看支持哪些 ESP32-S3 Board

例如:

west boards|grepesp32s3

通常可以看到类似:

esp32s3_devkitc esp32s3_box3 weact_esp32s3_b xiao_esp32s3...

具体取决于你的 Zephyr 版本。

第四部分 编译 Hello World

例如:

cd zephyrproject/zephyr west build-b esp32s3_devkitc samples/hello_world

生成:

build/

里面会看到:

zephyr.bin zephyr.elf zephyr.map

第五部分 烧录

连接 USB。
查看:

ls/dev/ttyUSB\*

或者

ls/dev/ttyACM\*

ESP32-S3 很多开发板会出现:

/dev/ttyACM0

烧录:

west flash

如果自动检测不到:

west flash --esp-device /dev/ttyACM0

第六部分 查看串口
打开:

west espressif monitor

输出:

\*\*\* Booting Zephyr OS build\*\*\* Hello World!

第七部分 Board Directory

查看:

boards/

例如:

boards/espressif/

里面包含:

esp32_devkitc/ esp32s3_devkitc/ esp32s3_box3/

每个 Board 都有:

board.cmake Kconfig\*.dts\*.yaml

第八部分 Device Tree
例如:

esp32s3_devkitc.dts

里面可以看到:

led0 button0 uart0 gpio spi i2c

后续我们所有 GPIO 配置都来自这里。

第九部分 与 STM32 的区别

STM32ESP32-S3
Cortex-MXtensa LX7
CubeMXESP-IDF
ST HALESP HAL
ST-LinkUSB/JTAG
UART 下载USB 下载
无 WiFiWiFi/BLE

但是:

GPIO Thread Semaphore Message Queue Timer WorkQueue

代码几乎不用修改。

STM32 到 ESP32-S3 迁移示例

下面以“点亮板载 LED”为例,对比同一段 GPIO 控制逻辑在 STM32 与 ESP32-S3 上的写法差异。可以看到,除了设备树引脚定义不同,应用层代码几乎完全一致:

步骤STM32(HAL)ESP32-S3(Zephyr)
获取 GPIO 设备__HAL_RCC_GPIOA_CLK_ENABLE()手动开启时钟DEVICE_DT_GET(DT_GPIO_CTLR(LED0_NODE))从设备树获取
配置引脚为输出HAL_GPIO_Init()配置GPIO_MODE_OUTPUT_PPgpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE)
点亮 LEDHAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)gpio_pin_set_dt(&led, 1)
熄灭 LEDHAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)gpio_pin_set_dt(&led, 0)
延时HAL_Delay(500)k_msleep(500)

关键差异:

  • 引脚来源:STM32 需要手动指定端口和引脚号(如GPIOA、GPIO_PIN_5),并手动开启外设时钟;ESP32-S3 通过DT_ALIAS(led0)从设备树自动解析引脚,无需关心具体端口。
  • API 风格:STM32 使用 HAL 库的HAL_GPIO_xxx系列函数;ESP32-S3 使用 Zephyr 统一的gpio_pin_xxx_dt系列 API。
  • 可移植性:STM32 代码换板子要改端口和引脚宏;Zephyr 代码换板子只需改设备树,应用层main()一行不用动。

这就是 Zephyr 最大的优势。

第十部分 本课实验
完成以下实验:

Hello World ↓ Blinky ↓ Button ↓ UART ↓ Thread

下面是一个基于 ESP32-S3 的完整 Blinky 示例。它通过设备树引用 LED 节点,初始化 GPIO 后让板载 LED 以 1 秒周期闪烁:

#include<zephyr/kernel.h>#include<zephyr/device.h>#include<zephyr/drivers/gpio.h>/* 从设备树获取 LED 节点(esp32s3_devkitc.dts 中定义的 led0) */#defineLED0_NODEDT_ALIAS(led0)/* 获取该节点的 GPIO 控制器设备实例 */staticconststructdevice*led_dev=DEVICE_DT_GET(DT_GPIO_CTLR(LED0_NODE));/* 获取该节点对应的 GPIO 引脚编号 */staticconstgpio_pin_tled_pin=DT_GPIO_PIN(LED0_NODE);/* 获取该节点配置的 GPIO 标志(如上拉/下拉/开漏等) */staticconstgpio_dt_spec led=GPIO_DT_SPEC_GET(LED0_NODE,gpios);voidmain(void){intret;/* 检查 GPIO 控制器是否就绪 */if(!device_is_ready(led_dev)){printk("Error: LED device %s is not ready\n",led_dev->name);return;}/* 将 LED 引脚配置为输出模式 */ret=gpio_pin_configure_dt(&led,GPIO_OUTPUT_ACTIVE);if(ret<0){printk("Error: failed to configure LED pin %d\n",led_pin);return;}printk("Blinky started on ESP32-S3\n");/* 循环闪烁:点亮 500ms,熄灭 500ms */while(1){gpio_pin_set_dt(&led,1);/* LED 亮 */k_msleep(500);gpio_pin_set_dt(&led,0);/* LED 灭 */k_msleep(500);}}

编译烧录:

west build-besp32s3_devkitc samples/hello_world west flash

提示:DT_ALIAS(led0)对应esp32s3_devkitc.dts中的led0节点。若你的开发板 LED 引脚不同,只需修改设备树别名或改用GPIO_DT_SPEC_GET指定具体节点,应用层代码无需改动——这正是 Zephyr 跨平台开发的体现。

全部使用ESP32-S3完成。

如果程序编写规范,除了 -b(board 名称)不同,应用层代码几乎无需改动。

本课知识点
✓ ESP32 Toolchain
✓ west flash
✓ west espressif monitor
✓ Board Support
✓ Device Tree
✓ Zephyr 跨平台开发

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

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

立即咨询