Перейти к содержанию

Регистры GPIO ESP32-S3

Регистры GPIO ESP32-S3: уровни на выходах и входах 45 выводов в двух банках, установка и сброс битов без чтения-изменения-записи, условия прерываний и матрица, которая подключает сигнал периферии к любому выводу.

Блок GPIO по адресу 0x6000 4000 обслуживает выводы GPIO0…21 и GPIO26…48 — всего 45. Первый банк — регистры GPIO_OUT_REG, GPIO_ENABLE_REG, GPIO_IN_REG и GPIO_STATUS_REG: бит n относится к GPIOn, биты 22…25 не действуют. Второй банк — регистры с цифрой 1 (GPIO_OUT1_REG и другие): бит 0 — GPIO32, бит 16 — GPIO48. Пары W1TS и W1TC меняют только биты, в которые записана единица.

Матрица GPIO соединяет 175 входных и 184 выходных сигнала периферии с выводами. GPIO_FUNCn_IN_SEL_CFG_REG (n = 0…255, номер сигнала) выбирает вывод для входного сигнала; значения 0x38 и 0x3C вместо номера вывода дают постоянные 1 и 0. GPIO_FUNCn_OUT_SEL_CFG_REG (n — номер вывода) выбирает сигнал для выхода; значение 256 отдаёт вывод регистрам GPIO_OUT и GPIO_ENABLE. Номера сигналов — в таблице 6.11-1 TRM и в заголовке soc/gpio_sig_map.h ESP-IDF.

Функцию вывода, подтяжки и силу выхода задают регистры IO MUX: простой выход через матрицу требует выбрать в поле MCU_SEL функцию 1 (GPIO) — она первая у всех выводов.

ЭкземплярБазовый адрес
GPIO0x6000 4000

Пример на C

GPIO2 — выход, GPIO40 — вход во втором банке (ESP-IDF, soc/gpio_reg.h). Макросы доступа REG_WRITE, REG_READ, REG_SET_BIT, REG_CLR_BIT, REG_GET_BIT, REG_SET_FIELD и REG_GET_FIELD объявлены в soc/soc.h ESP-IDF; поле задаётся именем макроса без суффикса, маска и сдвиг берутся из его вариантов _V и _S.

#include "soc/gpio_reg.h"
#include "soc/io_mux_reg.h"
#include "soc/gpio_sig_map.h"

PIN_FUNC_SELECT(IO_MUX_GPIO2_REG, PIN_FUNC_GPIO);         // функция 1 — GPIO
REG_WRITE(GPIO_FUNC2_OUT_SEL_CFG_REG, SIG_GPIO_OUT_IDX);  // 256: выход из GPIO_OUT_REG
REG_WRITE(GPIO_ENABLE_W1TS_REG, BIT(2));                  // включить выходной драйвер
REG_WRITE(GPIO_OUT_W1TS_REG, BIT(2));                     // GPIO2 = 1
REG_WRITE(GPIO_OUT_W1TC_REG, BIT(2));                     // GPIO2 = 0

PIN_FUNC_SELECT(IO_MUX_GPIO40_REG, PIN_FUNC_GPIO);
PIN_INPUT_ENABLE(IO_MUX_GPIO40_REG);                      // FUN_IE = 1
uint32_t level = (REG_READ(GPIO_IN1_REG) >> (40 - 32)) & 1;  // уровень на GPIO40

Регистры блока

