学习笔记 · Obsidian

GPIO、总线、中断和定时:理解驱动在做什么

ESP-IDFC / C++

每种接口解决不同问题

接口解决的问题初学需要观察的量
GPIO读写数字电平输入/输出、上下拉、有效电平
UART异步串行字节流波特率、帧格式、缓冲区、消息分帧
I2C同一总线寻址多个器件SDA/SCL、地址、ACK、上拉和超时
SPI以时钟和片选传输数据时钟模式、频率、CS、事务长度
PWM用脉冲占空比调节输出频率、分辨率、占空比
ADC把模拟输入量化为读数量程、衰减、校准与噪声
I2S音频等连续采样数据传输采样率、位宽、通道、缓冲区

此表用于建立问题分类,具体能力和引脚限制以选定版本驱动及硬件资料为准。当前重点实验是 GPIO/I2C/SPI,其余为后续扩展。

I2C:先识别总线所有者

新驱动把“总线”和“挂在总线上的设备”分开建模。先建立 master bus,再为每个器件配置地址和速率,最后执行带超时的事务。API 所需的 7 位地址不能无条件再左移一位。ESP-IDF I2C

CoreS3 板内 I2C 若已被 BSP 初始化,应复用 BSP 暴露的资源与约定。单独扫描外接 Port A 则先确认另一总线的资源分配,不要重复安装同一个控制器驱动。

IDF 的旧 driver/i2c.h 和新 driver/i2c_master.h 驱动不能共存。遇到 codec 或其他依赖引入旧驱动时,需要统一依赖与配置。官方 I2C 驱动兼容说明

练习:画出“ESP32 控制器—总线—设备地址—寄存器”的关系。解释读某个寄存器为什么可能包含先写寄存器地址、再读取数据两个阶段。扫描只探测响应,不做批量寄存器写入。

SPI:事务比单字节更有用

显示驱动把一片像素组织成事务,按目标设备的时钟、模式和片选发送。总线可挂多设备,但同一设备的并发访问仍要遵循驱动线程安全要求;异步事务完成前,发送缓冲区不能提前复用或释放。SPI Master

因此“发起了显示传输”不等于“缓冲区现在空闲”。这个区别会在 DMA、摄像头帧和音频环形缓冲区中反复出现。

中断通知发生了什么,任务处理要做什么

引脚事件 → ISR 记录最少信息 → 队列/任务通知 → 任务读取器件并更新状态

ISR 不做网络请求、复杂 JSON、阻塞等待或 UI 绘制。必须调用适用于 ISR 的接口并处理队列满等返回结果;是否需要 IRAM 安全,取决于中断配置和缓存关闭期间的要求。GPIO 驱动

不要把所有“定时器”当作同一东西

需求本课程起步选择原因
每秒采样一次周期任务与延时容易观察节拍和阻塞
到期触发一次动作软件定时器 / esp_timer回调只分发工作
精确持续输出波形相应硬件外设,如 LEDC、GPTimer 等评估抖动、分辨率和硬件能力

esp_timer 提供微秒时间基准和定时能力,但不保证任意负载下回调有微秒级调度延迟;默认任务分发会受到前序回调等影响。ESP Timer

过关实验:记录连续 100 次周期采样的实际间隔,观察增加一次慢操作后的变化。把“配置周期”和“实际执行时间”分开描述。


返回学习入口 · 来源与版本