1.1 GPIO理论
ESP32 系列芯片中,引脚定义是从 GPIO0~GPIO48,一共有 49 个 IO 引脚,ESP32-S3 官方文档给出的是 45 个 GPIO 可用,但其实每个型号 的芯片上对 GPIO 的使用都有些细微差异,并且有些引脚其实并没有被引出,所以我们能够使用的引脚也 只有 33 个。 ![[Pasted image 20250519100433.png]] GPIO0 、 GPIO3 、GPIO45 、 GPIO46在系统启动的时候需被当做了 Strapping 管脚,有特殊含义, 所以在启动阶段不能使用,但启动完毕之后是可用的; GPIO19 和 GPIO20 是 USB 固定引脚,如果使用 USB 功能的话只能用这两个引脚,如果不使用 USB 功能,这两个引脚可以随意使用; GPIO43 和 GPIO44 被定义为 UART0 ,作为串口0对外输出信息,同时还具备了固件烧录的功能,所 以如果使用 REPL 模式的情况下,这两个引脚是不能使用的,如果使用 main 模式则可以考虑启用; GPIO26~GPIO32, 这一组引脚被用作片内的 Flash 或者是 PSRAM...
5.对比
机制 用途 特点 适用场景 队列(Queue) 传递数据 支持多个数据项排队 任务间传递结构体/数值等数据 信号量(Semaphore) 同步 / 互斥 不传递数据,只传“信号” 同步事件、任务间或中断间的配合 互斥锁(Mutex) 资源互斥保护 特殊的二值信号量 + 优先级继承 多任务访问共享资源(如 I²C、串口) 事件组(Event Group) 多位同步控制 可同时表示多个状态位 控制多个条件满足才执行,如联网、就绪等 任务通知(Task Notification) 点对点通知 + 可传值 轻量,效率高,限单任务 一对一传递信号或数据 🧩 各模块详细对比1. ✅ 队列(Queue) 可以传递数据(整数、结构体等) 先进先出(FIFO)机制 可以阻塞等待队列满或空 支持任务与任务 / 中断与任务之间通信 🔧 示例用途: xQueueSend(queue, &data, portMAX_DELAY); // 发送数据 xQueueReceive(queue, &data,...
1.2.1 驱动OLED-无freertos
GPIO 输出输出配置![[Pasted image 20250519103522.png]] ![[Pasted image 20250519103658.png]] 123456789101112131415161718192021222324#include <stdio.h>#include "driver/gpio.h"#include "freertos/FreeRTOS.h"void app_main(void){ // //1.配置GPIO // gpio_config_t gpio_cfg = { // .pin_bit_mask = 1ULL << 9, //pin掩码 // .mode = GPIO_MODE_OUTPUT, // }; // gpio_config(&gpio_cfg); //配置 gpio_reset_pin(GPIO_NUM_9); ...
2.1中断理论
![[Pasted image 20250519111748.png]]![[Pasted image 20250519111949.png]] ![[Pasted image 20250519112416.png]]一般不用全局中断 ![[Pasted image 20250519112632.png]]二选一,一般下面方式。 ![[Pasted image 20250519112809.png]]记得安装中断服务![[Pasted image 20250519113952.png]] ![[Pasted image 20250519114031.png]] 注意:![[Pasted image 20250519114617.png]] ![[Pasted image 20250519115303.png]]![[Pasted image 20250519115319.png]]
1.2.1 驱动OLED-有freertos
12345678910111213141516171819202122232425262728293031323334353637383940414243#include <stdio.h>#include "freertos/FreeRTOS.h"#include "freertos/task.h"#include "driver/gpio.h"// 定义三个LED对应的GPIO引脚#define LED_GPIO_1 GPIO_NUM_2 // 第一个LED连接到GPIO2/** * @brief 控制LED闪烁的任务函数(周期500ms) * * @param param 参数,传递LED对应的GPIO引脚号 */void led_run_task(void *param){ int gpio_level = 0; // 初始电平状态(0=低电平,1=高电平) gpio_num_t gpio_num = (gpio_num_t)param; //...
3.1 触摸传感器理论
触摸传感器的种类![[Pasted image 20250519132533.png]] ESP32-S3中的电容触摸传感器![[Pasted image 20250519132630.png]] 触摸传感器使用方法![[Pasted image 20250519132658.png]]
2.2按键中断点灯
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162#include <stdio.h>#include "driver/gpio.h" // GPIO 控制头文件#include "freertos/FreeRTOS.h" // FreeRTOS 相关头文件(虽然本代码没用到任务)#include "esp_log.h" // 用于日志打印(此代码中未使用)/** * @brief GPIO 中断服务函数,当 GPIO 口电平发生变化时触发 * @param args 传入的参数,是中断来源的 GPIO 编号(通过强转传入) */static void gpio_isr_handle(void *args){ int io_num = (int)args; ...
3.2 触摸信号采集
触摸传感器使用顺序1.初始化触摸传感器, 2.对触摸传感器和引脚进行配置, 3.启动FSM(有限状态机) 4.采集原始数据 5.卸载触摸传感器 初始化触摸传感器![[Pasted image 20250519135238.png]] FSM有限状态机![[Pasted image 20250519135837.png]] 示例代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include <stdio.h>#include "freertos/FreeRTOS.h" // FreeRTOS 基础头文件#include "freertos/task.h" // FreeRTOS 任务相关#include "driver/touch_sensor.h" // ESP32 触摸传感器驱动头文件#include "esp_log.h" ...
3.3 触摸中断
![[Pasted image 20250519205057.png]]1、初始化触摸传感器 2、配置触摸传感器 3、设置触摸中断触发的阈值 4、注册中断触发函数 5、起用中断,并设置中断触发条件 6、配置和启动 FSM 7、等在中断触发 注册中断服务函数![[Pasted image 20250519205834.png]] 触发阈值![[Pasted image 20250519214150.png]] 基准值![[Pasted image 20250519214234.png]]
1.创建任务
任务可以存在于以下状态:运行:当任务实际执行时,它被称为处于运行状态。任务当前正在使用处理机。如果运行RTOS的处理器只有一个内核,那么在任何给定时间内都只能有一个任务处于运行状态。 准备就绪:准备就绪任务指那些能够执行(它们不处于阻塞或挂起状态),但目前没有执行的任务,因为同等或更高优先级的不同任务已经处于运行状态。 阻塞:如果任务当前正在等待时间或外部时间,则该任务被认为处于阻塞状态。例如,如果一个任务调用vTaskDelay(),它将被阻塞(被置于阻塞状态),直到延迟结束一个时间事件。任务也可以通过阻塞来等待队列、信号量、事件组、通知或信号量事件。处于阻塞状态的任务通常有一个“超时”期,超时后任务被超时,并被解除阻塞,即使该任务所等待的事件没有发生。 “阻塞”状态下的任务不使用任何处理时间,不能 被选择进入运行状态。 挂起:与“阻塞”状态下的任务一样,“挂起”状态下的任务不能 被选择进入运行状态,但处于挂起状态的任务 没有超时。相反,任务只有在分别通过vTaskSuspend() 和 xTaskResume()...