Регистр (ESP-IDF)СмещениеНазначениеПосле сброса
GPIO_BT_SELECT_REG0x0000Зарезервировано0x0000 0000
GPIO_OUT_REG0x0004Уровни на выходах GPIO0…21 и GPIO26…310x0000 0000
GPIO_OUT_W1TS_REG0x0008Банк 0: установка выходов записью единицы0x0000 0000
GPIO_OUT_W1TC_REG0x000CБанк 0: сброс выходов записью единицы0x0000 0000
GPIO_OUT1_REG0x0010Уровни на выходах GPIO32…480x0000 0000
GPIO_OUT1_W1TS_REG0x0014Банк 1: установка выходов записью единицы0x0000 0000
GPIO_OUT1_W1TC_REG0x0018Банк 1: сброс выходов записью единицы0x0000 0000
GPIO_SDIO_SELECT_REG0x001CЗарезервировано0x0000 0000
GPIO_ENABLE_REG0x0020Разрешение выходов GPIO0…310x0000 0000
GPIO_ENABLE_W1TS_REG0x0024Банк 0: включение выходов записью единицы0x0000 0000
GPIO_ENABLE_W1TC_REG0x0028Банк 0: выключение выходов записью единицы0x0000 0000
GPIO_ENABLE1_REG0x002CРазрешение выходов GPIO32…480x0000 0000
GPIO_ENABLE1_W1TS_REG0x0030Банк 1: включение выходов записью единицы0x0000 0000
GPIO_ENABLE1_W1TC_REG0x0034Банк 1: выключение выходов записью единицы0x0000 0000
GPIO_STRAP_REG0x0038Уровни strapping-выводов, защёлкнутые при сбросе0x0000 0000
GPIO_IN_REG0x003CУровни на входах GPIO0…310x0000 0000
GPIO_IN1_REG0x0040Уровни на входах GPIO32…480x0000 0000
GPIO_STATUS_REG0x0044Банк 0: флаги прерываний выводов0x0000 0000
GPIO_STATUS_W1TS_REG0x0048Банк 0: установка флагов прерываний записью единицы0x0000 0000
GPIO_STATUS_W1TC_REG0x004CБанк 0: сброс флагов прерываний записью единицы0x0000 0000
GPIO_STATUS1_REG0x0050Банк 1: флаги прерываний выводов0x0000 0000
GPIO_STATUS1_W1TS_REG0x0054Банк 1: установка флагов прерываний записью единицы0x0000 0000
GPIO_STATUS1_W1TC_REG0x0058Банк 1: сброс флагов прерываний записью единицы0x0000 0000
GPIO_PCPU_INT_REG0x005CБанк 0: прерывания выводов, разрешённые для ядра0x0000 0000
GPIO_PCPU_NMI_INT_REG0x0060Банк 0: немаскируемые прерывания выводов0x0000 0000
GPIO_PCPU_INT1_REG0x0068Банк 1: прерывания выводов, разрешённые для ядра0x0000 0000
GPIO_PCPU_NMI_INT1_REG0x006CБанк 1: немаскируемые прерывания выводов0x0000 0000
GPIO_PINn_REG0x0074 + n · 0x0004Прерывание, пробуждение и тип выхода вывода GPIOn0x0000 0000
GPIO_STATUS_NEXT_REG0x014CБанк 0: текущие сигналы прерываний выводов0x0000 0000
GPIO_STATUS_NEXT1_REG0x0150Банк 1: текущие сигналы прерываний выводов0x0000 0000
GPIO_FUNCn_IN_SEL_CFG_REG0x0154 + n · 0x0004Вывод для входного сигнала периферии n0x0000 0000
GPIO_FUNCn_OUT_SEL_CFG_REG0x0554 + n · 0x0004Сигнал периферии на выходе GPIOn0x0000 0100
GPIO_CLOCK_GATE_REG0x062CТактирование блока GPIO0x0000 0001
GPIO_DATE_REG0x06FCВерсия блока: дата ревизии аппаратуры0x0190 7040

Доступ — обозначения TRM: R/W — чтение и запись, RO — только чтение, WO — только запись, WT — запись 1 запускает действие, SS и SC — бит ставится и сбрасывается аппаратно, WTC — сбрасывается записью 1.

GPIO_BT_SELECT_REG — зарезервировано

Смещение 0x0000, адрес 0x6000 4000, после сброса 0x0000 0000. TRM: регистр 6.1.

ПолеБитыДоступСброс
BT_SEL31:0R/W0x0000 0000

GPIO_OUT_REG — уровни на выходах GPIO0…21 и GPIO26…31

