跳到主要内容

ESP-IDF

本章节包含以下部分,请按需阅读:

ESP-IDF 入门教程

初次接触 ESP32 ESP-IDF 开发,想要快速上手?我们为您准备了一套通用的 入门教程

请注意:该教程使用 ESP32-S3-Zero 作为教学示例,所有硬件代码均基于其引脚布局。在动手实践前,建议您对照手中的开发板引脚图,确认引脚配置无误。

配置 ESP-IDF 开发环境

信息

对于 ESP32-S3-Touch-AMOLED-1.75 开发板,需要使用 ESP-IDF V5.3.1 以上版本。

备注

以下内容以 Windows 系统为例,使用 VS Code + ESP-IDF 扩展 的方式进行开发。Mac/Linux 用户请参考 官方说明

安装 ESP-IDF 开发环境

  1. 前往 ESP-IDF Installation Manager 下载 ESP-IDF 安装管理器。这是乐鑫最新推出的跨平台安装工具,下文将演示如何使用其离线安装功能。

    在页面中点击 Offline Installer 标签,然后在筛选栏中选择 Windows 操作系统和你要安装的版本。

    下载 EIM 和整合包

    确认选择无误后,点击下载按钮。浏览器将自动同时下载两个文件:一个是 ESP-IDF 离线整合包(.zst),另一个是 ESP-IDF 安装器(.exe)

    下载 EIM 和整合包2

    请耐心等待两个文件下载完成。

  2. 下载完成后,双击运行 ESP-IDF 安装器(eim-gui-windows-x64.exe)

    启动后,可在右上角将界面语言切换为中文。

    切换 EIM 语言

    安装工具会自动检测同一目录下是否存在离线整合包。点击 从存档安装

    自动检测整合包

    接下来,选择安装路径。建议使用默认路径;若需自定义,请确保路径中不包含中文或空格。确认无误后,点击 开始安装

    选择安装路径
  3. 当看到如下界面时,表示 ESP-IDF 已安装成功。

    安装成功
  4. 建议同时安装驱动程序。点击 完成安装,然后点击 安装驱动程序

    用 ESP-IDF 安装管理器安装驱动

安装 Visual Studio Code 与 ESP-IDF 扩展

  1. 下载并安装 Visual Studio Code

  2. 安装时建议勾选 通过 Code 打开操作添加到 Windows 资源管理器文件上下文菜单,以便快速打开项目文件夹。

  3. 在 VS Code 中,点击侧边活动栏中的 扩展图标 扩展图标(或使用快捷键 Ctrl + Shift + X)打开 扩展 视图。

  4. 在搜索框中输入 ESP-IDF,找到 ESP-IDF 扩展并点击安装。

    在 VS Code 中搜索并安装 ESP-IDF 扩展

  5. ESP-IDF 扩展版本 ≥ 2.0 时,扩展会自动检测并识别上述步骤中安装的 ESP-IDF 环境,无需手动配置。

示例程序

ESP-IDF 示例程序位于 示例程序包 的 ESP-IDF 目录中。

示例程序基础例程说明
01_AXP2101通过移植后的 XPowersLib 驱动 AXP2101 获取电源相关数据
02_PCF85063驱动 pcf85063 进行时间存储读取功能
03_QMI8658通过移植后的 SensorLib 驱动 qmi8658 获取陀螺仪相关数据
04_SD_MMC使用 sdmmc 方式初始化 SD 卡并读取、写入内容
05_LVGL_WITH_RAM通过开启双缓存、开启 DMA 加速防撕裂等方式运行 LVGL 的 demo
06_I2SCodec使用 I2S 驱动 ES8311 Codec 芯片采集或播放音频

01_AXP2101

【程序说明】

  • 本示例演示了在使用 ESP-IDF 移植 XPowersLib,通过移植后的 XPowersLib 驱动 AXP2101 获取电源相关数据

【硬件连接】

  • 使用 USB 线把板子接入电脑

【代码分析】

  • i2c_init :初始化 I2C 主设备,为与其他设备(如 PMU)进行通信做准备
    • 配置 I2C 参数,包括设置主设备模式、指定 SDA 和 SCL 引脚、启用上拉电阻以及确定时钟频率
    • 安装 I2C 驱动,将配置应用到实际的硬件上
  • pmu_register_read :从 PMU 的特定寄存器读取一系列字节数据
    • 进行参数检查,确保传入的参数有效,避免无效的读取操作
    • 分两步进行 I2C 操作,先发送要读取的寄存器地址,然后读取数据。在读取过程中,根据要读取的字节长度进行不同的处理,确保数据的准确读取。同时,处理 I2C 通信过程中的错误情况,返回相应的状态码以便上层代码判断读取是否成功

