跳到正文

ESP32

2025-10-25
test

通过网盘分享的文件:ESP-IDF离线安装包 链接: https://pan.baidu.com/s/1hdxs-AHRd5Ra01bnufpW8Q?pwd=what 提取码: what --来自百度网盘超级会员v4的分享 (直接放D盘当作总系统配置使用,非中文目录)

ESP32 开发笔记 - 简介

什么是 ESP32?

ESP32 是由 Espressif Systems(乐鑫科技)公司开发的一款低功耗、高性能的无线系统级芯片(SoC),广泛应用于物联网(IoT)、智能家居、可穿戴设备等领域。它集成了 Wi-Fi、Bluetooth(包括经典蓝牙和低功耗蓝牙 BLE)、微控制器单元(MCU)和丰富的外围接口,支持双核处理和多种无线通信协议。作为 Arduino 和 MicroPython 等开发平台的热门选择,ESP32 让开发者能够轻松构建连接型项目。

发展历史

  • 起源:ESP32 于 2016 年首次发布,作为 ESP8266 的升级版,解决了前者的单核限制和功能不足问题。
  • 演进:后续版本包括 ESP32-S2(2020 年,专注于安全和低功耗)、ESP32-S3(2021 年,集成 AI 加速和更多 GPIO)、ESP32-C3(2021 年,基于 RISC-V 架构的单核版本)和 ESP32-C6(2023 年,支持 Matter 协议和 Zigbee)。截至 2025 年,ESP32 系列已成为开源硬件社区的标准之一,累计出货量超过数亿片。

ESP32 系列型号介绍与对比

ESP32 系列根据不同应用需求,衍生出多个变体型号。这些型号在处理器架构、无线支持、功耗和外围接口上有所差异,适合从低功耗传感器到高性能 AI 项目的各种场景。下面是主要型号的介绍和对比表格(基于官方规格,实际开发板可能略有差异):

型号 处理器架构 核心数/主频 无线支持 内存配置 外围接口亮点 发布年份 典型应用场景
ESP32 Xtensa LX6 双核/240 MHz Wi-Fi (b/g/n), Bluetooth 4.2/BLE 520 KB SRAM, 4-16 MB Flash GPIO (38), ADC/DAC, I2C/SPI/UART, PWM, I2S, 触摸/霍尔传感器 2016 通用 IoT、智能家居
ESP32-S2 Xtensa LX7 单核/240 MHz Wi-Fi (b/g/n), 无 Bluetooth 320 KB SRAM, 128 KB ROM, 4-16 MB Flash USB OTG, 43 GPIO, 触摸传感器 (14), 安全加密增强 2020 安全设备、低功耗触摸屏
ESP32-S3 Xtensa LX7 双核/240 MHz Wi-Fi (b/g/n), Bluetooth 5.0/BLE 512 KB SRAM, 384 KB ROM, 支持 16 MB PSRAM USB OTG, 45 GPIO, AI 加速 (向量扩展), LCD/Camera 接口 2021 AI 视觉/音频处理、可穿戴设备
ESP32-C3 RISC-V (32-bit) 单核/160 MHz Wi-Fi (b/g/n), Bluetooth 5.0/BLE 400 KB SRAM, 384 KB ROM, 4 MB Flash 22 GPIO, ADC, I2C/SPI/UART, 安全 Boot 2021 低成本传感器节点、Matter 设备
ESP32-C6 RISC-V (32-bit) 单核/160 MHz Wi-Fi 6, Bluetooth 5.0/BLE, Zigbee/Thread 320 KB SRAM, 512 KB ROM, 支持 PSRAM 30 GPIO, Matter 支持, 低功耗 (5 μA Deep Sleep) 2023 智能家居互联、Mesh 网络
ESP32-H2 RISC-V (32-bit) 单核/96 MHz Bluetooth 5.2/BLE, Zigbee/Thread, 无 Wi-Fi 320 KB SRAM, 256 KB ROM, 4 MB Flash 19 GPIO, USB, 低功耗优化, 安全加密 2023 低功耗无线控制、穿戴式设备
ESP32-P4 RISC-V (64-bit) 双核/400 MHz+ Wi-Fi 6, Bluetooth 5.0/BLE, 以太网 768 KB SRAM, 支持大容量 PSRAM/Flash 50+ GPIO, MIPI CSI/DSI, 高性能 AI, eMMC 支持 2024 高端多媒体、边缘计算项目