Смещение 0x0004, адрес 0x6000 4004, после сброса 0x0000 0000. TRM: регистр 6.2.

ПолеБитыДоступСбросНазначение
OUT_DATA_ORIG31:0R/W0x0000 0000Биты 0…21 — выходы GPIO0…21, биты 26…31 — GPIO26…31, биты 22…25 не действуют

GPIO_OUT_W1TS_REG — банк 0: установка выходов записью единицы

Смещение 0x0008, адрес 0x6000 4008, после сброса 0x0000 0000. TRM: регистр 6.3.

ПолеБитыДоступСброс
OUT_W1TS31:0WO0x0000 0000

GPIO_OUT_W1TC_REG — банк 0: сброс выходов записью единицы

Смещение 0x000C, адрес 0x6000 400C, после сброса 0x0000 0000. TRM: регистр 6.4.

ПолеБитыДоступСброс
OUT_W1TC31:0WO0x0000 0000

GPIO_OUT1_REG — уровни на выходах GPIO32…48

Смещение 0x0010, адрес 0x6000 4010, после сброса 0x0000 0000. TRM: регистр 6.5.

ПолеБитыДоступСбросНазначение
OUT1_DATA_ORIG21:0R/W0x000000Биты 0…16 — выходы GPIO32…48, биты 17…21 не действуют

GPIO_OUT1_W1TS_REG — банк 1: установка выходов записью единицы

Смещение 0x0014, адрес 0x6000 4014, после сброса 0x0000 0000. TRM: регистр 6.6.

ПолеБитыДоступСброс
OUT1_W1TS21:0WO0x000000

GPIO_OUT1_W1TC_REG — банк 1: сброс выходов записью единицы

Смещение 0x0018, адрес 0x6000 4018, после сброса 0x0000 0000. TRM: регистр 6.7.

ПолеБитыДоступСброс
OUT1_W1TC21:0WO0x000000

GPIO_SDIO_SELECT_REG — зарезервировано

Смещение 0x001C, адрес 0x6000 401C, после сброса 0x0000 0000. TRM: регистр 6.8.

ПолеБитыДоступСброс
SDIO_SEL7:0R/W0x00

GPIO_ENABLE_REG — разрешение выходов GPIO0…31

Смещение 0x0020, адрес 0x6000 4020, после сброса 0x0000 0000. TRM: регистр 6.9.

ПолеБитыДоступСбросНазначение
ENABLE_DATA31:0R/W0x0000 0000Бит n включает выходной драйвер GPIOn

GPIO_ENABLE_W1TS_REG — банк 0: включение выходов записью единицы

Смещение 0x0024, адрес 0x6000 4024, после сброса 0x0000 0000. TRM: регистр 6.10.

ПолеБитыДоступСброс
ENABLE_W1TS31:0WO0x0000 0000

GPIO_ENABLE_W1TC_REG — банк 0: выключение выходов записью единицы

Смещение 0x0028, адрес 0x6000 4028, после сброса 0x0000 0000. TRM: регистр 6.11.

ПолеБитыДоступСброс
ENABLE_W1TC31:0WO0x0000 0000

GPIO_ENABLE1_REG — разрешение выходов GPIO32…48

Смещение 0x002C, адрес 0x6000 402C, после сброса 0x0000 0000. TRM: регистр 6.12.

ПолеБитыДоступСбросНазначение
ENABLE1_DATA21:0R/W0x000000Бит n включает выходной драйвер GPIO(32 + n)

GPIO_ENABLE1_W1TS_REG — банк 1: включение выходов записью единицы

Смещение 0x0030, адрес 0x6000 4030, после сброса 0x0000 0000. TRM: регистр 6.13.

ПолеБитыДоступСброс
ENABLE1_W1TS21:0WO0x000000

GPIO_ENABLE1_W1TC_REG — банк 1: выключение выходов записью единицы

Смещение 0x0034, адрес 0x6000 4034, после сброса 0x0000 0000. TRM: регистр 6.14.