【运行效果】

  • 此示例不会点亮屏幕
  • 串口监视器显示参数:芯片温度,是否正在充电,是否放电,是否待机状态,Vbus 是否连接,Vbus 是否良好,充电器状态,电池电压,Vbus 电压,系统电压,电池百分比

    ESP32-S3-Touch-AMOLED-1.75_IDF_1

02_PCF85063

【程序说明】

  • 本示例使用简单的方式驱动 pcf85063 进行时间存储读取功能

【硬件连接】

  • 使用 USB 线把板子接入电脑

【代码分析】

  • i2c_master_init
    • 定义 I2C 配置结构体 conf ,设置主设备模式、SDA 和 SCL 引脚、上拉电阻以及时钟频率
    • 使用 i2c_param_config 函数配置 I2C 参数。如果配置失败,记录错误日志并返回错误码
    • 使用 i2c_driver_install 函数安装 I2C 驱动,将配置应用到实际硬件上,并返回结果
  • rtc_get_time
    • 定义一个长度为 7 的字节数组 data 用于存储读取的时间数据
    • 调用 rtc_read_reg 函数从 RTC 芯片的特定寄存器地址(0x04)开始读取 7 个字节的时间数据。如果读取失败,记录错误日志并返回错误码
    • 对读取到的时间数据进行处理,分别提取秒、分、时、日、星期、月和年的信息,并进行 BCD 到十进制的转换
    • 使用 ESP_LOGI 输出格式化的当前时间

【运行效果】

  • 此示例不会点亮屏幕
  • 串口监视器打印时间信息

    ESP32-S3-Touch-AMOLED-1.75_IDF_1

03_QMI8658

【程序说明】

  • 本示例演示了在使用 ESP-IDF 移植 SensorLib,通过移植后的 SensorLib 驱动 qmi8658 获取陀螺仪相关数据

【硬件连接】

  • 使用 USB 线把板子接入电脑

【代码分析】

  • setup_sensor :设置和初始化与 QMI8658 传感器通信所需的环境和参数
    • 初始化 I2C 通信,确保与传感器的连接通道建立
    • 初始化传感器,检查传感器是否正常连接
    • 配置传感器的加速度计和陀螺仪参数,以满足特定的应用需求
    • 启用传感器,使其开始采集数据
  • read_sensor_data :在一个持续的循环中读取 QMI8658 传感器的数据并进行处理和输出
    • 在循环中不断检查传感器数据是否准备好
    • 当数据准备好时,读取加速度计、陀螺仪、时间戳和温度数据,并进行日志输出
    • 处理数据读取失败的情况,记录错误日志以便进行故障排查
    • 通过延迟控制循环的执行速度,避免过度占用系统资源

【运行效果】

  • 此示例不会点亮屏幕
  • 串口监视器打印传感器数据

    ESP32-S3-Touch-AMOLED-1.75_IDF_1

04_SD_MMC

【程序说明】

  • 本示例演示了使用 sdmmc 方式初始化 SD 卡并读取、写入内容

【硬件连接】

  • 使用 USB 线把板子接入电脑

【代码分析】

  • esp_vfs_fat_sdmmc_mount :将 SD 卡的 FAT 文件系统挂载到指定的挂载点,建立对 SD 卡的文件访问接口
    • 准备挂载配置,确定是否在挂载失败时进行格式化等参数
    • 初始化 SDMMC 主机配置,包括频率等设置。对于特定芯片,可能还需要进行电源控制的初始化
    • 配置 SDMMC 卡槽参数,如总线宽度和 GPIO 引脚设置等
    • 调用函数进行挂载操作,尝试初始化 SD 卡并挂载文件系统。如果成功,可获取 SD 卡信息;如果失败,返回错误码以便进行错误处理
  • s_example_write_file:向指定路径的文件写入数据,用于在 SD 卡上创建和更新文件内容
    • 以写入模式打开指定路径的文件,如果打开失败,记录错误并返回错误码
    • 使用标准 C 库函数 fprintf 将数据写入文件
    • 关闭文件,并记录日志表示文件已写入。如果在打开或写入过程中出现问题,会影响文件的创建和数据的保存

