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

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

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

Блок GPIO по адресу 0x6000 4000 управляет выводами GPIO0…GPIO21 в цифровом режиме. Бит n регистров GPIO_OUT_REG, GPIO_ENABLE_REG и GPIO_IN_REG относится к выводу GPIOn: первый задаёт уровень на выходе, второй включает выходной драйвер, третий показывает уровень на входе. Пары регистров W1TS и W1TC меняют только те биты, в которые записана единица, — запись атомарна и не требует чтения регистра.

Матрица GPIO соединяет 128 входных сигналов периферии и выходные сигналы с выводами: регистр GPIO_FUNCn_IN_SEL_CFG_REG выбирает вывод для входного сигнала с номером n, а GPIO_FUNCn_OUT_SEL_CFG_REG — сигнал, который выводится на GPIOn. Значение 128 в поле FUNCn_OUT_SEL отдаёт вывод под управление GPIO_OUT_REG. Номера сигналов перечислены в заголовке soc/gpio_sig_map.h ESP-IDF и в таблице 5.11-1 TRM.

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

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

Пример на C

GPIO8 — выход, GPIO9 — вход (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_GPIO8_REG, PIN_FUNC_GPIO);         // функция 1 — GPIO
REG_WRITE(GPIO_FUNC8_OUT_SEL_CFG_REG, SIG_GPIO_OUT_IDX);  // 128: выход берётся из GPIO_OUT_REG
REG_WRITE(GPIO_ENABLE_W1TS_REG, BIT(8));                  // включить выходной драйвер GPIO8
REG_WRITE(GPIO_OUT_W1TS_REG, BIT(8));                     // GPIO8 = 1
REG_WRITE(GPIO_OUT_W1TC_REG, BIT(8));                     // GPIO8 = 0

uint32_t level = (REG_READ(GPIO_IN_REG) >> 9) & 1;        // уровень на GPIO9

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

Регистр (ESP-IDF)СмещениеНазначениеПосле сброса
GPIO_BT_SELECT_REG0x0000Выбор битов для Bluetooth0x0000 0000
GPIO_OUT_REG0x0004Уровни на выходах GPIO0…210x0000 0000
GPIO_OUT_W1TS_REG0x0008Установка выходов в 1 записью единицы0x0000 0000
GPIO_OUT_W1TC_REG0x000CСброс выходов в 0 записью единицы0x0000 0000
GPIO_ENABLE_REG0x0020Разрешение выходов GPIO0…210x0000 0000
GPIO_ENABLE_W1TS_REG0x0024Включение выходов записью единицы0x0000 0000
GPIO_ENABLE_W1TC_REG0x0028Выключение выходов записью единицы0x0000 0000
GPIO_STRAP_REG0x0038Уровни strapping-выводов при сбросе0x0000 0000
GPIO_IN_REG0x003CУровни на входах GPIO0…210x0000 0000
GPIO_STATUS_REG0x0044Флаги прерываний выводов0x0000 0000
GPIO_STATUS_W1TS_REG0x0048Установка флагов прерываний записью единицы0x0000 0000
GPIO_STATUS_W1TC_REG0x004CСброс флагов прерываний записью единицы0x0000 0000
GPIO_PCPU_INT_REG0x005CПрерывания выводов, разрешённые для ядра0x0000 0000
GPIO_PINn_REG0x0074 + n · 0x0004Настройка прерывания и выхода вывода GPIOn0x0000 0000
GPIO_STATUS_NEXT_REG0x014CТекущие сигналы прерываний выводов0x0000 0000
GPIO_FUNCn_IN_SEL_CFG_REG0x0154 + n · 0x0004Вывод для входного сигнала периферии n0x0000 0000
GPIO_FUNCn_OUT_SEL_CFG_REG0x0554 + n · 0x0004Сигнал периферии на выходе GPIOn0x0000 0080
GPIO_CLOCK_GATE_REG0x062CТактирование регистров GPIO0x0000 0001
GPIO_DATE_REG0x06FCВерсия блока: дата ревизии аппаратуры0x0200 6130

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