ПолеБитыДоступСброс
ENABLE1_W1TC21:0WO0x000000

GPIO_STRAP_REG — уровни strapping-выводов, защёлкнутые при сбросе

Смещение 0x0038, адрес 0x6000 4038, после сброса 0x0000 0000. TRM: регистр 6.15.

В версии TRM 1.8 описание GPIO_STRAP_REG исправлено: поле занимает биты 5:0. SVD и заголовок soc/gpio_reg.h ESP-IDF v6.1 по-прежнему описывают GPIO_STRAPPING как биты 15:0; страница следует TRM.

ПолеБитыДоступСбросНазначение
STRAPPING5:0RO0x00По TRM v1.8: бит 2 — GPIO46, бит 3 — GPIO0, бит 4 — GPIO45, бит 5 — GPIO3, биты 0 и 1 зарезервированы; в ESP-IDF поле GPIO_STRAPPING шире — биты 15:0

GPIO_IN_REG — уровни на входах GPIO0…31

Смещение 0x003C, адрес 0x6000 403C, после сброса 0x0000 0000. TRM: регистр 6.16.

ПолеБитыДоступСбросНазначение
IN_DATA_NEXT31:0RO0x0000 0000Бит n — уровень на входе GPIOn: 1 — высокий, 0 — низкий

GPIO_IN1_REG — уровни на входах GPIO32…48

Смещение 0x0040, адрес 0x6000 4040, после сброса 0x0000 0000. TRM: регистр 6.17.

ПолеБитыДоступСбросНазначение
IN_DATA1_NEXT21:0RO0x000000Бит n — уровень на входе GPIO(32 + n)

GPIO_STATUS_REG — банк 0: флаги прерываний выводов

Смещение 0x0044, адрес 0x6000 4044, после сброса 0x0000 0000. TRM: регистр 6.22.

ПолеБитыДоступСбросНазначение
STATUS_INTERRUPT31:0R/W0x0000 0000Бит n — флаг прерывания GPIOn; сбрасывается записью единицы в STATUS_W1TC

GPIO_STATUS_W1TS_REG — банк 0: установка флагов прерываний записью единицы

Смещение 0x0048, адрес 0x6000 4048, после сброса 0x0000 0000. TRM: регистр 6.28.

ПолеБитыДоступСброс
STATUS_W1TS31:0WO0x0000 0000

GPIO_STATUS_W1TC_REG — банк 0: сброс флагов прерываний записью единицы

Смещение 0x004C, адрес 0x6000 404C, после сброса 0x0000 0000. TRM: регистр 6.29.

ПолеБитыДоступСброс
STATUS_W1TC31:0WO0x0000 0000

GPIO_STATUS1_REG — банк 1: флаги прерываний выводов

Смещение 0x0050, адрес 0x6000 4050, после сброса 0x0000 0000. TRM: регистр 6.23.

ПолеБитыДоступСбросНазначение
STATUS1_INTERRUPT21:0R/W0x000000Бит n — флаг прерывания GPIO(32 + n)

GPIO_STATUS1_W1TS_REG — банк 1: установка флагов прерываний записью единицы

Смещение 0x0054, адрес 0x6000 4054, после сброса 0x0000 0000. TRM: регистр 6.30.

ПолеБитыДоступСброс
STATUS1_W1TS21:0WO0x000000

GPIO_STATUS1_W1TC_REG — банк 1: сброс флагов прерываний записью единицы

Смещение 0x0058, адрес 0x6000 4058, после сброса 0x0000 0000. TRM: регистр 6.31.

ПолеБитыДоступСброс
STATUS1_W1TC21:0WO0x000000

GPIO_PCPU_INT_REG — банк 0: прерывания выводов, разрешённые для ядра

Смещение 0x005C, адрес 0x6000 405C, после сброса 0x0000 0000. TRM: регистр 6.24 (GPIO_CPU_INT_REG).

ПолеБитыДоступСбросНазначение
CPU_INT31:0RO0x0000 0000Флаги из GPIO_STATUS_REG выводов, у которых установлен бит 13 поля PINn_INT_ENA