【运行效果】

  • 此示例不会点亮屏幕
  • 串口监视器打印 SD 卡信息

    ESP32-S3-Touch-AMOLED-1.75_IDF_1

05_LVGL_WITH_RAM

【程序说明】

  • 本示例展示 LVGLdemo,通过开启双缓存、开启 DMA 加速防撕裂等方式运行 LVGL 的 demo,可流畅运行动态图文,帧率可达 200~300 帧

【硬件连接】

  • 使用 USB 线把板子接入电脑

【代码分析】

  • app_main :整个应用的初始化和启动流程
    • 硬件初始化:配置和初始化与 LCD 显示和触摸输入(如果有)相关的硬件设备,如 GPIO 引脚、SPI 总线、I2C 总线、LCD 面板驱动和触摸控制器驱动等
    • LVGL 初始化:初始化 LVGL 库,分配绘图缓冲区,注册显示驱动和触摸输入设备驱动(如果有),安装定时器,并创建互斥锁和启动 LVGL 任务
    • 示例展示:最后展示 LVGL 的示例,如小部件示例等
  • example_lvgl_port_task:LVGL 的任务函数,负责处理 LVGL 的定时更新和任务延迟控制,确保 LVGL 界面的流畅运行
    • 定时更新:在任务循环中,通过获取互斥锁,调用 lv_timer_handler 处理 LVGL 的定时器事件,以更新界面状态
    • 延迟控制:根据定时器处理结果确定任务的延迟时间,避免过度占用 CPU 资源,同时确保及时响应 LVGL 的事件

【运行效果】

ESP32-S3-Touch-AMOLED-1.75_IDF_1

06_I2SCodec

【程序说明】

  • 本示例演示了使用 I2S 驱动 ES8311 Codec 芯片采集或播放音频

【硬件连接】

  • 使用 USB 线把板子接入电脑

【代码分析】

  • app_main :整个应用的初始化和启动流程
    • 初始化 GPIO,设置特定引脚为输出模式并控制其电平状态
    • 打印启动信息,提供程序运行的初始状态反馈 LVGL 任务
    • 初始化 I2S 外设,配置 I2S 通道和相关硬件参数,确保音频数据的传输
    • 初始化 ES8311 编解码器,通过配置 I2C 总线和设置编解码器参数,为音频处理做好准备
    • 根据不同的运行模式创建相应的任务,实现音乐播放或麦克风回声功能
  • es8311_codec_init :负责初始化 I2C 外设和配置 ES8311 音频编解码器,确保编解码器能够正常工作
    • 初始化 I2C 总线,包括设置引脚、模式、时钟速度等参数,并安装 I2C 驱动,为与 ES8311 通信建立基础
    • 创建 ES8311 编解码器的句柄,以便后续进行配置操作
    • 配置 ES8311 的时钟参数,如主时钟和从时钟的反转状态、主时钟来源、频率以及采样频率等
    • 初始化 ES8311 编解码器,设置音频分辨率等参数
    • 设置采样频率、音量和麦克风参数(根据需要),以满足特定的音频处理需求

【运行效果】

  • 此示例不会点亮屏幕,只播放音频
  • 串口监视器可查看打印信息

    ESP32-S3-Touch-AMOLED-1.75_IDF_1

【自定义音频】

用户可以通过下述步骤自定义音频播放片段(需要有一定编程基础)

  • 选择您想要播放的任何格式的音乐(例如 a.mp3)
  • 安装 ffmpeg 工具
  • 使用命令行查看音频文件的详细信息,包括文件的编码格式、时长、比特率、音频流的详细信息等
    • ffprobe a.mp3
  • 剪切你的音乐,因为没有足够的空间容纳整首音乐
    • ffmpeg -i a.mp3 -ss 00:00:00 -t 00:00:20 a_cut.mp3
  • 将音乐格式转换为 .pcm
    • ffmpeg -i a_cut.mp3 -f s16le -ar 16000 -ac 1 -acodec pcm_s16le a_cut.pcm
  • 移动裁剪好的 a_cut.pcm 音频文件到 main 目录下
  • main\CMakeList.txt 中的 canon.pcm 替换为 a_cut.pcm
  • main\i2s_es8311_example.c 中的 _binary_canon_pcm_start_binary_canon_pcm_end 替换为 _binary_a_cut_pcm_start_binary_a_cut_pcm_end 编译烧录即可