型号选择建议

  • 入门/通用:选择原版 ESP32,成本低、社区资源丰富。
  • 低功耗/小型项目:ESP32-C3 或 H2,适合电池供电设备。
  • AI/多媒体:ESP32-S3 或 P4,提供向量加速和接口支持。
  • 智能家居互联:ESP32-C6,支持新兴协议如 Matter。 注意:所有型号均兼容 ESP-IDF SDK,但 RISC-V 架构的型号(如 C3/C6)在某些库兼容性上可能需额外优化。开发时,参考官方文档选择合适开发板(如 DevKitC 或 WROOM 模块)。

关键特性

  • 处理器:双核 Xtensa LX6/LX7 处理器,主频高达 240 MHz,支持浮点运算和 DSP 指令。
  • 无线连接:内置 802.11 b/g/n Wi-Fi(支持 AP/Station 模式)和 Bluetooth 5.0(兼容 BLE 和 Mesh 网络)。
  • 内存:典型配置包括 520 KB SRAM 和外部 PSRAM 支持(可扩展到数 MB),以及内置闪存(通常 4-16 MB)。
  • 外围接口:丰富的 I/O,包括 GPIO(多达 38 个)、ADC、DAC、I2C、SPI、UART、PWM、I2S、触摸传感器、霍尔传感器和以太网(部分型号)。
  • 安全与功耗:支持硬件加密(如 AES、SHA)、Secure Boot 和低功耗模式(Deep Sleep 模式下功耗可低至 5 μA)。
  • 开发支持:兼容 ESP-IDF(官方 SDK)、Arduino IDE、MicroPython 和 PlatformIO 等框架,提供丰富的库和示例代码。

ESP-IDF 开发方式和环境配置

ESP-IDF(Espressif IoT Development Framework)是 Espressif 官方提供的软件开发框架,用于 ESP32 系列芯片的固件开发。它支持 C/C++ 语言,专注于 IoT 应用,包括 Wi-Fi、Bluetooth、电源管理和系统特性。最新版本为 master 分支(持续开发中),稳定版可在官方文档中获取。

开发方式

  • 项目结构:典型项目包括 main 文件夹(存放主程序代码)、components(自定义组件)和 CMakeLists.txt(构建脚本)。使用组件化设计,便于模块复用。

  • 主要流程:配置项目(menuconfig)、构建(build)、烧录(flash)和监控(monitor)。支持命令行工具 idf.py,基于 CMake 和 Ninja 构建系统。

  • 示例命令

    • 设置目标芯片:idf.py set-target esp32
    • 配置菜单:idf.py menuconfig(图形化配置 Wi-Fi、GPIO 等参数)
    • 构建项目:idf.py build
    • 烧录并监控:idf.py -p PORT flash monitor(PORT 为串口,如 COM3 或 /dev/ttyUSB0)
  • IDE 支持:推荐使用 VS Code(带 ESP-IDF 扩展)或 Eclipse 插件,便于代码编辑、调试和图形化配置。适合初学者避免纯命令行操作。

环境配置(初学者推荐使用 IDE 安装或官方安装器,避免手动复杂步骤):

  • 通用前提:安装 Python 3.10+、Git、CMake 3.22+ 和 Ninja。确保路径无空格、非 ASCII 字符。

  • Windows

    1. 下载 ESP-IDF Tools Installer(在线版从官网获取,包含 Python、Git 等)。
    2. 安装到短路径(如 %userprofile%\Desktop\esp-idf),运行安装器部署工具链。
    3. 通过 Start 菜单启动 ESP-IDF PowerShell 或 Command Prompt(自动设置环境变量)。
    4. 克隆项目示例:git clone --recursive https://github.com/espressif/esp-idf.git(可选,手动安装时)。
    5. 问题排查:启用系统 UTF-8 支持;检查串口权限。
  • Linux/macOS

    1. 安装依赖包(Ubuntu 示例:sudo apt-get install git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0;macOS 用 Homebrew:brew install cmake ninja dfu-util)。
    2. 克隆 ESP-IDF:mkdir -p ~/esp; cd ~/esp; git clone --recursive https://github.com/espressif/esp-idf.git
    3. 安装工具:cd ~/esp/esp-idf; ./install.sh esp32(或 all 支持所有芯片)。
    4. 设置环境:. $HOME/esp/esp-idf/export.sh(添加别名到 .bashrc 以便重复使用)。
    5. 问题排查:Linux 添加用户到 dialout 组(sudo usermod -a -G dialout $USER);macOS M1 安装 Rosetta 2;检查串口权限。 注意:首次安装后,复制示例项目(如 hello_world)测试。参考官方文档以获取最新细节。