GPIO_PCPU_NMI_INT_REG — банк 0: немаскируемые прерывания выводов

Смещение 0x0060, адрес 0x6000 4060, после сброса 0x0000 0000. TRM: регистр 6.25 (GPIO_CPU_NMI_INT_REG).

ПолеБитыДоступСбросНазначение
CPU_NMI_INT31:0RO0x0000 0000Флаги из GPIO_STATUS_REG выводов, у которых установлен бит 14 поля PINn_INT_ENA

GPIO_PCPU_INT1_REG — банк 1: прерывания выводов, разрешённые для ядра

Смещение 0x0068, адрес 0x6000 4068, после сброса 0x0000 0000. TRM: регистр 6.26 (GPIO_CPU_INT1_REG).

ПолеБитыДоступСброс
CPU1_INT21:0RO0x000000

GPIO_PCPU_NMI_INT1_REG — банк 1: немаскируемые прерывания выводов

Смещение 0x006C, адрес 0x6000 406C, после сброса 0x0000 0000. TRM: регистр 6.27 (GPIO_CPU_NMI_INT1_REG).

ПолеБитыДоступСброс
CPU_NMI1_INT21:0RO0x000000

GPIO_PINn_REG — прерывание, пробуждение и тип выхода вывода GPIOn

49 копий, n = 0…48: смещение 0x0074 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 6.18.

Прерывание вывода задают два поля: условие в PINn_INT_TYPE и получатель в PINn_INT_ENA. Флаг события появляется в GPIO_STATUS_REG или GPIO_STATUS1_REG; обработчик сбрасывает его записью единицы в регистр W1TC того же банка. Копии регистра есть для n = 0…48, хотя выводов GPIO22…25 у ESP32-S3 нет.

31302928272625242322212019181716
—PINn_INT_ENA
1514131211109876543210
PINn_INT_ENAPINn_CONFIGPINn_WAKEUP_ENABLEPINn_INT_TYPE—PINn_SYNC1_BYPASSPINn_PAD_DRIVERPINn_SYNC2_BYPASS
ПолеБитыДоступСбросНазначение
PINn_INT_ENA17:13R/W0x00Бит 13 — прерывание ядра, бит 14 — немаскируемое прерывание
PINn_CONFIG12:11R/W0x0Зарезервировано
PINn_WAKEUP_ENABLE10R/W0Пробуждать ядро по прерыванию вывода; действует только в лёгком сне
PINn_INT_TYPE9:7R/W0x0Условие прерывания: 0 — выключено, 1 — фронт, 2 — спад, 3 — любой перепад, 4 — низкий уровень, 5 — высокий уровень
PINn_SYNC1_BYPASS4:3R/W0x0Первая ступень синхронизации входа с APB_CLK: 0 — нет, 1 — по спаду, 2 и 3 — по фронту
PINn_PAD_DRIVER2R/W0Тип выхода: 0 — обычный, 1 — открытый сток
PINn_SYNC2_BYPASS1:0R/W0x0Вторая ступень синхронизации, значения как у SYNC1_BYPASS

GPIO_STATUS_NEXT_REG — банк 0: текущие сигналы прерываний выводов

Смещение 0x014C, адрес 0x6000 414C, после сброса 0x0000 0000. TRM: регистр 6.32.

ПолеБитыДоступСброс
STATUS_INTERRUPT_NEXT31:0RO0x0000 0000

GPIO_STATUS_NEXT1_REG — банк 1: текущие сигналы прерываний выводов

Смещение 0x0150, адрес 0x6000 4150, после сброса 0x0000 0000. TRM: регистр 6.33.

ПолеБитыДоступСброс
STATUS1_INTERRUPT_NEXT21:0RO0x000000

GPIO_FUNCn_IN_SEL_CFG_REG — вывод для входного сигнала периферии n

256 копий, n = 0…255: смещение 0x0154 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 6.19.