GPIO_BT_SELECT_REG — выбор битов для Bluetooth

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

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

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

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

ПолеБитыДоступСбросНазначение
OUT_DATA_ORIG25:0R/W/SS0x0000000Бит n — уровень на выходе GPIOn, если вывод отдан GPIO_OUT_REG

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

GPIO_STRAP_REG — уровни strapping-выводов при сбросе

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

ПолеБитыДоступСбросНазначение
STRAPPING15:0RO0x0000Уровни strapping-выводов GPIO2, GPIO8 и GPIO9, защёлкнутые при сбросе

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

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

ПолеБитыДоступСбросНазначение
IN_DATA_NEXT25:0RO0x0000000Бит n — уровень на входе GPIOn

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

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

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

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

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

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

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

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

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

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

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

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

GPIO_PINn_REG — настройка прерывания и выхода вывода GPIOn

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

Прерывание вывода включают двумя полями: условие в PINn_INT_TYPE и получатель в PINn_INT_ENA. Флаг события появляется в GPIO_STATUS_REG; обработчик сбрасывает его записью единицы в GPIO_STATUS_W1TC_REG, иначе прерывание по уровню или повторное событие не будут видны.

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 — текущие сигналы прерываний выводов

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

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

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

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

1514131211109876543210
—SIGn_IN_SELFUNCn_IN_INV_SELFUNCn_IN_SEL
ПолеБитыДоступСбросНазначение
SIGn_IN_SEL6R/W01 — сигнал идёт через матрицу GPIO, 0 — напрямую от вывода, выбранного в IO MUX
FUNCn_IN_INV_SEL5R/W0Инвертировать входной сигнал
FUNCn_IN_SEL4:0R/W0x00Номер вывода, с которого берётся входной сигнал n; 0x1E — постоянная 1, 0x1F — постоянный 0

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

22 копии, n = 0…21: смещение 0x0554 + n · 0x0004, после сброса 0x0000 0080. TRM: регистр 5.17.

После сброса во всех регистрах записано 0x80 = 128: выходы управляются регистрами GPIO_OUT_REG и GPIO_ENABLE_REG, а выходные драйверы выключены.

1514131211109876543210
—FUNCn_OEN_INV_SELFUNCn_OEN_SELFUNCn_OUT_INV_SELFUNCn_OUT_SEL
ПолеБитыДоступСбросНазначение
FUNCn_OEN_INV_SEL10R/W0Инвертировать сигнал разрешения выхода
FUNCn_OEN_SEL9R/W0Откуда разрешение выхода: 1 — бит GPIO_ENABLE_REG, 0 — от периферии
FUNCn_OUT_INV_SEL8R/W0Инвертировать выходной сигнал
FUNCn_OUT_SEL7:0R/W0x80Номер выходного сигнала периферии 0…127 для GPIOn; 128 — уровень и разрешение берутся из GPIO_OUT_REG и GPIO_ENABLE_REG

GPIO_CLOCK_GATE_REG — тактирование регистров GPIO

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

ПолеБитыДоступСброс
CLK_EN0R/W1

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

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

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

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

Зачем нужны регистры GPIO_OUT_W1TS_REG и GPIO_OUT_W1TC_REG?

Запись единицы в бит n регистра W1TS ставит выход GPIOn в 1, в бит регистра W1TC — сбрасывает в 0; остальные выводы не меняются. Это одна запись вместо чтения, изменения и записи GPIO_OUT_REG, поэтому прерывание между этими шагами не испортит состояние других выводов.

Как вывести сигнал UART или LEDC на произвольный вывод ESP32-C3?

Записать номер выходного сигнала периферии в поле FUNCn_OUT_SEL регистра GPIO_FUNCn_OUT_SEL_CFG_REG нужного вывода, а для входного сигнала — номер вывода в FUNCn_IN_SEL регистра входного сигнала и бит SIGn_IN_SEL = 1. Так работает функция esp_rom_gpio_connect_out_signal и драйверы ESP-IDF.

Источники

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

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

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

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