本课目录
- 第一部分 认识 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 环境演示)。
- 一块 ESP32-S3 开发板(如官方 DevKitC、WeAct、XIAO 等,本课以
- 预计耗时:约 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 的区别
| STM32 | ESP32-S3 |
|---|---|
| Cortex-M | Xtensa LX7 |
| CubeMX | ESP-IDF |
| ST HAL | ESP HAL |
| ST-Link | USB/JTAG |
| UART 下载 | USB 下载 |
| 无 WiFi | WiFi/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_PP | gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE) |
| 点亮 LED | HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET) | gpio_pin_set_dt(&led, 1) |
| 熄灭 LED | HAL_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 跨平台开发