1514131211109876543210
—SIGn_IN_SELFUNCn_IN_INV_SELFUNCn_IN_SEL
ПолеБитыДоступСбросНазначение
SIGn_IN_SEL7R/W01 — сигнал идёт через матрицу GPIO, 0 — напрямую от вывода, выбранного в IO MUX
FUNCn_IN_INV_SEL6R/W01 — инвертировать входной сигнал
FUNCn_IN_SEL5:0R/W0x00Номер вывода для входного сигнала n; 0x38 — постоянная 1, 0x3C — постоянный 0

GPIO_FUNCn_OUT_SEL_CFG_REG — сигнал периферии на выходе GPIOn

49 копий, n = 0…48: смещение 0x0554 + n · 0x0004, после сброса 0x0000 0100. TRM: регистр 6.20.

После сброса во всех копиях записано 0x100 = 256: выходы управляются регистрами GPIO_OUT и GPIO_ENABLE, а выходные драйверы выключены.

1514131211109876543210
—FUNCn_OEN_INV_SELFUNCn_OEN_SELFUNCn_OUT_INV_SELFUNCn_OUT_SEL
ПолеБитыДоступСбросНазначение
FUNCn_OEN_INV_SEL11R/W01 — инвертировать сигнал разрешения выхода
FUNCn_OEN_SEL10R/W0Разрешение выхода: 0 — от периферии, 1 — из бита n регистра GPIO_ENABLE_REG
FUNCn_OUT_INV_SEL9R/W01 — инвертировать выходной сигнал
FUNCn_OUT_SEL8:0R/W0x100Номер выходного сигнала периферии 0…255; 256 — уровень и разрешение из регистров GPIO_OUT и GPIO_ENABLE

GPIO_CLOCK_GATE_REG — тактирование блока GPIO

Смещение 0x062C, адрес 0x6000 462C, после сброса 0x0000 0001. TRM: регистр 6.21.

ПолеБитыДоступСбросНазначение
CLK_EN0R/W11 — такт регистров работает постоянно

GPIO_DATE_REG — версия блока: дата ревизии аппаратуры

Смещение 0x06FC, адрес 0x6000 46FC, после сброса 0x0190 7040. TRM: регистр 6.34 (GPIO_DATE_REG).

ПолеБитыДоступСброс
DATE27:0R/W0x1907040

Частые вопросы

Как управлять выводами GPIO32…GPIO48 ESP32-S3?

Через второй банк регистров: GPIO_OUT1_REG, GPIO_ENABLE1_REG, GPIO_IN1_REG и их пары W1TS и W1TC. Бит 0 этих регистров — GPIO32, бит 8 — GPIO40, бит 16 — GPIO48; биты 17…21 по TRM не действуют. Первый банк (GPIO_OUT_REG и другие) покрывает GPIO0…31, где биты 22…25 пустые: таких выводов у ESP32-S3 нет.

Как подать постоянный уровень на вход периферии ESP32-S3 без вывода?

Записать в поле FUNCn_IN_SEL регистра входного сигнала n значение 0x38 — сигнал всегда 1, или 0x3C — всегда 0, и установить бит SIGn_IN_SEL, чтобы сигнал шёл через матрицу. Так, например, держат неиспользуемый вход CTS в нужном состоянии.

Источники

  1. Espressif. ESP32-S3 Technical Reference Manual, версия 1.8 — глава 6: таблица Register Summary и рисунки регистров — смещения, поля, тип доступа и значения после сброса
  2. Espressif. SVD svd/esp32s3.svd, версия 21 (espressif/svd, коммит be20aa1) — базовые адреса периферии, список регистров и полей; лицензия Apache-2.0
  3. Espressif. ESP-IDF v6.1: заголовки components/soc/esp32s3/register/soc/*_reg.h (коммит fff9895) — имена макросов регистров и полей, сверка положения полей и значений по умолчанию; лицензия Apache-2.0 OR MIT

Нашли ошибку в регистрах?

Другие регистры ESP32-S3

Статьи, инструменты и термины