commit 6fe395792e9313f22d95f7531670232f6cfa2aac Author: DuRuofu Date: Thu Dec 26 16:03:29 2024 +0800 init:创建教程 diff --git a/README.md b/README.md new file mode 100644 index 0000000..ad218e7 --- /dev/null +++ b/README.md @@ -0,0 +1,477 @@ + +### 前言: + +本教程文档旨在记录并分享个人学习ESP32过程中的经验和心得,以帮助其他初学者快速上手ESP32开发。这是一份从初学者视角出发,整理了学习ESP32的一条较为合理的路径和方法的笔记汇编。 + +文档内容基于对大量优质ESP32教程、官方文档以及实际项目实践的总结和理解,力求做到内容清晰、条理分明,既注重基础知识的巩固,也兼顾实战技能的提升。希望通过本教程,读者能少走弯路,从初学到实战开发,逐步掌握ESP32的开发技能。 + +文档内容从基础到进阶,适合循序渐进地学习。如果您是初学者,可以按照章节顺序逐步学习;如果您已有一定的开发经验,可以直接跳转到感兴趣的部分阅读。同时,鼓励读者在学习过程中动手实践,以便更好地理解相关知识点。 + +
+ +### 修订历史: + +| 文档名称 | 版本 | 作者 | 时间 | 备注 | +| :-------------: | :----: | :-----: | :--------: | :-------: | +| ESP32学习计划 | v1.0.0 | DuRuofu | 2023-08-28 | 首次建立 | +| ESP32学习计划 | v1.0.1 | DuRuofu | 2023-09-2 | 补充 | +| ESP32学习计划 | v1.1.0 | DuRuofu | 2023-09-13 | 补充 | +| ESP32学习计划 | v1.2.0 | DuRuofu | 2024-01 | 补充环境搭建 | +| ESP32学习计划 | v1.3.0 | DuRuofu | 2024-02 | 补充IDF基础 | +| ESP32学习计划 | v1.4.0 | DuRuofu | 2024-03 | 补充外设学习 | +| ESP32学习计划 | v1.4.0 | DuRuofu | 2024-04 | 补充WIFI部分 | +| ESP32从菜鸟到入门(一稿) | v1.5.0 | DuRuofu | 2024-12-26 | 整理汇总,重新编排 | + + +
+ +### 当前进度: + +| 章节 | 教程 | 文字教程 | 视频教程 | 配套代码 | +| -------------- | ---------------------- | :--: | :--: | :--: | +| 一、认识ESP32 | 1.1 什么是ESP32 | | | 无 | +| 一、认识ESP32 | 1.2 ESP32开发环境搭建 | | | | +| 一、认识ESP32 | 1.3 初试ESP32-HelloWorld | | | | +| 二、IDF基础与工具使用 | 2.1 ESP32工程结构及构建 | | | | +| 二、IDF基础与工具使用 | 2.2 ESP-IDF项目配置 | | | | +| 二、IDF基础与工具使用 | 2.3 ESP-IDF自定义组件 | | | | +| 二、IDF基础与工具使用 | 2.4 ESP-IDF组件管理器 | | | | +| 三、FreeRTOS基础 | 3.1 FreeRTOS概述 | | | | +| 三、FreeRTOS基础 | 3.2 FreeRTOS多任务与任务管理 | | | | +| 四、外设学习 | 4.1.1 GPIO入门 | | | | +| 四、外设学习 | 4.1.2 UART串口通信 | | | | +| 四、外设学习 | 4.1.3 硬件定时器 | | | | +| 四、外设学习 | 4.1.4 ADC模数转换 | | | | +| 四、外设学习 | 4.1.5 DAC数模转换 | | | | +| 四、外设学习 | 4.1.6 LED PWM控制 | | | | +| 四、外设学习 | 4.1.7 I2C通信 | | | | +| 四、外设学习 | 4.1.8 SPI通信 | | | | +| 四、外设学习 | 4.2.1 分区表设计 | | | | +| 四、外设学习 | 4.2.2 非易失性存储 | | | | +| 四、外设学习 | 4.2.3 FAT文件系统 | | | | +| 四、外设学习 | 4.2.4 SPIFFS文件系统 | | | | +| 五、FreeRTOS进阶 | 5.1 FreeRTOS队列使用教程 | | | | +| 五、FreeRTOS进阶 | 5.2 FreeRTOS信号量教程 | | | | +| 五、FreeRTOS进阶 | 5.3 FreeRTOS互斥量教程 | | | | +| 五、FreeRTOS进阶 | 5.4 FreeRTOS事件组教程 | | | | +| 五、FreeRTOS进阶 | 5.5 FreeRTOS任务通知教程 | | | | +| 五、FreeRTOS进阶 | 5.6 FreeRTOS软件定时器教程 | | | | +| 六、Wi-Fi功能与相关协议 | 6.1.1 Wi-Fi模式与基础操作 | | | | +| 六、Wi-Fi功能与相关协议 | 6.1.2 Wi-Fi STA与AP配置 | | | | +| 六、Wi-Fi功能与相关协议 | 6.2.1 TCP协议应用 | | | | +| 六、Wi-Fi功能与相关协议 | 6.2.2 UDP协议应用 | | | | + +
+ +# 一、认识ESP32 + +> 目标:学会安装ESP-IDF开发环境,并使用其烧录代码,掌握ESP32的基本特点及工具使用。 + +## 1.1 什么是ESP32 + +本节主要介绍ESP32的基本概念,包括其硬件特点、应用场景及功能优势。通过本节内容,初学者可以快速了解ESP32的核心能力以及在物联网开发中的广泛应用。 + +> 在线文字教程:[ESP32及开发环境介绍](./docs/01.认识ESP32/1.1-ESP32及开发环境介绍/ESP32及开发环境介绍) +> 在线视频教程:[ESP32及开发环境介绍] + +## 1.2 ESP32开发环境搭建 + +本节将详细讲解如何在不同操作系统(Windows/Linux/Mac)上搭建ESP-IDF开发环境,涵盖工具链安装、环境变量配置及调试工具的准备等内容。通过本节,读者可以完成开发环境的搭建,为后续开发做好准备。 + +> 在线文字教程:[ESP-IDF开发环境搭建](./docs/01.认识ESP32/1.2-ESP32开发环境搭建/ESP32开发环境搭建) +> 在线视频教程:[ESP-IDF开发环境搭建] + +## 1.3 初试ESP32-HelloWorld + +本节通过“Hello World”示例代码,指导读者创建第一个ESP32工程,并完成编译、烧录及运行调试流程。通过本节内容,初学者可以初步体验ESP-IDF的开发流程,快速进入ESP32开发的世界。 + +> 在线文字教程:[ESP32初体验-HelloWorld](./docs/01.认识ESP32/1.3-初试ESP32-HelloWorld/初试ESP32-HelloWorld) +> 在线视频教程:[ESP32初体验-HelloWorld] +> 教程配套代码:[HelloWorld 示例代码] + +--- + +# 二、IDF基础与工具使用 + +> 目标:熟悉ESP-IDF的架构与开发流程,掌握常用开发工具及调试方法,建立高效开发基础。 + +## 2.1 ESP32工程结构及构建 + +本节详细介绍ESP-IDF项目的基本目录结构与构建流程,包括CMake工具的基础知识,帮助读者掌握ESP32工程的整体组织方式,为日后开发复杂项目奠定基础。 + +> 在线文字教程:[ESP32工程结构及构建](./docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/ESP32工程结构及构建) +> 在线视频教程:[ESP32工程结构及构建] +> 教程配套代码:[基础工程模板](#) + +## 2.2 ESP-IDF项目配置 + +本节将重点讲解如何使用`menuconfig`工具配置项目,包含常见的配置选项及其实际用途。通过本节学习,读者可以根据项目需求快速定制和优化ESP32项目配置。 + +> 在线文字教程:[ESP-IDF项目配置](./docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/ESP-IDF项目配置) +> 在线视频教程:[ESP-IDF项目配置详解] +> 教程配套代码:[项目配置示例代码](#) + +## 2.3 ESP-IDF自定义组件 + +本节讲解如何创建和管理ESP-IDF的自定义组件,包括组件的目录结构、声明与调用方法,以及组件的复用和共享技巧,帮助读者构建模块化项目。 + +> 在线文字教程:[ESP-IDF自定义组件](./docs/02.IDF基础与工具使用/2.3-ESP-IDF自定义组件/ESP-IDF自定义组件) +> 在线视频教程:[ESP-IDF自定义组件开发详解] +> 教程配套代码:[组件示例代码](#) + +## 2.4 ESP-IDF组件管理器 + +本节重点介绍ESP-IDF组件管理器的功能与使用方法,涵盖如何通过组件管理器导入外部库、配置组件依赖,以及解决组件冲突的问题,帮助读者高效管理复杂项目的依赖关系。 + +> 在线文字教程:[ESP-IDF组件管理器](./docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/ESP-IDF组件管理器) +> 在线视频教程:[ESP-IDF组件管理器详解] +> 教程配套代码:[组件管理器示例代码](#) + +--- + +# 三、FreeRTOS基础 + +> 目标:学习FreeRTOS的核心概念与基本功能,掌握任务管理与调度机制,为实时系统开发打下基础。 + +## 3.1 FreeRTOS概述 + +本节将介绍FreeRTOS的核心概念,包括实时操作系统的特点、FreeRTOS的基本架构和设计思想,以及其在嵌入式开发中的应用场景,帮助读者快速了解FreeRTOS的基础知识。 + +> 在线文字教程:[FreeRTOS概述](./docs/03.FreeRTOS基础/3.1-FreeRTOS概述/FreeRTOS概述) +> 在线视频教程:[FreeRTOS概述讲解] +> 教程配套代码:[FreeRTOS初体验示例代码](#) + +## 3.2 FreeRTOS多任务与任务管理 + +本节讲解FreeRTOS中的多任务机制及任务管理方法,包括任务创建、任务删除、任务优先级和任务状态的管理。通过本节学习,读者可以初步掌握在FreeRTOS中实现并发任务的基本技巧。 + +> 在线文字教程:[FreeRTOS多任务与任务管理](./docs/03.FreeRTOS基础/3.2-FreeRTOS多任务与任务管理/FreeRTOS多任务与任务管理) +> 在线视频教程:[FreeRTOS任务管理详解] +> 教程配套代码:[FreeRTOS多任务示例代码](#) + +--- + +# 四、外设学习 + +> 目标:掌握ESP32常用外设的基本操作方法,学会与硬件交互并控制外设设备。 + +## 4.1 基础外设 + +### 4.1.1 GPIO + +本节介绍GPIO(通用输入输出)的基本功能,包括输入、输出及中断操作。通过实际案例,学习如何控制外部设备并响应硬件信号。 + +> 在线文字教程:[GPIO入门](./docs/04.外设学习/4.1-基础外设/4.1.1-GPIO/GPIO入门) +> 在线视频教程:[GPIO开发详解] +> 教程配套代码:[GPIO示例代码](#) + +### 4.1.2 UART + +本节讲解UART串口通信的原理及在ESP32中的实现,内容涵盖UART初始化、数据收发及常见调试方法。 + +> 在线文字教程:[UART串口通信](./docs/04.外设学习/4.1-基础外设/4.1.2-UART/UART串口通信) +> 在线视频教程:[UART开发详解] +> 教程配套代码:[UART示例代码](#) + +### 4.1.3 定时器 + +本节内容包括ESP32硬件定时器的初始化、配置及应用,通过案例学习如何实现精确的时间控制与定时任务。 + +> 在线文字教程:[定时器](./docs/04.外设学习/4.1-基础外设/4.1.3-定时器/定时器) +> 在线视频教程:[定时器开发详解] +> 教程配套代码:[定时器示例代码](#) + +### 4.1.4 ADC(模数转换) + +本节讲解ESP32的ADC模块,包括采样的基本配置与信号转换,并通过示例学习如何读取模拟信号。 + +> 在线文字教程:[ADC模数转换](./docs/04.外设学习/4.1-基础外设/4.1.4-ADC/ADC模数转换) +> 在线视频教程:[ADC开发详解] +> 教程配套代码:[ADC示例代码](#) + +### 4.1.5 DAC(数模转换) + +本节讲解DAC模块的基本操作,学习如何将数字信号转换为模拟信号输出。 + +> 在线文字教程:[DAC数模转换](./docs/04.外设学习/4.1-基础外设/4.1.5-DAC/DAC数模转换) +> 在线视频教程:[DAC开发详解] +> 教程配套代码:[DAC示例代码](#) + +### 4.1.6 LED PWM + +本节介绍LED PWM(脉宽调制)的原理及操作方法,通过实际案例学习如何控制LED亮度。 + +> 在线文字教程:[LED PWM控制](./docs/04.外设学习/4.1-基础外设/4.1.6-LED_PWM/LED_PWM控制) +> 在线视频教程:[PWM开发详解] +> 教程配套代码:[PWM示例代码](#) + +### 4.1.7 I2C + +本节讲解I2C通信协议及在ESP32中的实现,内容涵盖设备寻址、数据收发及实际应用。 + +> 在线文字教程:[I2C通信](./docs/04.外设学习/4.1-基础外设/4.1.7-I2C/I2C通信) +> 在线视频教程:[I2C开发详解] +> 教程配套代码:[I2C示例代码](#) + +### 4.1.8 SPI + +本节介绍SPI通信协议及其在ESP32中的使用,学习如何通过SPI与外部设备通信。 + +> 在线文字教程:[SPI通信](./docs/04.外设学习/4.1-基础外设/4.1.8-SPI/SPI通信) +> 在线视频教程:[SPI开发详解] +> 教程配套代码:[SPI示例代码](#) + +## 4.2 存储外设 + +### 4.2.1 分区表设计 + +本节讲解ESP32的分区表结构及设计方法,学习如何规划存储空间以满足不同开发需求。 + +> 在线文字教程:[分区表设计](./docs/04.外设学习/4.2-存储外设/4.2.1-分区表/分区表) +> 在线视频教程:[分区表开发详解] +> 教程配套代码:[分区表示例代码](#) + +### 4.2.2 非易失性存储(NVS) + +本节介绍NVS的使用方法,学习如何在ESP32中存储和读取持久化数据。 + +> 在线文字教程:[非易失性存储](./docs/04.外设学习/4.2-存储外设/4.2.2-非易失性存储/非易失性存储) +> 在线视频教程:[NVS开发详解] +> 教程配套代码:[NVS示例代码](#) + +### 4.2.3 FAT文件系统 + +本节讲解FAT文件系统的基本操作,学习如何在ESP32中管理文件及目录。 + +> 在线文字教程:[FAT文件系统](./docs/04.外设学习/4.2-存储外设/4.2.3-FAT文件系统/FAT文件系统) +> 在线视频教程:[FAT文件系统开发详解] +> 教程配套代码:[FAT文件系统示例代码](#) + +### 4.2.4 SPIFFS文件系统 + +本节介绍SPIFFS文件系统的基本操作,学习如何在ESP32中使用轻量级文件系统进行数据存储与读取。 + +> 在线文字教程:[SPIFFS文件系统](./docs/04.外设学习/4.2-存储外设/4.2.4-SPIFFS文件系统/SPIFFS文件系统) +> 在线视频教程:[SPIFFS开发详解] +> 教程配套代码:[SPIFFS文件系统示例代码](#) + +--- + +# 五、FreeRTOS进阶 + +> 目标:深入学习FreeRTOS任务间通信与系统优化技术,提升实时应用的开发能力。 + +## 5.1 队列 (Queue) + + 学习FreeRTOS中队列的基本概念及用法,掌握如何在任务之间传递数据,并理解阻塞与优先级特性。 + +>在线文字教程:[FreeRTOS队列使用教程](./docs/05.FreeRTOS进阶/5.1-队列/FreeRTOS队列使用教程) + 在线视频教程:[队列开发详解] + 教程配套代码:[队列示例代码](#) + +## 5.2 信号量 (Semaphore) + + 理解信号量的分类(计数信号量与二值信号量),学习如何通过信号量实现任务同步及资源管理。 + + > 在线文字教程:[FreeRTOS信号量教程](./docs/05.FreeRTOS进阶/5.2-信号量/FreeRTOS信号量教程) + > 在线视频教程:[信号量开发详解] + > 教程配套代码:[信号量示例代码](#) + +## 5.3 互斥量 (Mutex) + + 掌握互斥量的作用及优先级反转问题,学习如何保护共享资源以避免竞争条件。 + + > 在线文字教程:[FreeRTOS互斥量教程](./docs/05.FreeRTOS进阶/5.3-互斥量/FreeRTOS互斥量教程) + > 在线视频教程:[互斥量开发详解] + > 教程配套代码:[互斥量示例代码](#) + +## 5.4 事件组 (Event Group) + + 学习如何通过事件组实现复杂的任务同步逻辑及事件管理。 + + > 在线文字教程:[FreeRTOS事件组教程](./docs/05.FreeRTOS进阶/5.4-事件组/FreeRTOS事件组教程) + > 在线视频教程:[事件组开发详解] + > 教程配套代码:[事件组示例代码](#) + +## 5.5 任务通知 (Task Notifications) + + 了解任务通知的特点,掌握其在任务间高效通信中的实际应用。 + + > 在线文字教程:[FreeRTOS任务通知教程](./docs/05.FreeRTOS进阶/5.5-任务通知/FreeRTOS任务通知教程) + > 在线视频教程:[任务通知开发详解] + > 教程配套代码:[任务通知示例代码](#) + +## 5.6 软件定时器 (Software Timer) + + 通过软件定时器实现定时触发任务逻辑,学习其管理及高级用法。 + + > 在线文字教程:[FreeRTOS软件定时器教程](./docs/05.FreeRTOS进阶/5.6-软件定时器/FreeRTOS软件定时器教程) + > 在线视频教程:[软件定时器开发详解] + > 教程配套代码:[软件定时器示例代码](#) + + +--- + +# 六、Wi-Fi功能与相关协议 + +> 目标:学会使用ESP32的Wi-Fi功能,实现无线网络连接及常见通信协议的应用开发。 + +## 6.1 Wi-Fi功能入门 + +### 6.1.1 Wi-Fi模式与基础操作 + +本节介绍ESP32的Wi-Fi模式,包括STA模式和AP模式,以及如何进行基本的Wi-Fi操作,如连接网络和设置路由器等。 + +> 在线文字教程:[Wi-Fi模式与基础操作](./docs/06. Wi-Fi功能与相关协议/6.1- Wi-Fi功能入门/6.1.1-Wi-Fi模式与基础操作/ Wi-Fi模式与基础操作) +> 在线视频教程:[Wi-Fi模式开发详解] +> 教程配套代码:[Wi-Fi模式示例代码](#) + +### 6.1.2 Wi-Fi STA与AP配置 + +本节介绍如何在ESP32中配置Wi-Fi STA(Station)和AP(Access Point)模式,帮助用户快速实现设备与路由器或其他设备的连接。 + +> 在线文字教程:[Wi-Fi STA与AP配置](./docs/06. Wi-Fi功能与相关协议/6.1- Wi-Fi功能入门/6.1.2-Wi-Fi STA与AP配置/ Wi-Fi STA与AP配置) +> 在线视频教程:[Wi-Fi配置详解] +> 教程配套代码:[Wi-Fi配置示例代码](#) + +## 6.2 网络协议应用 + +### 6.2.1 TCP协议 + +本节讲解TCP协议的原理及在ESP32中的实现,包含连接、数据传输及断开连接的操作步骤。 + +> 在线文字教程:[TCP协议应用](./docs/06. Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.1-TCP协议/TCP协议应用) +> 在线视频教程:[TCP协议开发详解] +> 教程配套代码:[TCP协议示例代码](#) + +### 6.2.2 UDP协议 + +本节介绍UDP协议的工作原理及在ESP32上的应用,包含数据发送与接收的实现方法。 + +> 在线文字教程:[UDP协议应用](./docs/06. Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.2-UDP协议/UDP协议应用) +> 在线视频教程:[UDP协议开发详解] +> 教程配套代码:[UDP协议示例代码](#) + +### 6.2.3 HTTP协议 + +本节介绍ESP32如何实现HTTP协议,包括创建HTTP客户端和服务器的步骤,以及常见的应用场景。 + +> 在线文字教程:[HTTP协议应用](./docs/06. Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.3- HTTP协议/HTTP协议应用) +> 在线视频教程:[HTTP协议开发详解] +> 教程配套代码:[HTTP协议示例代码](#) + +### 6.2.4 WebSocket协议 + +本节讲解WebSocket协议在ESP32中的应用,如何通过WebSocket实现实时双向通信。 + +> 在线文字教程:[WebSocket协议应用](./docs/06. Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.4-WebSocket协议/WebSocket协议应用) +> 在线视频教程:[WebSocket协议开发详解] +> 教程配套代码:[WebSocket协议示例代码](#) + +### 6.2.5 MQTT协议 + +本节介绍ESP32如何实现MQTT协议,包括客户端连接、订阅和发布消息的基本操作。 + +> 在线文字教程:[MQTT协议应用](./docs/06. Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.5-MQTT协议/MQTT协议应用) +> 在线视频教程:[MQTT协议开发详解] +> 教程配套代码:[MQTT协议示例代码](#) + +### 6.2.6 ESP-NOW协议 + +本节介绍ESP32的ESP-NOW协议,讲解其在无需Wi-Fi路由器的情况下实现设备间直接通信的应用场景。 + +> 在线文字教程:[ESP-NOW协议应用](./docs/06. Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.6-ESP-NOW协议/ESP-NOW协议应用) +> 在线视频教程:[ESP-NOW协议开发详解] +> 教程配套代码:[ESP-NOW协议示例代码](#) + +## 6.3 Wi-Fi配网技术 + +### 6.3.1 智能配网(SmartConfig) + +本节讲解ESP32的智能配网技术(SmartConfig),以及如何实现将ESP32设备快速接入Wi-Fi网络。 + +> 在线文字教程:[智能配网](./docs/06. Wi-Fi功能与相关协议/6.3- Wi-Fi配网技术/6.3.1-智能配网/ 智能配网) +> 在线视频教程:[智能配网开发详解] +> 教程配套代码:[智能配网示例代码](#) + +--- + +# 七、蓝牙功能与相关协议 + +> 目标:掌握ESP32蓝牙功能的配置与使用,实现蓝牙低功耗和经典蓝牙的通信功能。 + +## 7.1 蓝牙功能基础 + + +- BLE与经典蓝牙的区别 +- 蓝牙开发环境配置 + +## 7.2 BLE开发 + +- BLE广播与扫描 +- BLE连接与数据传输 + +## 7.3 经典蓝牙开发 +- SPP协议基础 +- 经典蓝牙数据传输 + +--- + +# 八、图形界面开发 + +> 目标:学习LVGL图形库的基础知识,掌握图形界面开发的核心方法,设计简单的GUI界面。 + +## 8.1 LVGL基础 +- LVGL环境搭建 +- LVGL的基本架构 + +## 8.2 常用组件与布局 +- 常用控件的使用(按钮、标签等) +- 布局系统与屏幕适配 + +## 8.3 图形界面项目开发 +- 动态界面更新 +- 图形界面优化技巧 + +--- + +# 九、项目实战 + +> 目标:通过综合项目实践,整合所学知识,独立开发基于ESP32的完整应用,提升实战能力。 + +## 9.1 实战项目:智能家庭控制中心 + +- 多外设联动 +- 无线通信与协议实现 +- 图形界面集成 + +## 9.2 开发经验总结 +- 常见问题与解决方法 +- 代码优化与性能调试 + + +# 参考链接 + +- 孤独的二进制:https://space.bilibili.com/1375767826 +- Augtons正(单片机):https://blog.csdn.net/m0_50064262/article/details/120250151 +- 乐鑫文档:https://docs.espressif.com/projects/esp-idf/zh_CN/release-v4.4/esp32c3/index.html +- 第九个下弦月:https://space.bilibili.com/34165842?spm_id_from=333.999.0.0 +- **Michael_ee**:https://space.bilibili.com/505630520/fans/follow?tagid=529812 +# 常用指令 + +ESP-IDF: +- 创建工程:`idf.py create-project main` +- 新建组件`idf.py -C components create-component {componentName}` +- 清除之前的编译:` idf.py fullclean` +- 编译: `idf.py build` +- 向串口烧录固件: `idf.py -p /dev/ttyUSB0 flash` (`/dev/ttyUSB0` 为目标串口参数,根据实际填写) +- 打开串口监视器:`idf.py -p /dev/ttyUSB0 monitor` (`/dev/ttyUSB0` 为目标串口参数,根据实际填写) +- 配置菜单 :`idf.py menuconfig ` +- 选择芯片型号:` idf.py set-target esp32 ` 不输入参数的话,会列出所有可用型号 +- 一次性执行构建、烧录和监视过程:`idf.py -p /dev/ttyUSB0 flash monitor` (`/dev/ttyUSB0` 为目标串口参数,根据实际填写) + +- 获取ADC基准值:`espefuse.py -p /dev/ttyUSB0 adc_info` +其他: + +- 查询可用串口:`ls /dev/ttyUSB*` +- 添加串口权限(需重启):`sudo usermod -aG dialout username` diff --git a/docs/01.认识ESP32/1.1-ESP32及开发环境介绍/ESP32及开发环境介绍.md b/docs/01.认识ESP32/1.1-ESP32及开发环境介绍/ESP32及开发环境介绍.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/01.认识ESP32/1.2-ESP32开发环境搭建/ESP32开发环境搭建.md b/docs/01.认识ESP32/1.2-ESP32开发环境搭建/ESP32开发环境搭建.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/01.认识ESP32/1.3-初试ESP32-HelloWorld/初试ESP32-HelloWorld.md b/docs/01.认识ESP32/1.3-初试ESP32-HelloWorld/初试ESP32-HelloWorld.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/ESP32工程结构及构建.md b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/ESP32工程结构及构建.md new file mode 100644 index 0000000..3184046 --- /dev/null +++ b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/ESP32工程结构及构建.md @@ -0,0 +1,139 @@ + +| 文档名称 | 版本 | 作者 | 时间 | 备注 | +| ------------ | ------ | ------- | ---------- | ---- | +| ESP32工程结构及构建 | v1.0.0 | DuRuofu | 2024-02-18 | 首次建立 | + +## 一、编译并烧录示例程序 + +首先编译一个示例程序:hello_world + +示例程序目录:esp-idf/examples/get-started/hello_world + +使用vscode打开示例程序: + +![](attachments/20240218170437.png) + +使用自定义的命令 `get_idf_v5` 获取环境变量([关于自定义命令](https://duruofu.github.io/2024/01/25/4.%E7%A1%AC%E4%BB%B6%E7%9B%B8%E5%85%B3/MCU/ESP32/%E6%90%AD%E5%BB%BAesp-idf%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/)): + +![](attachments/20240218170817.png) + +使用`idf.py set-target esp32`配置开发板为ESP32,按照提示使用`idf.py build`命令编译程序: + +![](attachments/20240218171102.png) + +使用`ls /dev/ttyUSB*`查询串口(linux): + +![](attachments/20240218171312.png) + +使用`idf.py -p {PORT} flash`命令烧录代码到esp32: + +![](attachments/20240218171506.png) + +烧录完成如下: + +![](attachments/20240218171516.png) + +使用`idf.py -p {PORT} monitor` 命令打开串口监视器: + +![](attachments/20240218171709.png) + +成功输出: + +![](attachments/20240218171754.png) + +## 二、新建工程 + +### 新建基础工程 + +加载idf.py环境变量后,使用`idf.py create-project filename` 创建工程 + +![](attachments/20240218172510.png) + +创建好的工程如下: + +![](attachments/20240218174120.png) + +进入刚刚创建好的工程下,配置目标芯片,我以ESP32为例 `idf.py set-target esp32` + +![](attachments/20240218174256.png) +设置目标芯片后,会出现如图结构 , 其中build是编译过程中会出现的文件,sdkconfig是运行用于保存menuconfig的文件。 + +### 新建组件 + +不知道组件是啥也不打紧,后面会系统学习,这里只说明如何新建自定义组件: + +使用命令:`idf.py -C components create-component my_component` + +![](attachments/20240218175156.png) +## 三、工程结构 + +### 项目目录 + +esp-idf的标准目录如下所示: + +![](attachments/20240218174718.png) + +- `CMakeLists.txt` 文件,这是 CMake 用于学习如何构建项目的主要文件,可以在这个文件中设置项目全局的 CMake 变量。顶层项目 CMakeLists.txt 文件会导入 /tools/cmake/project.cmake 文件,由它负责实现构建系统的其余部分。该文件最后会设置项目的名称,并定义该项目。 + +- `sdkconfig` 项目配置文件,执行 idf.py menuconfig 时会创建或更新此文件,文件中保存了项目中所有组件(包括 ESP-IDF 本身)的配置信息。 sdkconfig 文件可能会也可能不会被添加到项目的源码管理系统中。 + +- 可选的 `components` 目录中包含了项目的部分自定义组件,并不是每个项目都需要这种自定义组件,但它有助于构建可复用的代码或者导入第三方(不属于 ESP-IDF)的组件。或者,您也可以在顶层 CMakeLists.txt 中设置 EXTRA_COMPONENT_DIRS 变量以查找其他指定位置处的组件。有关详细信息,请参阅 重命名 main 组件。如果项目中源文件较多,建议将其归于组件中,而不是全部放在 “main” 中 + +- - `main` 目录是一个特殊的组件,它包含项目本身的源代码。”main” 是默认名称,CMake 变量 COMPONENT_DIRS 默认包含此组件,但您可以修改此变量。 + +- `build` 目录是存放构建输出的地方,如果没有此目录,idf.py 会自动创建。CMake 会配置项目,并在此目录下生成临时的构建文件。随后,在主构建进程的运行期间,该目录还会保存临时目标文件、库文件以及最终输出的二进制文件。此目录通常不会添加到项目的源码管理系统中,也不会随项目源码一同发布。 + +### 项目 CMakeList.txt 文件 + +每个项目都有一个顶层 `CMakeLists.txt` 文件,包含整个项目的构建设置。默认情况下,项目 CMakeLists 文件会非常小。 + +``` CMake +cmake_minimum_required(VERSION 3.16) +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(teat) +``` + +> `cmake_minimum_required(VERSION 3.5)` 必须放在 CMakeLists.txt 文件的第一行,它会告诉 CMake 构建该项目所需要的最小版本号。ESP-IDF 支持 CMake 3.5 或更高的版本。 + `include($ENV{IDF_PATH}/tools/cmake/project.cmake)` 会导入 CMake 的其余功能来完成配置项目、检索组件等任务。 + `project(teat)` 会创建项目本身,括号内容作为项目名称。 + +上面的内容为 项目**必要部分**,除此之外,还有一些 **可选部分**。 + +- `COMPONENT_DIRS`:组件的搜索目录,默认为 `IDF_PATH/components`、 `工程文件夹/components`、和变量 `EXTRA_COMPONENT_DIRS`。如果您不想在这些位置搜索组件,请覆盖此变量。(通常情况下此变量不需要覆盖,如果想要添加额外的组件,请放到) `工程文件夹/components`或者变`EXTRA_COMPONENT_DIRS`中 +- `EXTRA_COMPONENT_DIRS`:用于搜索组件的其它可选目录列表。路径可以是相对于项目目录的相对路径,也可以是绝对路径。 +- `COMPONENTS`:要构建进项目中的组件名称列表,默认为 `COMPONENT_DIRS` 目录下检索到的所有组件。使用此变量可以“精简”项目以缩短构建时间。请注意,如果一个组件通过 `COMPONENT_REQUIRES` 指定了它依赖的另一个组件,则会自动将其添加到 `COMPONENTS` 中,所以 `COMPONENTS` 列表可能会非常短。 +以上变量中的路径可以是绝对路径,或者是相对于项目目录的相对路径。 +要使用 cmake 中的 `set()` 命令 来设置这些变量。 如 `set(VARIABLE "VALUE")`。 + +### 组件 CMakeList.txt 文件 + +组件是 COMPONENT_DIRS 列表中的任何目录。此列表中的目录可以是组件自身(即包含 CMakeLists.txt 文件的目录),也可以是子目录为组件的顶级目录,例如`$ENV{PROJECT_DIR}/components` + +`构建` 或 `编译` 时,ESP-IDF 搜索所有待构建的组件的顺序为`COMPONENT_DIRS` 指定的顺序依次进行。 +因此,在默认情况下: + +1. 搜索 ESP-IDF 内部组件(`$ENV{IDF_PATH}/components`) +2. 搜索 `EXTRA_COMPONENT_DIRS` 中的组件 +3. 搜索项目组件(`$ENV{PROJECT_DIR}/components`) + +> **注意** : + 如果这些目录中的两个或者多个包含具有相同名字的组件,则使用 **搜索到的最后一个** 位置的组件。这就允许将组件复制到项目目录中再修改以覆盖 ESP-IDF 组件。 + + +组件的最小的CMakeList.txt文件只有一句: + +``` CMake +idf_component_register(SRCS "my_component.c" +                    INCLUDE_DIRS "include") +``` + +- `SRCS` 是源文件列表(_.c、_.cpp、_.cc、_.S),里面所有的源文件都将会编译进组件库中。 +- `INCLUDE_DIRS` 是目录列表,里面的路径会被添加到所有需要该组件的组件(包括 main 组件)全局 include 搜索路径中。 + +除此之外,还有很多非必须的参数: + +- `REQUIRES` 声明组件的public依赖,可供其他依赖者访问 +- `PRIV_REQUIRES`声明private依赖,只能被当前组件访问。 +# 参考链接 + +1. https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/build-system.html \ No newline at end of file diff --git a/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218170437.png b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218170437.png new file mode 100644 index 0000000..60f953d Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218170437.png differ diff --git a/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218170817.png b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218170817.png new file mode 100644 index 0000000..6cb03b2 Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218170817.png differ diff --git a/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218171102.png b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218171102.png new file mode 100644 index 0000000..bab5baf Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218171102.png differ diff --git a/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218171312.png b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218171312.png new file mode 100644 index 0000000..40cb141 Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218171312.png differ diff --git a/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218171506.png b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218171506.png new file mode 100644 index 0000000..7ccadea Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218171506.png differ diff --git a/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218171516.png b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218171516.png new file mode 100644 index 0000000..211693e Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218171516.png differ diff --git a/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218171709.png b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218171709.png new file mode 100644 index 0000000..7866392 Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218171709.png differ diff --git a/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218171754.png b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218171754.png new file mode 100644 index 0000000..399b2e2 Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218171754.png differ diff --git a/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218172510.png b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218172510.png new file mode 100644 index 0000000..9731744 Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218172510.png differ diff --git a/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218174120.png b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218174120.png new file mode 100644 index 0000000..e3c2b1a Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218174120.png differ diff --git a/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218174256.png b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218174256.png new file mode 100644 index 0000000..d906b5b Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218174256.png differ diff --git a/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218174718.png b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218174718.png new file mode 100644 index 0000000..cbeb666 Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218174718.png differ diff --git a/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218175156.png b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218175156.png new file mode 100644 index 0000000..6af622e Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/attachments/20240218175156.png differ diff --git a/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/ESP-IDF项目配置.md b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/ESP-IDF项目配置.md new file mode 100644 index 0000000..09483bd --- /dev/null +++ b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/ESP-IDF项目配置.md @@ -0,0 +1,216 @@ + +| 文档名称 | 版本 | 作者 | 时间 | 备注 | +| ---- | ---- | ---- | ---- | ---- | +| ESP-IDF项目配置 | v1.0.0 | DuRuofu | 2024-02-18 | 首次建立 | + +# ESP-IDF项目配置(组件配置) + + +## 一、Menuconfig的使用 + +打开示例工程:esp-idf/examples/get-started/blink + +这个历程是用来实现LED闪烁的程序,这个工程使用了一个叫`led_strip`的组件,所以代码稍显复杂,但这并不重要,我们的重点不再这里。 + +编译代码,烧录,发现并没有现象。(哈哈,这是由于我们并没有配置LED的引脚) + +下面使用`idf.py menuconfig ` 命令打开 `Menuconfig` (配置菜单): + +![](attachments/20240218212849.png) + +运行命令后,我们得到了一个位于终端的可视化配置菜单。 + +选择 `Example Configuration` 选项: + +![](attachments/20240218212956.png) + +会看到两个选项,修改Blink GPIO为自己开发板上的引脚,我这里是2号。 + +![](attachments/20240218213211.png) + +重新编译工程,烧录代码。 + +![](attachments/20240218213648.png) + +成功点亮LED(😊),相信通过这一番操作,我们对menuconfig有了基本的认识,说人话就是这玩意可以方便的帮助我们修改程序里的参数,在不修改代码的情况下。 +## 二、为什么要用组件配置(Menuconfig) + +1. 组件配置可以将相关配置常量移出代码,增强配置的可复用度 +2. 组件配置变量也可以被CMake访问,可以通过手写逻辑实现根据配置执行不同的构建方案。(如某个源文件要不要添加到构建系统) +3. 组件配置生成的宏定义,配合C语言的预处理语句,可以针对不同的配置改变代码解结构。 +4. 组件配置生成的宏定义在C语言中是全局的宏定义,可以在任意处访问配置项。只需要#include "sdkconfig.h"即可。 + + +## 三、组件配置相关文件 + +在 ESP-IDF 构建系统中,有这么几种文件和组件配置相关。它们分别是: + +1. Kconfig文件 +2. Kconfig.projbuild文件 +3. sdkconfig文件 +4. sdkconfig.default文件 +5. sdkconfig.old文件 +6. sdkconfig.ci文件 +7. sdkconfig.old文件 + +>`sdkconfig.default`文件还可以针对某种设备单独添加,例如: + 对于`ESP32`和`ESP32-S3`,则分别对应`sdkconfig.default.esp32`和`sdkconfig.default.esp32s3`。 + +在详细讲解组件配置之前,先分别概括这几个文件的作用分别是什么: + +| 文件名 | 位置 | 作用 | 概述 | +| ---- | ---- | ---- | ---- | +| Kconfig | 组件目录 | 用于生成menuconfig中的菜单项 | 菜单模板 | +| Kconfig.projbuild | 组件目录 | 用于生成menuconfig中的顶层菜单 | 菜单模板 | +| sdkconfig | 项目根目录 | 用于保存 Kconfig 设置的键值对形式,手动更改无效 | 保存设置 | +| sdkconfig.default | 项目根目录 | 自定义 sdkconfig 的默认值,不会被构建系统更改,格式与 sdkconfig 相同 | 缺省值清单 | +| sdkconfig.old | 项目根目录 | 当保存旧的 menuconfig 设置时,自动备份原来的 sdkconfig 文件 | 备份 | +其中`Kconfig` 和 `Kconfig.projbuild` 文件用于定义菜单,其余文件用于保存我们配置的值。 + +查看main组件文件夹,我们可以发现这个工程里的 `Kconfig.projbuild` 文件: + +![](attachments/20240218215404.png) + + +文件内容如下: + +``` + +menu "Example Configuration" + + orsource "$IDF_PATH/examples/common_components/env_caps/$IDF_TARGET/Kconfig.env_caps" + + choice BLINK_LED + prompt "Blink LED type" + default BLINK_LED_GPIO if IDF_TARGET_ESP32 || !SOC_RMT_SUPPORTED + default BLINK_LED_RMT + help + Defines the default peripheral for blink example + + config BLINK_LED_GPIO + bool "GPIO" + config BLINK_LED_RMT + bool "RMT - Addressable LED" + endchoice + + config BLINK_GPIO + int "Blink GPIO number" + range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX + default 5 if IDF_TARGET_ESP32 + default 18 if IDF_TARGET_ESP32S2 + default 48 if IDF_TARGET_ESP32S3 + default 8 + help + GPIO number (IOxx) to blink on and off or the RMT signal for the addressable LED. + Some GPIOs are used for other purposes (flash connections, etc.) and cannot be used to blink. + + config BLINK_PERIOD + int "Blink period in ms" + range 10 3600000 + default 1000 + help + Define the blinking period in milliseconds. + +endmenu + +``` + +不难发现,下面这部分就和我们刚才见到的配置项有关: + +``` + config BLINK_GPIO + int "Blink GPIO number" + range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX + default 5 if IDF_TARGET_ESP32 + default 18 if IDF_TARGET_ESP32S2 + default 48 if IDF_TARGET_ESP32S3 + default 8 + help + GPIO number (IOxx) to blink on and off or the RMT signal for the addressable LED. + Some GPIOs are used for other purposes (flash connections, etc.) and cannot be used to blink. + + config BLINK_PERIOD + int "Blink period in ms" + range 10 3600000 + default 1000 + help + Define the blinking period in milliseconds. + +``` + +即使不了解 Kconfig (ps: Kconfig 上面这些就是依赖Kconfig写的),我们也能猜出这几行代码干了啥: 定义了两个配置项,`BLINK_GPIO` 和 `BLINK_PERIOD` , 然后添加默认值,添加说明等。 + +关于 Kconfig 的写法随便搜索一下就能学会,这里不在赘述。 + +## 四、创建组件配置 + + +下面我们试着自己写一个组件配置,复制`blink`历程到自己的目录,重命名为 `blink_menuconfig` + +![](attachments/20240218221414.png) + +我们删除原有的 `Kconfig.projbuild` 文件,自己重新写一个,原来的`Kconfig.projbuild`里有三个配置项:分别是: + +- `BLINK_LED`: 控制LED模式(选项) +- `BLINK_GPIO`:LED连接的引脚 +- `BLINK_PERIOD`:LED闪烁的时间 + +### 创建框架(menu) + +我们先创建个框架: + +``` Kconfig +menu "点灯配置" + +endmenu + +``` + +这里菜单项可以使用中文,打开配置菜单可以看到: + +![](attachments/20240218222722.png) + +### ### 创建单选选项(choice) + +``` +menu "点灯配置" + choice BLINK_LED + prompt "LED模式" + default BLINK_LED_GPIO + + config BLINK_LED_GPIO + bool "GPIO" + config BLINK_LED_RMT + bool "RMT - Addressable LED" + endchoice +endmenu + +``` + +效果: +![](attachments/20240218223154.png) + +![](attachments/20240218223205.png) +### 创建菜单项目(config) + +``` + config BLINK_GPIO + int "LED引脚" + default 2 + help + This is an int BLINK_GPIO. + + config BLINK_PERIOD + int "LED周期" + default 1000 + help + This is a int BLINK_GPIO. +``` + +效果: + +![](attachments/20240218224055.png) + +# 参考链接 + +1. https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/kconfig.html \ No newline at end of file diff --git a/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218212849.png b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218212849.png new file mode 100644 index 0000000..481789a Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218212849.png differ diff --git a/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218212956.png b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218212956.png new file mode 100644 index 0000000..0b8ecff Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218212956.png differ diff --git a/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218213211.png b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218213211.png new file mode 100644 index 0000000..a68ede8 Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218213211.png differ diff --git a/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218213648.png b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218213648.png new file mode 100644 index 0000000..9880cbd Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218213648.png differ diff --git a/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218215404.png b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218215404.png new file mode 100644 index 0000000..59dde5e Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218215404.png differ diff --git a/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218221414.png b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218221414.png new file mode 100644 index 0000000..0cffb68 Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218221414.png differ diff --git a/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218222722.png b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218222722.png new file mode 100644 index 0000000..3f94a1d Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218222722.png differ diff --git a/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218223154.png b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218223154.png new file mode 100644 index 0000000..4a62e4a Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218223154.png differ diff --git a/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218223205.png b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218223205.png new file mode 100644 index 0000000..7f2b9cc Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218223205.png differ diff --git a/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218224055.png b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218224055.png new file mode 100644 index 0000000..48c890b Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/attachments/20240218224055.png differ diff --git a/docs/02.IDF基础与工具使用/2.3-ESP-IDF自定义组件/ESP-IDF自定义组件.md b/docs/02.IDF基础与工具使用/2.3-ESP-IDF自定义组件/ESP-IDF自定义组件.md new file mode 100644 index 0000000..6742c15 --- /dev/null +++ b/docs/02.IDF基础与工具使用/2.3-ESP-IDF自定义组件/ESP-IDF自定义组件.md @@ -0,0 +1,222 @@ + +### 说明: + +1. 本文档由DuRuofu撰写,由DuRuofu负责解释及执行。 + +### 修订历史: + +| 文档名称 | 版本 | 作者 | 时间 | 备注 | +| ---- | ---- | ---- | ---- | ---- | +| ESP-IDF自定义组件 | v1.0.0 | DuRuofu | 2024-02-18 | 首次建立 | + +
+ +# ESP-IDF自定义组件 + +## 一 、自定义组件介绍: + +之前在[ESP32工程结构及构建](../2.1-ESP32工程结构及构建/ESP32工程结构及构建.md)里提到esp-idf项目的结构如下: + +![](attachments/20240218174718.png) + +其中components文件夹就是我们自定义的组件。ESP-IDF组件机制就是代码模块化的一种体现,将特定功能的代码封装为一个个组件并对外暴露接口,增强代码的可复用性,提高代码维护效率。 + + +## 二 、自定义组件示例: + + +下面我们基于[ESP-IDF项目配置](../2.2-ESP-IDF项目配置/ESP-IDF项目配置.md)中编写的[blink_menuconfig](https://github.com/DuRuofu/ESP32_Learning/tree/master/02.idf_basis/blink_menuconfig)工程来实现一个自定义的控制闪烁的组件。 + +复制工程,重命名为`blink_component` + +使用命令:`idf.py -C components create-component led_blink` + +目录下多出一个叫`blink_component`的组件 + +![](attachments/20240218231930.png) + +组件的代码结构如下: + +``` +- led_blink/ - CMakeLists.txt + - Kconfig + - led_blink.c + - include/ + - led_blink.h + +``` + +将点灯的函数定义裁剪到 `led_blink.c` + +``` c +#include + #include "led_blink.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/gpio.h" +#include "esp_log.h" +#include "led_strip.h" +#include "sdkconfig.h" + + +static const char *TAG = "led_blink"; + +/* Use project configuration menu (idf.py menuconfig) to choose the GPIO to blink, + or you can edit the following line and set a number here. +*/ +#define BLINK_GPIO CONFIG_BLINK_GPIO + + +#ifdef CONFIG_BLINK_LED_RMT + +led_strip_handle_t led_strip; + +void blink_led(void) +{ + /* If the addressable LED is enabled */ + if (s_led_state) { + /* Set the LED pixel using RGB from 0 (0%) to 255 (100%) for each color */ + led_strip_set_pixel(led_strip, 0, 16, 16, 16); + /* Refresh the strip to send data */ + led_strip_refresh(led_strip); + } else { + /* Set all LED off to clear all pixels */ + led_strip_clear(led_strip); + } +} + +void configure_led(void) +{ + ESP_LOGI(TAG, "Example configured to blink addressable LED!"); + /* LED strip initialization with the GPIO and pixels number*/ + led_strip_config_t strip_config = { + .strip_gpio_num = BLINK_GPIO, + .max_leds = 1, // at least one LED on board + }; + led_strip_rmt_config_t rmt_config = { + .resolution_hz = 10 * 1000 * 1000, // 10MHz + }; + ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip)); + /* Set all LED off to clear all pixels */ + led_strip_clear(led_strip); +} + +#elif CONFIG_BLINK_LED_GPIO + +void blink_led(int s_led_state) +{ + /* Set the GPIO level according to the state (LOW or HIGH)*/ + gpio_set_level(BLINK_GPIO, s_led_state); +} + +void configure_led(void) +{ + ESP_LOGI(TAG, "Example configured to blink GPIO LED!"); + gpio_reset_pin(BLINK_GPIO); + /* Set the GPIO as a push/pull output */ + gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT); +} + +#endif + + +``` + + +在头文件声明函数: +``` c +#ifndef LED_BLINK_H +#define LED_BLINK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +// Function declarations +void blink_led(int s_led_state); +void configure_led(void); + +#ifdef __cplusplus +} +#endif + +#endif /* LED_BLINK_H */ + +``` + +组件下新建`idf_component.yml`文件引入组件依赖的`led_strip`组件 + +``` +dependencies: +  espressif/led_strip: "^2.0.0" +``` + +新建Kconfig文件,移植组件配置,参考[ESP-IDF项目配置](../2.2-ESP-IDF项目配置/ESP-IDF项目配置.md) + +``` +menu "点灯组件配置" + choice BLINK_LED + prompt "LED模式" + default BLINK_LED_GPIO + + config BLINK_LED_GPIO + bool "GPIO" + config BLINK_LED_RMT + bool "RMT - Addressable LED" + endchoice + + config BLINK_GPIO + int "LED引脚" + default 2 + help + This is an int BLINK_GPIO. + + config BLINK_PERIOD + int "LED周期" + default 1000 + help + This is a int BLINK_GPIO. + + +endmenu + +``` + + +这样就编写好了一个组件。 + + +然后在main组件里引入模块使用即可: + +```c +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "led_blink.h" + +static const char *TAG = "example"; +uint8_t s_led_state = 0; + +void app_main(void) +{ + /* Configure the peripheral according to the LED type */ + configure_led(); + + while (1) { + ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" : "OFF"); + blink_led(s_led_state); + /* Toggle the LED state */ + s_led_state = !s_led_state; + vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS); + } +} +``` + + +这样就完成了代码的模块化,关于组件依赖,嵌套还有一些值得注意的地方,不过目前入门阶段不必深究,后续学习过程中会娓娓道来。 +# 参考链接 + +1. https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/build-system.html \ No newline at end of file diff --git a/docs/02.IDF基础与工具使用/2.3-ESP-IDF自定义组件/attachments/20240218174718.png b/docs/02.IDF基础与工具使用/2.3-ESP-IDF自定义组件/attachments/20240218174718.png new file mode 100644 index 0000000..cbeb666 Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.3-ESP-IDF自定义组件/attachments/20240218174718.png differ diff --git a/docs/02.IDF基础与工具使用/2.3-ESP-IDF自定义组件/attachments/20240218231930.png b/docs/02.IDF基础与工具使用/2.3-ESP-IDF自定义组件/attachments/20240218231930.png new file mode 100644 index 0000000..41115be Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.3-ESP-IDF自定义组件/attachments/20240218231930.png differ diff --git a/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/ESP-IDF组件管理器.md b/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/ESP-IDF组件管理器.md new file mode 100644 index 0000000..d18e8df --- /dev/null +++ b/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/ESP-IDF组件管理器.md @@ -0,0 +1,200 @@ + +### 说明: + +1. 本文档由DuRuofu撰写,由DuRuofu负责解释及执行。 +2. 本文介绍ESP-IDF组件管理器的使用 + +### 修订历史: + +| 文档名称 | 版本 | 作者 | 时间 | 备注 | +| ---- | ---- | ------------ | ------ | +| ESP-IDF组件管理器 |v1.0.0| DuRuofu | 2024-02-18 | 首次建立 | + +
+ +# ESP-IDF组件管理器 + +## 一、啥是组件管理器 + +ESP-IDF官方对组件管理器的描述是这样的: + +>The IDF Component Manager is a tool that allows developers to manage components for the ESP-IDF development framework. The tool is compatible with ESP-IDF versions 4.1 and later, and is included by default starting with ESP-IDF version 4.4. +> + The ESP Component Registry is a central repository for components that can be used with the ESP-IDF. It is hosted at [https://components.espressif.com](https://components.espressif.com/) and provides a convenient way for developers to discover and download components for their projects. +> + With the IDF Component Manager, developers can easily install components from the ESP-IDF Component Registry, streamlining the process of adding new functionality to their projects. + +说人话就是,世上本没有组件管理器,自定义组件多了,就有了组件库,就有了组件管理器。 + +如果用学过node,那我们可以把组件管理器比作npm包管理器,把`idf_component.yml`比作`package.jso`,真的一模一样。(不知道node,npm当我没说)。 + +我们可以在这:[ ESP-IDF components](https://components.espressif.com) 找到乐鑫发布的一些他们帮我们写好的”自定义组件“。 + +使用这些组件我们可以快速的完成一些功能的实现,比如移植还有点难度的LVGL库,现在只要一行命令就能移植完成。 + +![](attachments/20240219001357.png) + + +## 二、组件管理器使用示例: + +下面我们基于[ESP-IDF自定义组件](../2.3-ESP-IDF自定义组件/ESP-IDF自定义组件.md)教程中编写的[blink_component](https://github.com/DuRuofu/ESP32_Learning/tree/master/02.idf_basis/blink_component)工程来实现使用一下官方的组件管理器,复制工程,重命名为`button_component` + +### 2.1 组件介绍 + +在这部分,我们学着使用官方提供的组件,这里以[button](https://components.espressif.com/components/espressif/button?language=en)组件为例: + +![](attachments/20240229163020.png) + +按键组件实现了 GPIO 和 ADC 两种按键,并允许同时创建两种不同的按键。并且提供多种按键事件,包括按下,弹起,按下弹起 1 次,按下弹起 2 次等。 + +这里是该组件的中文文档:[按键组件使用](https://docs.espressif.com/projects/esp-iot-solution/zh_CN/latest/input_device/button.html) + +![](attachments/20240229163215.png) + + +### 2.2 引入组件 + +输入命令添加依赖 `idf.py add-dependency "espressif/button^3.2.0"` : + +![](attachments/20240229164040.png) + +添加完成: + +![](attachments/20240229164107.png) + +main下多出组件依赖文件,里面写上了我们依赖的组件`espressif/button` + +编译项目:`idf.py build` + +idf会自动下载我们依赖的组件,存放到`managed_components`文件夹中,如下图: + +![](attachments/20240229164459.png) + +### 2.3 组件的使用 + +组件的使用各不相同,使用时具体参考对应的组件文档即可:[ESP-IoT-Solution 编程指南](https://docs.espressif.com/projects/esp-iot-solution/zh_CN/latest/index.html) + +下面的内容参考文档也能完成,这里不再详细描述: + +#### 创建按键 + +``` c +// create gpio button +button_config_t gpio_btn_cfg = { + .type = BUTTON_TYPE_GPIO, + .long_press_time = CONFIG_BUTTON_LONG_PRESS_TIME_MS, + .short_press_time = CONFIG_BUTTON_SHORT_PRESS_TIME_MS, + .gpio_button_config = { + .gpio_num = 0, + .active_level = 0, + }, +}; +button_handle_t gpio_btn = iot_button_create(&gpio_btn_cfg); +if(NULL == gpio_btn) { + ESP_LOGE(TAG, "Button create failed"); +} + +``` + +详解: + +1. `button_config_t gpio_btn_cfg`:定义了一个名为 `gpio_btn_cfg` 的结构体变量,用于配置按钮的参数。 +2. `.type = BUTTON_TYPE_GPIO`:指定按钮的类型为 GPIO 类型,表示这是一个基于 GPIO 的按钮。 +3. `.long_press_ticks = CONFIG_BUTTON_LONG_PRESS_TIME_MS`:设置长按触发的时间阈值,单位为毫秒。 +4. `.short_press_ticks = CONFIG_BUTTON_SHORT_PRESS_TIME_MS`:设置短按触发的时间阈值,单位为毫秒。 +5. `.gpio_button_config`:GPIO 按钮的具体配置信息。 + - `.gpio_num = 0`:指定了 GPIO 编号为 0,即对应 ESP32 开发板上的某个 GPIO 引脚。 + - `.active_level = 0`:指定了按钮的触发电平为低电平(0),即当 GPIO 引脚为低电平时被认为按钮被按下。 +6. `button_handle_t gpio_btn = iot_button_create(&gpio_btn_cfg)`:调用 `iot_button_create` 函数创建一个按钮实例,并将配置信息传递给该函数,返回一个按钮句柄 `gpio_btn`。 +7. `if(NULL == gpio_btn)`:检查按钮实例是否成功创建。 + - 如果 `gpio_btn` 为 `NULL`,则打印错误日志,提示按钮创建失败。 + + +#### 注册回调函数 + +Button 组件支持为多个事件注册回调函数,每个事件都可以注册一个回调函数,当事件发生时,回调函数将会被调用。 + +``` c + +static void button_single_click_cb(void *arg,void *usr_data) +{ + ESP_LOGI(TAG, "BUTTON_SINGLE_CLICK"); +} + +iot_button_register_cb(gpio_btn, BUTTON_SINGLE_CLICK, button_single_click_cb,NULL); + +``` + +详解: +1. `static void button_single_click_cb(void *arg, void *usr_data)`:定义了一个静态的回调函数 `button_single_click_cb`,该函数在按钮单击事件发生时被调用。函数接受两个参数,一个是 `arg`,用于传递按钮相关的参数,另一个是 `usr_data`,用于传递用户数据。 + +2. `iot_button_register_cb(gpio_btn, BUTTON_SINGLE_CLICK, button_single_click_cb, NULL)`:调用 `iot_button_register_cb` 函数注册了一个按钮单击事件的回调函数。 + - `gpio_btn`:表示要注册回调函数的按钮实例。 + - `BUTTON_SINGLE_CLICK`:指定注册的是单击事件的回调函数。 + - `button_single_click_cb`:指定要注册的回调函数,即单击事件发生时调用的函数。 + - `NULL`:表示没有用户数据需要传递给回调函数。 + + +结合上一篇教程的LED闪烁的代码,最终代码如下:`blink_example_main.c` + +``` c + +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "led_blink.h" +#include "iot_button.h" + + +static const char *TAG = "example"; +uint8_t s_led_state = 0; + + +// 按键回调函数(单击,led灯状态取反) +static void button_single_click_cb(void *arg,void *usr_data) +{ + ESP_LOGI(TAG, "BUTTON_SINGLE_CLICK"); + ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" : "OFF"); + s_led_state = !s_led_state; + blink_led(s_led_state); +} + + +void app_main(void) +{ + /* Configure the peripheral according to the LED type */ + configure_led(); + // create gpio button + button_config_t gpio_btn_cfg = { + .type = BUTTON_TYPE_GPIO, + .long_press_time = CONFIG_BUTTON_LONG_PRESS_TIME_MS, + .short_press_time = CONFIG_BUTTON_SHORT_PRESS_TIME_MS, + .gpio_button_config = { + .gpio_num = 0, + .active_level = 0, + }, + }; + + button_handle_t gpio_btn = iot_button_create(&gpio_btn_cfg); + if(NULL == gpio_btn) { + ESP_LOGE(TAG, "Button create failed"); + } + + // 注册按键回调 + iot_button_register_cb(gpio_btn, BUTTON_SINGLE_CLICK, button_single_click_cb,NULL); + + while (1) { + vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS); + } +} + + +``` + +实现的效果为:单击开发板上的按键,可以控制LED翻转。 + +以上就是ESP32组件管理器及第三方组件的使用。 +# 参考链接 + +1. https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/tools/idf-component-manager.html \ No newline at end of file diff --git a/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/attachments/20240219001357.png b/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/attachments/20240219001357.png new file mode 100644 index 0000000..b8b14ee Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/attachments/20240219001357.png differ diff --git a/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/attachments/20240229163020.png b/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/attachments/20240229163020.png new file mode 100644 index 0000000..c02e3bc Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/attachments/20240229163020.png differ diff --git a/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/attachments/20240229163215.png b/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/attachments/20240229163215.png new file mode 100644 index 0000000..6e28667 Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/attachments/20240229163215.png differ diff --git a/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/attachments/20240229164040.png b/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/attachments/20240229164040.png new file mode 100644 index 0000000..8f80b4a Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/attachments/20240229164040.png differ diff --git a/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/attachments/20240229164107.png b/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/attachments/20240229164107.png new file mode 100644 index 0000000..dbcf98e Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/attachments/20240229164107.png differ diff --git a/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/attachments/20240229164459.png b/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/attachments/20240229164459.png new file mode 100644 index 0000000..6cc33c7 Binary files /dev/null and b/docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/attachments/20240229164459.png differ diff --git a/docs/03.FreeRTOS基础/3.1-FreeRTOS概述/FreeRTOS概述.md b/docs/03.FreeRTOS基础/3.1-FreeRTOS概述/FreeRTOS概述.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/03.FreeRTOS基础/3.2-FreeRTOS多任务与任务管理/FreeRTOS多任务与任务管理.md b/docs/03.FreeRTOS基础/3.2-FreeRTOS多任务与任务管理/FreeRTOS多任务与任务管理.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/04.外设学习/4.1-基础外设/4.1.1-GPIO/GPIO入门.md b/docs/04.外设学习/4.1-基础外设/4.1.1-GPIO/GPIO入门.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/04.外设学习/4.1-基础外设/4.1.2-UART/UART串口通信.md b/docs/04.外设学习/4.1-基础外设/4.1.2-UART/UART串口通信.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/04.外设学习/4.1-基础外设/4.1.3-定时器/定时器.md b/docs/04.外设学习/4.1-基础外设/4.1.3-定时器/定时器.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/04.外设学习/4.1-基础外设/4.1.4-ADC/ADC模数转换.md b/docs/04.外设学习/4.1-基础外设/4.1.4-ADC/ADC模数转换.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/04.外设学习/4.1-基础外设/4.1.5-DAC/DAC数模转换.md b/docs/04.外设学习/4.1-基础外设/4.1.5-DAC/DAC数模转换.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/04.外设学习/4.1-基础外设/4.1.6-LED_PWM/LED_PWM控制.md b/docs/04.外设学习/4.1-基础外设/4.1.6-LED_PWM/LED_PWM控制.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/04.外设学习/4.1-基础外设/4.1.7-I2C/I2C通信.md b/docs/04.外设学习/4.1-基础外设/4.1.7-I2C/I2C通信.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/04.外设学习/4.1-基础外设/4.1.8-SPI/SPI通信.md b/docs/04.外设学习/4.1-基础外设/4.1.8-SPI/SPI通信.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/04.外设学习/4.2-存储外设/4.2.1-分区表/分区表.md b/docs/04.外设学习/4.2-存储外设/4.2.1-分区表/分区表.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/04.外设学习/4.2-存储外设/4.2.2-非易失性存储/非易失性存储.md b/docs/04.外设学习/4.2-存储外设/4.2.2-非易失性存储/非易失性存储.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/04.外设学习/4.2-存储外设/4.2.3-FAT文件系统/FAT文件系统.md b/docs/04.外设学习/4.2-存储外设/4.2.3-FAT文件系统/FAT文件系统.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/04.外设学习/4.2-存储外设/4.2.4-SPIFFS文件系统/SPIFFS文件系统.md b/docs/04.外设学习/4.2-存储外设/4.2.4-SPIFFS文件系统/SPIFFS文件系统.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/05.FreeRTOS进阶/5.1-队列/FreeRTOS队列使用教程.md b/docs/05.FreeRTOS进阶/5.1-队列/FreeRTOS队列使用教程.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/05.FreeRTOS进阶/5.2-信号量/FreeRTOS信号量教程.md b/docs/05.FreeRTOS进阶/5.2-信号量/FreeRTOS信号量教程.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/05.FreeRTOS进阶/5.3-互斥量/FreeRTOS互斥量教程.md b/docs/05.FreeRTOS进阶/5.3-互斥量/FreeRTOS互斥量教程.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/05.FreeRTOS进阶/5.4-事件组/FreeRTOS事件组教程.md b/docs/05.FreeRTOS进阶/5.4-事件组/FreeRTOS事件组教程.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/05.FreeRTOS进阶/5.5-任务通知/FreeRTOS任务通知教程.md b/docs/05.FreeRTOS进阶/5.5-任务通知/FreeRTOS任务通知教程.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/05.FreeRTOS进阶/5.6-软件定时器/FreeRTOS软件定时器教程.md b/docs/05.FreeRTOS进阶/5.6-软件定时器/FreeRTOS软件定时器教程.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与基础操作/Wi-Fi模式与基础操作.md b/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与基础操作/Wi-Fi模式与基础操作.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi STA与AP配置/Wi-Fi STA与AP配置.md b/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi STA与AP配置/Wi-Fi STA与AP配置.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.1-TCP协议/TCP协议应用.md b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.1-TCP协议/TCP协议应用.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.2-UDP协议/UDP协议应用.md b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.2-UDP协议/UDP协议应用.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.3- HTTP协议/HTTP协议应用.md b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.3- HTTP协议/HTTP协议应用.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.4-WebSocket协议/WebSocket协议.md b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.4-WebSocket协议/WebSocket协议.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.5-MQTT协议/MQTT协议应用.md b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.5-MQTT协议/MQTT协议应用.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.6-ESP-NOW协议/ESP-NOW协议应用.md b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.6-ESP-NOW协议/ESP-NOW协议应用.md new file mode 100644 index 0000000..e69de29