---
type: study
status: active
created: 2026-09-10
updated: 2026-09-10
sensitivity: private
tags: [study, embedded, c, esp32, cores3]
sources:
  - "https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s3/api-reference/peripherals/i2c.html"
  - "https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s3/api-reference/peripherals/spi_master.html"
  - "https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s3/api-reference/system/esp_timer.html"
---
# GPIO、总线、中断和定时：理解驱动在做什么

## 每种接口解决不同问题

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

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

## I2C：先识别总线所有者

新驱动把“总线”和“挂在总线上的设备”分开建模。先建立 master bus，再为每个器件配置地址和速率，最后执行带超时的事务。API 所需的 7 位地址不能无条件再左移一位。[ESP-IDF I2C](https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s3/api-reference/peripherals/i2c.html)

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

IDF 的旧 `driver/i2c.h` 和新 `driver/i2c_master.h` 驱动不能共存。遇到 codec 或其他依赖引入旧驱动时，需要统一依赖与配置。[官方 I2C 驱动兼容说明](https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s3/api-reference/peripherals/i2c.html#i2c-file-structure)

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

## SPI：事务比单字节更有用

显示驱动把一片像素组织成事务，按目标设备的时钟、模式和片选发送。总线可挂多设备，但同一设备的并发访问仍要遵循驱动线程安全要求；异步事务完成前，发送缓冲区不能提前复用或释放。[SPI Master](https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s3/api-reference/peripherals/spi_master.html)

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

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

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

ISR 不做网络请求、复杂 JSON、阻塞等待或 UI 绘制。必须调用适用于 ISR 的接口并处理队列满等返回结果；是否需要 IRAM 安全，取决于中断配置和缓存关闭期间的要求。[GPIO 驱动](https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s3/api-reference/peripherals/gpio.html)

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

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

`esp_timer` 提供微秒时间基准和定时能力，但不保证任意负载下回调有微秒级调度延迟；默认任务分发会受到前序回调等影响。[ESP Timer](https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s3/api-reference/system/esp_timer.html)

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

---

[[Study/embedded-cores3/CoreS3学习入口|返回学习入口]] · [[Study/embedded-cores3/CoreS3资料来源与版本|来源与版本]]