应用场景

ESP32 适用于各种嵌入式项目,例如:

  • 智能家居(如智能插座、门锁)。
  • 无线传感器网络(环境监测、农业物联网)。
  • 可穿戴设备(健康追踪器)。
  • 机器人和无人机控制。
  • 音频/视频流媒体设备。

为什么选择 ESP32?

相比其他微控制器(如 STM32 或 Raspberry Pi Pico),ESP32 的优势在于集成无线功能、低成本(单片价格通常在 2-5 美元)和活跃的社区支持。它平衡了性能、功耗和易用性,是初学者和专业开发者的理想选择。但需注意热管理和天线设计,以优化无线性能。 复制文件:"D:\esp32-idf-ahy\code\idf_5.1.2.code-workspace"到工程目录下; 设置好端口和板卡类型;>ESP-IDF:ADD------

hello world

/*

 * SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD

 *

 * SPDX-License-Identifier: CC0-1.0

 */

  

#include <stdio.h>

#include <inttypes.h>

#include "sdkconfig.h"

#include "freertos/FreeRTOS.h"

#include "freertos/task.h"

#include "esp_chip_info.h"

#include "esp_flash.h"

  

void app_main(void)

{

    printf("Hello world!\n");

  

    /* Print chip information */

    esp_chip_info_t chip_info;

    uint32_t flash_size;

    esp_chip_info(&chip_info);

    printf("This is %s chip with %d CPU core(s), %s%s%s%s, ",

           CONFIG_IDF_TARGET,

           chip_info.cores,

           (chip_info.features & CHIP_FEATURE_WIFI_BGN) ? "WiFi/" : "",

           (chip_info.features & CHIP_FEATURE_BT) ? "BT" : "",

           (chip_info.features & CHIP_FEATURE_BLE) ? "BLE" : "",

           (chip_info.features & CHIP_FEATURE_IEEE802154) ? ", 802.15.4 (Zigbee/Thread)" : "");

  

    unsigned major_rev = chip_info.revision / 100;

    unsigned minor_rev = chip_info.revision % 100;

    printf("silicon revision v%d.%d, ", major_rev, minor_rev);

    if(esp_flash_get_size(NULL, &flash_size) != ESP_OK) {

        printf("Get flash size failed");

        return;

    }

  

    printf("%" PRIu32 "MB %s flash\n", flash_size / (uint32_t)(1024 * 1024),

           (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");

  

    printf("Minimum free heap size: %" PRIu32 " bytes\n", esp_get_minimum_free_heap_size());

  

    for (int i = 10; i >= 0; i--) {

        printf("Restarting in %d seconds...\n", i);

        vTaskDelay(1000 / portTICK_PERIOD_MS);

    }

    printf("Restarting now.\n");

    fflush(stdout);

    esp_restart();

}

介绍:这个代码是什么?

首先,恭喜你开始学习!既然你说自己是完全的新手,什么都不会,我会从最基础的地方开始解释,一步一步带你理解和完成这个示例。别担心,我会用简单的话语,避免专业术语,如果有必要会解释它们。

这个代码是用 C 语言(一种编程语言,用于写计算机程序)写的。它是为 Espressif 公司的芯片(如 ESP32,一种小型电脑芯片,常用于物联网设备,比如智能家居或 WiFi 模块)设计的程序。框架叫 ESP-IDF(Espressif IoT Development Framework),这是 Espressif 官方的开发工具包,帮助你编写、编译(把代码变成机器能懂的指令)和运行程序。

这个代码的具体功能:

  • 打印 "Hello world!"(一个经典的入门消息)。
  • 显示芯片的信息(如型号、核心数、是否有 WiFi/蓝牙、版本、闪存大小)。
  • 显示最小可用内存。
  • 倒计时 10 秒,然后重启芯片。

它已经是完整的代码,但要“完成”它,意思是让它运行起来。你需要:

  1. 设置开发环境(安装工具)。
  2. 创建一个项目。
  3. 把这个代码放进去。
  4. 编译、上传(闪存)到 ESP32 板子上运行。

需要硬件:

  • 一个 ESP32 开发板(比如 ESP32-DevKitC,淘宝或 Amazon 上买,几十块钱)。
  • USB 数据线(A 口到 Micro USB 或 Type-C,根据你的板子)。
  • 电脑(Windows、Linux 或 macOS)。

如果你没有硬件,可以先学代码理解,模拟运行(但实际效果需要板子)。

重要:先告诉我你的操作系统(Windows、Linux 还是 macOS)? 下面我提供所有系统的指南,但步骤稍有不同。如果你用 Windows(最常见),从那里开始。整个过程可能需要 1-2 小时,跟着做就好。如果卡住,随时问我。

第一步:安装 ESP-IDF 开发环境

ESP-IDF 需要安装一些工具:编译器(把 C 代码转成可执行文件)、Git(下载代码)、Python(辅助脚本)等。官方推荐用安装器(简单)或手动安装。

Windows 系统

  1. 准备前提

    • 确保电脑路径不要有空格、括号或非英文字符(比如安装到 C:\esp 而不是 C:\Program Files)。
    • 去控制面板 > 区域 > 管理 > 更改系统区域设置,勾选“Beta: 使用 Unicode UTF-8 支持全球语言”,重启电脑(避免中文路径问题)。
    • 下载 Git、Python 等,但安装器会自动帮你。
  2. 下载并运行安装器

    • 去官网下载 ESP-IDF Tools Installer:https://dl.espressif.com/dl/esp-idf/ (选择最新版本,比如 v5.x 的在线安装器,小文件,会自动下载依赖)。
    • 运行安装器,选择安装路径(如 C:\Users\你的用户名\Desktop\esp-idf),安装所有组件(Python、编译器、CMake、Ninja 等)。
    • 安装完,勾选“添加快捷方式”,会创建“ESP-IDF Command Prompt” 或 “PowerShell” 快捷方式。用这个打开命令行(黑窗口),以后所有操作都在这里做。
  3. 设置环境

    • 打开上面创建的命令提示符快捷方式。它会自动设置变量(如 PATH 和 IDF_PATH),让你能用 ESP-IDF 命令。

Linux 系统(比如 Ubuntu)

  1. 准备前提

    • 打开终端(Ctrl+Alt+T)。

    • 安装依赖包(根据你的发行版):

      • Ubuntu/Debian:运行 sudo apt-get install git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
      • CentOS:sudo yum -y update && sudo yum install git wget flex bison gperf python3 cmake ninja-build ccache dfu-util libusbx
      • Arch:sudo pacman -S --needed gcc git make flex bison gperf python cmake ninja ccache dfu-util libusb python-pip
    • 确保 CMake 是 3.22 或更高。如果不是,用 pip 安装。

  2. 下载 ESP-IDF

    • 创建文件夹:mkdir -p ~/esp 然后 cd ~/esp
    • 下载:git clone --recursive https://github.com/espressif/esp-idf.git
    • 进入文件夹:cd ~/esp/esp-idf
  3. 安装工具

    • 运行 ./install.sh esp32 (针对 ESP32,如果你有其他芯片,改成对应名字)。
    • 如果用 Fish shell,用 ./install.fish
  4. 设置环境

    • 运行 . ~/esp/esp-idf/export.sh (注意点和空格)。
    • 为了方便,下次打开终端自动加载,加到 ~/.bashrc:alias get_idf='. $HOME/esp/esp-idf/export.sh' 然后 source ~/.bashrc
    • 常见问题:如果下载慢,设置 export IDF_GITHUB_ASSETS="dl.espressif.cn/github_assets" 用中国镜像。

macOS 系统

macOS 和 Linux 类似,但有些差异:

  1. 准备前提

    • 安装 Xcode Command Line Tools:运行 xcode-select --install
    • 安装 Homebrew(如果没有):/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    • 用 Homebrew 安装依赖:brew install cmake ninja dfu-util
    • 然后用 pip 安装 Python 包:pip3 install --user pyserial 等(类似 Linux 的 python 依赖)。
  2. 下载和安装:同 Linux,从 mkdir -p ~/esp 开始,下载 git clone,然后 ./install.sh esp32

  3. 设置环境:同 Linux,用 . ~/esp/esp-idf/export.sh。加到 ~/.zshrc 或 ~/.bash_profile 为 alias。

常见问题(所有系统)

  • 路径有空格会导致错误。
  • 防火墙或网络问题:用 VPN 或镜像下载。
  • 如果安装卡住,检查权限(Linux/macOS 用 sudo)。
  • ESP-IDF 版本:用最新稳定版(文档中是 latest,通常 v5.x)。

第二步:创建项目并放入代码

  1. 打开命令行(Windows 用 ESP-IDF Prompt,Linux/macOS 用设置好环境的终端)。

  2. 复制示例项目:

    • Windows:cd %userprofile%\esp 然后 xcopy /e /i %IDF_PATH%\examples\get-started\hello_world hello_world
    • Linux/macOS:cd ~/esp 然后 cp -r $IDF_PATH/examples/get-started/hello_world .
  3. 进入项目文件夹:cd hello_world

  4. 用文本编辑器(比如 Notepad++、VS Code)打开 main/hello_world_main.cmain/main.c(取决于版本)。

  5. 把你提供的代码全部复制粘贴替换进去(覆盖原内容)。保存。

    • 注意:文件头有 SPDX license,这是开源许可,没问题。

第三步:理解代码的内涵(逐行解释)

现在,我们来拆解代码,让你理解每个部分。C 语言像菜谱:包括头文件(配料)、函数(步骤)。主函数是 app_main(),芯片启动时运行它。

  • /* ... */:注释,解释版权。SPDX 是许可,允许免费使用。

  • #include <stdio.h> 等:导入库(别人写好的代码)。

    • stdio.h:打印消息。
    • inttypes.h:处理整数类型。
    • sdkconfig.h:项目配置(从 menuconfig 来)。
    • freertos/FreeRTOS.htask.h:FreeRTOS 是操作系统,帮助多任务(这里用延时)。
    • esp_chip_info.hesp_flash.h:Espressif 的库,获取芯片信息。
  • void app_main(void):主函数,void 意思是没返回值,没参数。

    • printf("Hello world!\n");:打印 "Hello world!" 并换行。printf 是输出函数。
  • 芯片信息部分:

    • esp_chip_info_t chip_info;:定义一个结构体(像盒子,存芯片数据)。
    • uint32_t flash_size;:定义变量存闪存大小(uint32_t 是 32 位无符号整数)。
    • esp_chip_info(&chip_info);:调用函数填充 chip_info。
    • printf("This is %s chip ...");:打印芯片详情。%s 是占位符,CONFIG_IDF_TARGET 是 esp32。检查 features(如 WiFi)用 &(位运算),? : 是条件(如果有 WiFi,打印 "WiFi/")。
    • 计算版本:major_rev = chip_info.revision / 100; (整数除法)。
  • 闪存大小:

    • esp_flash_get_size(NULL, &flash_size);:获取大小,& 是地址。
    • 如果失败,打印错误并返回。
    • 打印大小:%" PRIu32 "MB %s flash\n",PRIu32 是格式化大整数,/ (1024*1024) 转 MB。
  • 内存:esp_get_minimum_free_heap_size() 获取最小空闲堆内存,打印。

  • 倒计时重启:

    • for (int i = 10; i >= 0; i--):循环,从 10 到 0,i-- 减1。
    • printf("Restarting in %d seconds...\n", i);:打印剩余秒。
    • vTaskDelay(1000 / portTICK_PERIOD_MS);:延时 1 秒(FreeRTOS 函数,portTICK_PERIOD_MS 是时钟周期)。
    • fflush(stdout);:刷新输出,确保打印完。
    • esp_restart();:重启芯片。

内涵:这个代码展示 ESP-IDF 基础——打印、获取硬件 info、使用 RTOS 延时、重启。教你如何用 API 查询芯片,理解嵌入式编程(有限资源、实时性)。

第四步:配置、构建、上传和运行

  1. 配置项目:

    • idf.py set-target esp32 (设置芯片类型)。
    • idf.py menuconfig (可选,打开菜单改配置,如 WiFi 或单核模式。如果你的板子是单核 ESP32,启用 CONFIG_FREERTOS_UNICORE)。
  2. 构建(编译):

    • idf.py build
    • 等几分钟,生成二进制文件。如果错误,检查路径或依赖。
  3. 连接板子:

    • 用 USB 连 ESP32 到电脑。
    • 找串口:Windows 在设备管理器看 COMx(比如 COM3)。Linux/macOS 用 ls /dev/tty* 看 /dev/ttyUSB0 或类似。
  4. 上传(闪存):

    • idf.py -p PORT flash (PORT 替换成你的串口,如 COM3 或 /dev/ttyUSB0)。
    • 第一次可能需按板子上的 BOOT 按钮进入下载模式。
  5. 监控输出:

    • idf.py -p PORT monitor
    • 看到 "Hello world!"、芯片 info、倒计时,然后重启。按 Ctrl+] 退出。

成功了!你运行了第一个程序。输出像:

Hello world!
This is esp32 chip with 2 CPU core(s), WiFi/BT/BLE, silicon revision v1.0, 4MB external flash
Minimum free heap size: 123456 bytes
Restarting in 10 seconds...
...
Restarting now.

注意:

为什么主函数可以是 app_main 而不是 main

在标准的 C 语言程序中(比如在电脑上运行的简单程序),入口点(程序开始运行的地方)通常是 int main()void main()。这是 C 标准规定的:编译器会从 main 函数开始执行代码。

但在 ESP-IDF(Espressif 的物联网开发框架)中,情况不同。ESP-IDF 不是一个“裸机”环境(直接运行在硬件上),而是构建在 FreeRTOS(一个小型实时操作系统)之上的框架。框架本身会处理很多底层的东西,比如初始化硬件、启动操作系统、创建任务等。所以,用户写的代码不是从 main 开始,而是从 app_main 开始。

详细解释:

  1. ESP-IDF 的启动过程

    • 当 ESP32 芯片上电或重启时,芯片的引导程序(Bootloader)先运行,然后加载你的程序。

    • ESP-IDF 的框架代码有一个隐藏的 main 函数(在框架的源代码中,比如 esp-idf/components/esp_app_format/esp_app_desc.c 或类似地方),它负责:

      • 初始化 FreeRTOS。
      • 创建一个主任务(Task),并把你的 app_main 函数作为这个任务的入口。
    • 所以,app_main 实际上是运行在 FreeRTOS 的一个任务里的。框架会调用 xTaskCreate(FreeRTOS 函数)来启动它。

    • 这允许你的程序支持多任务(比如同时跑多个函数),而标准的 main 在嵌入式系统中可能不适合这种结构。

  2. 为什么叫 app_main 而不是 main

    • 为了避免冲突:如果用 main,可能会和框架的内部 main 冲突,或者和标准 C 库冲突。
    • ESP-IDF 的设计是让用户关注“应用”(Application)层代码,所以叫 app_main(Application Main)。
    • 在官方文档中明确规定:用户必须实现 void app_main(void) 作为入口点。如果你用 main,编译可能会出错或不工作。
  3. 如果你试着改成 main

    • app_main 改成 main,然后构建(idf.py build),你可能会看到链接错误(Linker Error),比如 “undefined reference to app_main” 或类似。因为框架在找 app_main,找不到就会失败。
    • 要修复,只能改回 app_main
  4. 在哪里可以确认这个?

    • ESP-IDF 官方文档(espressif.com/en/products/sdks/esp-idf)在 “Get Started” 或 “API Reference” 部分有说明:搜索 “app_main” 或 “Application Startup Flow”。
    • 示例项目(如 hello_world)都用 app_main,这是标准实践。

这个设计让 ESP-IDF 更灵活,适合嵌入式开发(资源有限,需要操作系统支持)。


啊?
小丛雨