Регистры GPIO ESP32-C3
Регистры GPIO ESP32-C3: уровни на выходах и входах 22 выводов, установка и сброс битов без чтения-изменения-записи, настройка прерываний и матрица, которая подключает любой сигнал периферии к любому выводу.
Содержание
- Пример на C
- Регистры блока
- GPIO_BT_SELECT_REG
- GPIO_OUT_REG
- GPIO_OUT_W1TS_REG
- GPIO_OUT_W1TC_REG
- GPIO_ENABLE_REG
- GPIO_ENABLE_W1TS_REG
- GPIO_ENABLE_W1TC_REG
- GPIO_STRAP_REG
- GPIO_IN_REG
- GPIO_STATUS_REG
- GPIO_STATUS_W1TS_REG
- GPIO_STATUS_W1TC_REG
- GPIO_PCPU_INT_REG
- GPIO_PINn_REG
- GPIO_STATUS_NEXT_REG
- GPIO_FUNCn_IN_SEL_CFG_REG
- GPIO_FUNCn_OUT_SEL_CFG_REG
- GPIO_CLOCK_GATE_REG
- GPIO_DATE_REG
Блок 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).
| Экземпляр | Базовый адрес |
|---|---|
| GPIO | 0x6000 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_REG | 0x0000 | Выбор битов для Bluetooth | 0x0000 0000 |
| GPIO_OUT_REG | 0x0004 | Уровни на выходах GPIO0…21 | 0x0000 0000 |
| GPIO_OUT_W1TS_REG | 0x0008 | Установка выходов в 1 записью единицы | 0x0000 0000 |
| GPIO_OUT_W1TC_REG | 0x000C | Сброс выходов в 0 записью единицы | 0x0000 0000 |
| GPIO_ENABLE_REG | 0x0020 | Разрешение выходов GPIO0…21 | 0x0000 0000 |
| GPIO_ENABLE_W1TS_REG | 0x0024 | Включение выходов записью единицы | 0x0000 0000 |
| GPIO_ENABLE_W1TC_REG | 0x0028 | Выключение выходов записью единицы | 0x0000 0000 |
| GPIO_STRAP_REG | 0x0038 | Уровни strapping-выводов при сбросе | 0x0000 0000 |
| GPIO_IN_REG | 0x003C | Уровни на входах GPIO0…21 | 0x0000 0000 |
| GPIO_STATUS_REG | 0x0044 | Флаги прерываний выводов | 0x0000 0000 |
| GPIO_STATUS_W1TS_REG | 0x0048 | Установка флагов прерываний записью единицы | 0x0000 0000 |
| GPIO_STATUS_W1TC_REG | 0x004C | Сброс флагов прерываний записью единицы | 0x0000 0000 |
| GPIO_PCPU_INT_REG | 0x005C | Прерывания выводов, разрешённые для ядра | 0x0000 0000 |
| GPIO_PINn_REG | 0x0074 + n · 0x0004 | Настройка прерывания и выхода вывода GPIOn | 0x0000 0000 |
| GPIO_STATUS_NEXT_REG | 0x014C | Текущие сигналы прерываний выводов | 0x0000 0000 |
| GPIO_FUNCn_IN_SEL_CFG_REG | 0x0154 + n · 0x0004 | Вывод для входного сигнала периферии n | 0x0000 0000 |
| GPIO_FUNCn_OUT_SEL_CFG_REG | 0x0554 + n · 0x0004 | Сигнал периферии на выходе GPIOn | 0x0000 0080 |
| GPIO_CLOCK_GATE_REG | 0x062C | Тактирование регистров GPIO | 0x0000 0001 |
| GPIO_DATE_REG | 0x06FC | Версия блока: дата ревизии аппаратуры | 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_SEL | 31:0 | R/W | 0x0000 0000 |
GPIO_OUT_REG — уровни на выходах GPIO0…21
Смещение 0x0004, адрес 0x6000 4004, после сброса 0x0000 0000. TRM: регистр 5.2.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| OUT_DATA_ORIG | 25:0 | R/W/SS | 0x0000000 | Бит n — уровень на выходе GPIOn, если вывод отдан GPIO_OUT_REG |
GPIO_OUT_W1TS_REG — установка выходов в 1 записью единицы
Смещение 0x0008, адрес 0x6000 4008, после сброса 0x0000 0000. TRM: регистр 5.3.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| OUT_W1TS | 25:0 | WT | 0x0000000 |
GPIO_OUT_W1TC_REG — сброс выходов в 0 записью единицы
Смещение 0x000C, адрес 0x6000 400C, после сброса 0x0000 0000. TRM: регистр 5.4.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| OUT_W1TC | 25:0 | WT | 0x0000000 |
GPIO_ENABLE_REG — разрешение выходов GPIO0…21
Смещение 0x0020, адрес 0x6000 4020, после сброса 0x0000 0000. TRM: регистр 5.5.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| ENABLE_DATA | 25:0 | R/W/SS | 0x0000000 | Бит n включает выходной драйвер GPIOn |
GPIO_ENABLE_W1TS_REG — включение выходов записью единицы
Смещение 0x0024, адрес 0x6000 4024, после сброса 0x0000 0000. TRM: регистр 5.6.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| ENABLE_W1TS | 25:0 | WT | 0x0000000 |
GPIO_ENABLE_W1TC_REG — выключение выходов записью единицы
Смещение 0x0028, адрес 0x6000 4028, после сброса 0x0000 0000. TRM: регистр 5.7.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| ENABLE_W1TC | 25:0 | WT | 0x0000000 |
GPIO_STRAP_REG — уровни strapping-выводов при сбросе
Смещение 0x0038, адрес 0x6000 4038, после сброса 0x0000 0000. TRM: регистр 5.8.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| STRAPPING | 15:0 | RO | 0x0000 | Уровни strapping-выводов GPIO2, GPIO8 и GPIO9, защёлкнутые при сбросе |
GPIO_IN_REG — уровни на входах GPIO0…21
Смещение 0x003C, адрес 0x6000 403C, после сброса 0x0000 0000. TRM: регистр 5.9.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| IN_DATA_NEXT | 25:0 | RO | 0x0000000 | Бит n — уровень на входе GPIOn |
GPIO_STATUS_REG — флаги прерываний выводов
Смещение 0x0044, адрес 0x6000 4044, после сброса 0x0000 0000. TRM: регистр 5.10.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| STATUS_INTERRUPT | 25:0 | R/W/SS | 0x0000000 | Бит n — флаг прерывания GPIOn; сбрасывается записью в STATUS_W1TC |
GPIO_STATUS_W1TS_REG — установка флагов прерываний записью единицы
Смещение 0x0048, адрес 0x6000 4048, после сброса 0x0000 0000. TRM: регистр 5.11.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| STATUS_W1TS | 25:0 | WT | 0x0000000 |
GPIO_STATUS_W1TC_REG — сброс флагов прерываний записью единицы
Смещение 0x004C, адрес 0x6000 404C, после сброса 0x0000 0000. TRM: регистр 5.12.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| STATUS_W1TC | 25:0 | WT | 0x0000000 |
GPIO_PCPU_INT_REG — прерывания выводов, разрешённые для ядра
Смещение 0x005C, адрес 0x6000 405C, после сброса 0x0000 0000. TRM: регистр 5.13.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| PROCPU_INT | 25:0 | RO | 0x0000000 |
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, иначе прерывание по уровню или повторное событие не будут видны.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | PINn_INT_ENA | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| PINn_INT_ENA | PINn_CONFIG | PINn_WAKEUP_ENABLE | PINn_INT_TYPE | — | PINn_SYNC1_BYPASS | PINn_PAD_DRIVER | PINn_SYNC2_BYPASS | ||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| PINn_INT_ENA | 17:13 | R/W | 0x00 | Куда идёт прерывание: бит 13 — обычное прерывание ядра, бит 14 — немаскируемое |
| PINn_CONFIG | 12:11 | R/W | 0x0 | Зарезервировано |
| PINn_WAKEUP_ENABLE | 10 | R/W | 0 | Пробуждать из лёгкого сна по прерыванию вывода |
| PINn_INT_TYPE | 9:7 | R/W | 0x0 | Условие прерывания: 0 — выключено, 1 — фронт, 2 — спад, 3 — любой перепад, 4 — низкий уровень, 5 — высокий уровень |
| PINn_SYNC1_BYPASS | 4:3 | R/W | 0x0 | Первая ступень синхронизации входа с APB_CLK: 0 — нет, 1 — по спаду, 2 и 3 — по фронту |
| PINn_PAD_DRIVER | 2 | R/W | 0 | Тип выхода: 0 — двухтактный, 1 — открытый сток |
| PINn_SYNC2_BYPASS | 1:0 | R/W | 0x0 | Вторая ступень синхронизации входа, значения как у SYNC1_BYPASS |
GPIO_STATUS_NEXT_REG — текущие сигналы прерываний выводов
Смещение 0x014C, адрес 0x6000 414C, после сброса 0x0000 0000. TRM: регистр 5.15.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| STATUS_INTERRUPT_NEXT | 25:0 | RO | 0x0000000 |
GPIO_FUNCn_IN_SEL_CFG_REG — вывод для входного сигнала периферии n
128 копий, n = 0…127: смещение 0x0154 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 5.16.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | SIGn_IN_SEL | FUNCn_IN_INV_SEL | FUNCn_IN_SEL | ||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| SIGn_IN_SEL | 6 | R/W | 0 | 1 — сигнал идёт через матрицу GPIO, 0 — напрямую от вывода, выбранного в IO MUX |
| FUNCn_IN_INV_SEL | 5 | R/W | 0 | Инвертировать входной сигнал |
| FUNCn_IN_SEL | 4:0 | R/W | 0x00 | Номер вывода, с которого берётся входной сигнал 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, а выходные драйверы выключены.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | FUNCn_OEN_INV_SEL | FUNCn_OEN_SEL | FUNCn_OUT_INV_SEL | FUNCn_OUT_SEL | |||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| FUNCn_OEN_INV_SEL | 10 | R/W | 0 | Инвертировать сигнал разрешения выхода |
| FUNCn_OEN_SEL | 9 | R/W | 0 | Откуда разрешение выхода: 1 — бит GPIO_ENABLE_REG, 0 — от периферии |
| FUNCn_OUT_INV_SEL | 8 | R/W | 0 | Инвертировать выходной сигнал |
| FUNCn_OUT_SEL | 7:0 | R/W | 0x80 | Номер выходного сигнала периферии 0…127 для GPIOn; 128 — уровень и разрешение берутся из GPIO_OUT_REG и GPIO_ENABLE_REG |
GPIO_CLOCK_GATE_REG — тактирование регистров GPIO
Смещение 0x062C, адрес 0x6000 462C, после сброса 0x0000 0001. TRM: регистр 5.18.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| CLK_EN | 0 | R/W | 1 |
GPIO_DATE_REG — версия блока: дата ревизии аппаратуры
Смещение 0x06FC, адрес 0x6000 46FC, после сброса 0x0200 6130. TRM: регистр 5.19 (GPIO_DATE_REG).
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| REG_DATE | 27:0 | R/W | 0x2006130 |
Частые вопросы
Зачем нужны регистры 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.
Источники
- Espressif. ESP32-C3 Technical Reference Manual, версия 1.4 — глава 5: таблица Register Summary и рисунки регистров — смещения, поля, тип доступа и значения после сброса
- Espressif. SVD svd/esp32c3.svd, версия 18 (espressif/svd, коммит be20aa1) — базовые адреса периферии, список регистров и полей; лицензия Apache-2.0
- Espressif. ESP-IDF v6.1: заголовки components/soc/esp32c3/register/soc/*_reg.h (коммит fff9895) — имена макросов регистров и полей, сверка положения полей и значений по умолчанию; лицензия Apache-2.0 OR MIT
Нашли ошибку в регистрах?
Другие регистры ESP32-C3
- Все регистры ESP32-C3Блоки периферии и базовые адреса
- IO MUX — мультиплексор функций и электрические настройки выводовPIN_CTRL, IO_MUX_GPIOn_REG, IO_MUX_DATE_REG
- UART — универсальный асинхронный приёмопередатчикUART_FIFO_REG, UART_INT_RAW_REG, UART_INT_ST_REG, UART_INT_ENA_REG
- SPI — контроллер SPI общего назначения GP-SPI2SPI_CMD_REG, SPI_ADDR_REG, SPI_CTRL_REG, SPI_CLOCK_REG
- I2C — контроллер шины I2CI2C_SCL_LOW_PERIOD_REG, I2C_CTR_REG, I2C_SR_REG, I2C_TO_REG
- LEDC — контроллер ШИМ для светодиодов и не толькоLEDC_LSCHn_CONF0_REG, LEDC_LSCHn_HPOINT_REG, LEDC_LSCHn_DUTY_REG, LEDC_LSCHn_CONF1_REG
- TIMG — группа таймеров: таймер общего назначения и сторожTIMG_T0CONFIG_REG, TIMG_T0LO_REG, TIMG_T0HI_REG, TIMG_T0UPDATE_REG
- RMT — контроллер инфракрасного пульта и импульсных протоколовRMT_CHnDATA_REG, RMT_CHnCONF0_REG, RMT_CHnCONF0_REG, RMT_CHnCONF1_REG
- SYSTIMER — системный таймерSYSTIMER_CONF_REG, SYSTIMER_UNITn_OP_REG, SYSTIMER_UNITn_LOAD_HI_REG, SYSTIMER_UNITn_LOAD_LO_REG
- RTC_CNTL — управление питанием, сном и RTCRTC_CNTL_OPTIONS0_REG, RTC_CNTL_SLP_TIMER0_REG, RTC_CNTL_SLP_TIMER1_REG, RTC_CNTL_TIME_UPDATE_REG
- АЦП — 12-битный SAR АЦП и датчик температурыAPB_SARADC_CTRL_REG, APB_SARADC_CTRL2_REG, APB_SARADC_FILTER_CTRL1_REG, APB_SARADC_SAR_PATT_TABn_REG
- USB Serial/JTAG — встроенный USB-порт: виртуальный COM-порт и JTAGUSB_SERIAL_JTAG_EP1_REG, USB_SERIAL_JTAG_EP1_CONF_REG, USB_SERIAL_JTAG_INT_RAW_REG, USB_SERIAL_JTAG_INT_ST_REG
- eFuse — однократно программируемая память настроек и ключейEFUSE_RD_WR_DIS_REG, EFUSE_RD_REPEAT_DATA0_REG, EFUSE_RD_REPEAT_DATA1_REG, EFUSE_RD_REPEAT_DATA2_REG
- INTERRUPT — матрица прерыванийINTERRUPT_CORE0_PWR_INTR_MAP_REG, INTERRUPT_CORE0_I2C_MST_INT_MAP_REG, INTERRUPT_CORE0_SLCn_INTR_MAP_REG, INTERRUPT_CORE0_APB_CTRL_INTR_MAP_REG
Статьи, инструменты и термины
- ESP32-C3: выводы и GPIO22 GPIO: функции, свободные и занятые выводы, флеш-память, strapping, USB, JTAG, токи
- Матрица GPIOПрограммное соединение сигналов периферии ESP32 с любыми выводами
- GPIOВывод общего назначения: вход и выход, подтяжки, сила выхода, функции
- Открытый стокВыход только с транзистором к земле, единицу даёт подтяжка