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

Регистры UART ESP32

Регистры UART ESP32: скорость обмена от APB_CLK или REF_TICK, длина слова, чётность и стоп-биты, FIFO по 128 байт в общей памяти на 1 КБ, аппаратное и программное управление потоком, режим RS-485 и флаги прерываний — для трёх контроллеров UART0…UART2.

У ESP32 три одинаковых контроллера UART: UART0 по адресу 0x3FF4 0000 (загрузчик и консоль), UART1 — 0x3FF5 0000, UART2 — 0x3FF6 E000. Макросы ESP-IDF принимают номер контроллера: UART_CONF0_REG(2). FIFO передатчика и приёмника всех трёх лежат в общей памяти 1024 байта; по умолчанию каждому достаётся 128 байт, размеры задают поля TX_SIZE и RX_SIZE регистра UART_MEM_CONF_REG.

Скорость: baud = f / (CLKDIV + CLKDIV_FRAG / 16), где f — APB_CLK 80 МГц, если в UART_CONF0_REG установлен TICK_REF_ALWAYS_ON (значение после сброса), или REF_TICK 1 МГц, если бит сброшен. Например, 80 МГц / (694 + 7/16) = 115 200 бод.

Регистры UART, как и остальной периферии с адресами 0x3FF4 0000…0x3FF7 FFFF, доступны и через второе окно — шину AHB с адреса 0x6000 0000 при тех же смещениях. Окно DPort быстрее, но читает с упреждением и может переставлять обращения, поэтому ESP-IDF пишет в TX FIFO через адрес AHB (макрос UART_FIFO_AHB_REG), а RX FIFO читает через UART_FIFO_REG: чтение FIFO по адресу AHB, по разделу 3.3.5 TRM, даёт непредсказуемые ошибки.

ЭкземплярБазовый адрес
UART00x3FF4 0000
UART10x3FF5 0000
UART20x3FF6 E000

Пример на C

UART2: 115 200 бод 8N1 и передача байта (soc/uart_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/uart_reg.h"

REG_SET_BIT(UART_CONF0_REG(2), UART_TICK_REF_ALWAYS_ON); // такт — APB_CLK 80 МГц
REG_SET_FIELD(UART_CLKDIV_REG(2), UART_CLKDIV, 694);     // 80 МГц / 694,4375
REG_SET_FIELD(UART_CLKDIV_REG(2), UART_CLKDIV_FRAG, 7);
REG_SET_FIELD(UART_CONF0_REG(2), UART_BIT_NUM, 3);       // 8 бит данных
REG_CLR_BIT(UART_CONF0_REG(2), UART_PARITY_EN);          // без чётности
REG_SET_FIELD(UART_CONF0_REG(2), UART_STOP_BIT_NUM, 1);  // 1 стоп-бит

while (REG_GET_FIELD(UART_STATUS_REG(2), UART_TXFIFO_CNT) >= 127) {}
REG_WRITE(UART_FIFO_AHB_REG(2), 'A');                    // запись через AHB

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

Регистр (ESP-IDF)СмещениеНазначениеПосле сброса
UART_FIFO_REG(i)0x0000Чтение байта из RX FIFO и запись в TX FIFO0x0000 0000
UART_INT_RAW_REG(i)0x0004Необработанные флаги прерываний0x0000 0000
UART_INT_ST_REG(i)0x0008Флаги прерываний после маски разрешения0x0000 0000
UART_INT_ENA_REG(i)0x000CРазрешение прерываний0x0000 0000
UART_INT_CLR_REG(i)0x0010Сброс флагов прерываний записью 10x0000 0000
UART_CLKDIV_REG(i)0x0014Делитель скорости обмена0x0000 02B6
UART_AUTOBAUD_REG(i)0x0018Автоопределение скорости и фильтр помех0x0000 1000
UART_STATUS_REG(i)0x001CЗаполнение FIFO, уровни линий и состояния автоматов0x0000 0000
UART_CONF0_REG(i)0x0020Формат кадра, источник такта, инверсия линий, сброс FIFO0x0800 001C
UART_CONF1_REG(i)0x0024Пороги FIFO, таймаут и аппаратное управление потоком0x0000 6060
UART_LOWPULSE_REG(i)0x0028Автоопределение скорости: самый короткий низкий импульс0x000F FFFF
UART_HIGHPULSE_REG(i)0x002CАвтоопределение скорости: самый короткий высокий импульс0x000F FFFF
UART_RXD_CNT_REG(i)0x0030Автоопределение скорости: число перепадов на RXD0x0000 0000
UART_FLOW_CONF_REG(i)0x0034Программное управление потоком XON/XOFF0x0000 0000
UART_SLEEP_CONF_REG(i)0x0038Порог пробуждения из лёгкого сна по RXD0x0000 00F0
UART_SWFC_CONF_REG(i)0x003CСимволы и пороги XON и XOFF0x1311 E000
UART_IDLE_CONF_REG(i)0x0040Паузы между кадрами, длина break, порог конца кадра0x00A4 0100
UART_RS485_CONF_REG(i)0x0044Режим RS-485 и задержки0x0000 0000
UART_AT_CMD_PRECNT_REG(i)0x0048Escape-последовательность: пауза перед ней0x0018 6A00
UART_AT_CMD_POSTCNT_REG(i)0x004CEscape-последовательность: пауза после неё0x0018 6A00
UART_AT_CMD_GAPTOUT_REG(i)0x0050Escape-последовательность: наибольший промежуток между символами0x0000 1E00
UART_AT_CMD_CHAR_REG(i)0x0054Escape-последовательность: символ и их число0x0000 032B
UART_MEM_CONF_REG(i)0x0058Размеры FIFO, старшие биты порогов, питание памяти0x0000 0088
UART_MEM_TX_STATUS_REG(i)0x005CАдреса записи и чтения TX FIFO0x0000 0000
UART_MEM_RX_STATUS_REG(i)0x0060Адреса записи и чтения RX FIFO0x0000 0000
UART_MEM_CNT_STATUS_REG(i)0x0064Старшие биты счётчиков FIFO0x0000 0000
UART_POSPULSE_REG(i)0x0068Автоопределение скорости: самый короткий период по фронтам0x000F FFFF
UART_NEGPULSE_REG(i)0x006CАвтоопределение скорости: самый короткий период по спадам0x000F FFFF

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

UART_FIFO_REG(i) — чтение байта из RX FIFO и запись в TX FIFO

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

ПолеБитыДоступСбросНазначение
RXFIFO_RD_BYTE7:0R/W0x00Чтение забирает байт из RX FIFO; запись кладёт байт в TX FIFO

UART_INT_RAW_REG(i) — необработанные флаги прерываний

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

ПолеБитыДоступСбросНазначение
AT_CMD_CHAR_DET_INT_RAW18RO0Обнаружена escape-последовательность AT_CMD_CHAR
RS485_CLASH_INT_RAW17RO0Режим RS-485: коллизия передатчика и приёмника
RS485_FRM_ERR_INT_RAW16RO0Режим RS-485: ошибка кадра при эхо-контроле
RS485_PARITY_ERR_INT_RAW15RO0Режим RS-485: ошибка чётности при эхо-контроле
TX_DONE_INT_RAW14RO0Передатчик отправил все данные из FIFO
TX_BRK_IDLE_DONE_INT_RAW13RO0Выдержана пауза после передачи break
TX_BRK_DONE_INT_RAW12RO0Передача break после данных закончена
GLITCH_DET_INT_RAW11RO0На входе RXD замечена помеха посреди стартового бита
SW_XOFF_INT_RAW10RO0Принят символ XOFF программного управления потоком
SW_XON_INT_RAW9RO0Принят символ XON программного управления потоком
RXFIFO_TOUT_INT_RAW8RO0Таймаут приёма: линия молчит дольше RX_TOUT_THRHD битовых интервалов
BRK_DET_INT_RAW7RO0Принят сигнал break: линия RXD долго в нуле
CTS_CHG_INT_RAW6RO0Изменился уровень на входе CTS
DSR_CHG_INT_RAW5RO0Изменился уровень на входе DSR
RXFIFO_OVF_INT_RAW4RO0RX FIFO переполнен, принятый байт потерян
FRM_ERR_INT_RAW3RO0Ошибка кадра: на месте стоп-бита принят 0
PARITY_ERR_INT_RAW2RO0Принят байт с ошибкой чётности
TXFIFO_EMPTY_INT_RAW1RO0В TX FIFO меньше байтов, чем задано в TXFIFO_EMPTY_THRHD
RXFIFO_FULL_INT_RAW0RO0В RX FIFO больше байтов, чем задано в RXFIFO_FULL_THRHD

UART_INT_ST_REG(i) — флаги прерываний после маски разрешения

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

ПолеБитыДоступСбросНазначение
AT_CMD_CHAR_DET_INT_ST18RO0Обнаружена escape-последовательность AT_CMD_CHAR
RS485_CLASH_INT_ST17RO0Режим RS-485: коллизия передатчика и приёмника
RS485_FRM_ERR_INT_ST16RO0Режим RS-485: ошибка кадра при эхо-контроле
RS485_PARITY_ERR_INT_ST15RO0Режим RS-485: ошибка чётности при эхо-контроле
TX_DONE_INT_ST14RO0Передатчик отправил все данные из FIFO
TX_BRK_IDLE_DONE_INT_ST13RO0Выдержана пауза после передачи break
TX_BRK_DONE_INT_ST12RO0Передача break после данных закончена
GLITCH_DET_INT_ST11RO0На входе RXD замечена помеха посреди стартового бита
SW_XOFF_INT_ST10RO0Принят символ XOFF программного управления потоком
SW_XON_INT_ST9RO0Принят символ XON программного управления потоком
RXFIFO_TOUT_INT_ST8RO0Таймаут приёма: линия молчит дольше RX_TOUT_THRHD битовых интервалов
BRK_DET_INT_ST7RO0Принят сигнал break: линия RXD долго в нуле
CTS_CHG_INT_ST6RO0Изменился уровень на входе CTS
DSR_CHG_INT_ST5RO0Изменился уровень на входе DSR
RXFIFO_OVF_INT_ST4RO0RX FIFO переполнен, принятый байт потерян
FRM_ERR_INT_ST3RO0Ошибка кадра: на месте стоп-бита принят 0
PARITY_ERR_INT_ST2RO0Принят байт с ошибкой чётности
TXFIFO_EMPTY_INT_ST1RO0В TX FIFO меньше байтов, чем задано в TXFIFO_EMPTY_THRHD
RXFIFO_FULL_INT_ST0RO0В RX FIFO больше байтов, чем задано в RXFIFO_FULL_THRHD

UART_INT_ENA_REG(i) — разрешение прерываний

Смещение 0x000C, после сброса 0x0000 0000. TRM: регистр 19.4.

ПолеБитыДоступСбросНазначение
AT_CMD_CHAR_DET_INT_ENA18R/W0Обнаружена escape-последовательность AT_CMD_CHAR
RS485_CLASH_INT_ENA17R/W0Режим RS-485: коллизия передатчика и приёмника
RS485_FRM_ERR_INT_ENA16R/W0Режим RS-485: ошибка кадра при эхо-контроле
RS485_PARITY_ERR_INT_ENA15R/W0Режим RS-485: ошибка чётности при эхо-контроле
TX_DONE_INT_ENA14R/W0Передатчик отправил все данные из FIFO
TX_BRK_IDLE_DONE_INT_ENA13R/W0Выдержана пауза после передачи break
TX_BRK_DONE_INT_ENA12R/W0Передача break после данных закончена
GLITCH_DET_INT_ENA11R/W0На входе RXD замечена помеха посреди стартового бита
SW_XOFF_INT_ENA10R/W0Принят символ XOFF программного управления потоком
SW_XON_INT_ENA9R/W0Принят символ XON программного управления потоком
RXFIFO_TOUT_INT_ENA8R/W0Таймаут приёма: линия молчит дольше RX_TOUT_THRHD битовых интервалов
BRK_DET_INT_ENA7R/W0Принят сигнал break: линия RXD долго в нуле
CTS_CHG_INT_ENA6R/W0Изменился уровень на входе CTS
DSR_CHG_INT_ENA5R/W0Изменился уровень на входе DSR
RXFIFO_OVF_INT_ENA4R/W0RX FIFO переполнен, принятый байт потерян
FRM_ERR_INT_ENA3R/W0Ошибка кадра: на месте стоп-бита принят 0
PARITY_ERR_INT_ENA2R/W0Принят байт с ошибкой чётности
TXFIFO_EMPTY_INT_ENA1R/W0В TX FIFO меньше байтов, чем задано в TXFIFO_EMPTY_THRHD
RXFIFO_FULL_INT_ENA0R/W0В RX FIFO больше байтов, чем задано в RXFIFO_FULL_THRHD

UART_INT_CLR_REG(i) — сброс флагов прерываний записью 1

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

ПолеБитыДоступСбросНазначение
AT_CMD_CHAR_DET_INT_CLR18WO0Обнаружена escape-последовательность AT_CMD_CHAR
RS485_CLASH_INT_CLR17WO0Режим RS-485: коллизия передатчика и приёмника
RS485_FRM_ERR_INT_CLR16WO0Режим RS-485: ошибка кадра при эхо-контроле
RS485_PARITY_ERR_INT_CLR15WO0Режим RS-485: ошибка чётности при эхо-контроле
TX_DONE_INT_CLR14WO0Передатчик отправил все данные из FIFO
TX_BRK_IDLE_DONE_INT_CLR13WO0Выдержана пауза после передачи break
TX_BRK_DONE_INT_CLR12WO0Передача break после данных закончена
GLITCH_DET_INT_CLR11WO0На входе RXD замечена помеха посреди стартового бита
SW_XOFF_INT_CLR10WO0Принят символ XOFF программного управления потоком
SW_XON_INT_CLR9WO0Принят символ XON программного управления потоком
RXFIFO_TOUT_INT_CLR8WO0Таймаут приёма: линия молчит дольше RX_TOUT_THRHD битовых интервалов
BRK_DET_INT_CLR7WO0Принят сигнал break: линия RXD долго в нуле
CTS_CHG_INT_CLR6WO0Изменился уровень на входе CTS
DSR_CHG_INT_CLR5WO0Изменился уровень на входе DSR
RXFIFO_OVF_INT_CLR4WO0RX FIFO переполнен, принятый байт потерян
FRM_ERR_INT_CLR3WO0Ошибка кадра: на месте стоп-бита принят 0
PARITY_ERR_INT_CLR2WO0Принят байт с ошибкой чётности
TXFIFO_EMPTY_INT_CLR1WO0В TX FIFO меньше байтов, чем задано в TXFIFO_EMPTY_THRHD
RXFIFO_FULL_INT_CLR0WO0В RX FIFO больше байтов, чем задано в RXFIFO_FULL_THRHD

UART_CLKDIV_REG(i) — делитель скорости обмена

Смещение 0x0014, после сброса 0x0000 02B6. TRM: регистр 19.6.

31302928272625242322212019181716
—CLKDIV_FRAGCLKDIV
1514131211109876543210
CLKDIV
ПолеБитыДоступСбросНазначение
CLKDIV_FRAG23:20R/W0x0Дробная часть делителя скорости в шестнадцатых
CLKDIV19:0R/W0x002B6Целая часть делителя скорости

UART_AUTOBAUD_REG(i) — автоопределение скорости и фильтр помех

Смещение 0x0018, после сброса 0x0000 1000. TRM: регистр 19.7.

1514131211109876543210
GLITCH_FILT—AUTOBAUD_EN
ПолеБитыДоступСбросНазначение
GLITCH_FILT15:8R/W0x10Импульсы короче этого числа тактов отбрасываются
AUTOBAUD_EN0R/W0Включить автоопределение скорости

UART_STATUS_REG(i) — заполнение FIFO, уровни линий и состояния автоматов

Смещение 0x001C, после сброса 0x0000 0000. TRM: регистр 19.8.

31302928272625242322212019181716
TXDRTSNDTRN—ST_UTX_OUTTXFIFO_CNT
1514131211109876543210
RXDCTSNDSRN—ST_URX_OUTRXFIFO_CNT
ПолеБитыДоступСбросНазначение
TXD31RO0Текущий уровень на линии TXD
RTSN30RO0Текущий уровень выхода RTS
DTRN29RO0
ST_UTX_OUT27:24RO0x0Состояние автомата передатчика
TXFIFO_CNT23:16RO0x00Число байтов в TX FIFO (младшие 8 бит; старшие — в MEM_CNT_STATUS)
RXD15RO0Текущий уровень на линии RXD
CTSN14RO0Текущий уровень входа CTS
DSRN13RO0
ST_URX_OUT11:8RO0x0Состояние автомата приёмника
RXFIFO_CNT7:0RO0x00Число байтов в RX FIFO (младшие 8 бит)

UART_CONF0_REG(i) — формат кадра, источник такта, инверсия линий, сброс FIFO

Смещение 0x0020, после сброса 0x0800 001C. TRM: регистр 19.9.

ПолеБитыДоступСбросНазначение
TICK_REF_ALWAYS_ON27R/W1Источник такта: 1 — APB_CLK, 0 — REF_TICK 1 МГц
DTR_INV24R/W0
RTS_INV23R/W0
TXD_INV22R/W0Инвертировать выход TXD
DSR_INV21R/W0
CTS_INV20R/W0
RXD_INV19R/W0Инвертировать вход RXD
TXFIFO_RST18R/W0Сброс TX FIFO: записать 1, затем 0
RXFIFO_RST17R/W0Сброс RX FIFO: записать 1, затем 0
IRDA_EN16R/W0Режим IrDA
TX_FLOW_EN15R/W0Аппаратное управление потоком передатчика по CTS
LOOPBACK14R/W0Петля: TXD замкнут на RXD внутри чипа
IRDA_RX_INV13R/W0
IRDA_TX_INV12R/W0
IRDA_WCTL11R/W0
IRDA_TX_EN10R/W0
IRDA_DPLX9R/W0
TXD_BRK8R/W0После передачи данных отправить break
SW_DTR7R/W0
SW_RTS6R/W0
STOP_BIT_NUM5:4R/W0x1Число стоп-битов: 1 — один, 2 — полтора, 3 — два
BIT_NUM3:2R/W0x3Длина слова данных: 0 — 5 бит, 1 — 6, 2 — 7, 3 — 8 бит
PARITY_EN1R/W0Включить бит чётности
PARITY0R/W0Тип чётности: 0 — чётный, 1 — нечётный

UART_CONF1_REG(i) — пороги FIFO, таймаут и аппаратное управление потоком

Смещение 0x0024, после сброса 0x0000 6060. TRM: регистр 19.10.

31302928272625242322212019181716
RX_TOUT_ENRX_TOUT_THRHDRX_FLOW_ENRX_FLOW_THRHD
1514131211109876543210
—TXFIFO_EMPTY_THRHD—RXFIFO_FULL_THRHD
ПолеБитыДоступСбросНазначение
RX_TOUT_EN31R/W0Включить таймаут приёма
RX_TOUT_THRHD30:24R/W0x00Таймаут приёма в интервалах длительности байта
RX_FLOW_EN23R/W0Аппаратное управление потоком приёмника по RTS
RX_FLOW_THRHD22:16R/W0x00Порог RX FIFO для снятия RTS
TXFIFO_EMPTY_THRHD14:8R/W0x60Порог прерывания TXFIFO_EMPTY (младшие 7 бит)
RXFIFO_FULL_THRHD6:0R/W0x60Порог прерывания RXFIFO_FULL (младшие 7 бит)

UART_LOWPULSE_REG(i) — автоопределение скорости: самый короткий низкий импульс

Смещение 0x0028, после сброса 0x000F FFFF. TRM: регистр 19.11.

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

UART_HIGHPULSE_REG(i) — автоопределение скорости: самый короткий высокий импульс

Смещение 0x002C, после сброса 0x000F FFFF. TRM: регистр 19.12.

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

UART_RXD_CNT_REG(i) — автоопределение скорости: число перепадов на RXD

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

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

UART_FLOW_CONF_REG(i) — программное управление потоком XON/XOFF

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

1514131211109876543210
—SEND_XOFFSEND_XONFORCE_XOFFFORCE_XONXONOFF_DELSW_FLOW_CON_EN
ПолеБитыДоступСброс
SEND_XOFF5R/W0
SEND_XON4R/W0
FORCE_XOFF3R/W0
FORCE_XON2R/W0
XONOFF_DEL1R/W0
SW_FLOW_CON_EN0R/W0

UART_SLEEP_CONF_REG(i) — порог пробуждения из лёгкого сна по RXD

Смещение 0x0038, после сброса 0x0000 00F0. TRM: регистр 19.15.

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

UART_SWFC_CONF_REG(i) — символы и пороги XON и XOFF

Смещение 0x003C, после сброса 0x1311 E000. TRM: регистр 19.16.

31302928272625242322212019181716
XOFF_CHARXON_CHAR
1514131211109876543210
XOFF_THRESHOLDXON_THRESHOLD
ПолеБитыДоступСброс
XOFF_CHAR31:24R/W0x13
XON_CHAR23:16R/W0x11
XOFF_THRESHOLD15:8R/W0xE0
XON_THRESHOLD7:0R/W0x00

UART_IDLE_CONF_REG(i) — паузы между кадрами, длина break, порог конца кадра

Смещение 0x0040, после сброса 0x00A4 0100. TRM: регистр 19.17.

31302928272625242322212019181716
—TX_BRK_NUMTX_IDLE_NUM
1514131211109876543210
TX_IDLE_NUMRX_IDLE_THRHD
ПолеБитыДоступСбросНазначение
TX_BRK_NUM27:20R/W0x0AДлина break в битовых интервалах
TX_IDLE_NUM19:10R/W0x100Пауза между кадрами передачи
RX_IDLE_THRHD9:0R/W0x100Пауза на RXD, после которой кадр считается законченным

UART_RS485_CONF_REG(i) — режим RS-485 и задержки

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

1514131211109876543210
—RS485_TX_DLY_NUMRS485_RX_DLY_NUMRS485RXBY_TX_ENRS485TX_RX_ENDL1_ENDL0_ENRS485_EN
ПолеБитыДоступСброс
RS485_TX_DLY_NUM9:6R/W0x0
RS485_RX_DLY_NUM5R/W0
RS485RXBY_TX_EN4R/W0
RS485TX_RX_EN3R/W0
DL1_EN2R/W0
DL0_EN1R/W0
RS485_EN0R/W0

UART_AT_CMD_PRECNT_REG(i) — escape-последовательность: пауза перед ней

Смещение 0x0048, после сброса 0x0018 6A00. TRM: регистр 19.19.

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

UART_AT_CMD_POSTCNT_REG(i) — escape-последовательность: пауза после неё

Смещение 0x004C, после сброса 0x0018 6A00. TRM: регистр 19.20.

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

UART_AT_CMD_GAPTOUT_REG(i) — escape-последовательность: наибольший промежуток между символами

Смещение 0x0050, после сброса 0x0000 1E00. TRM: регистр 19.21.

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

UART_AT_CMD_CHAR_REG(i) — escape-последовательность: символ и их число

Смещение 0x0054, после сброса 0x0000 032B. TRM: регистр 19.22.

1514131211109876543210
CHAR_NUMAT_CMD_CHAR
ПолеБитыДоступСброс
CHAR_NUM15:8R/W0x03
AT_CMD_CHAR7:0R/W0x2B

UART_MEM_CONF_REG(i) — размеры FIFO, старшие биты порогов, питание памяти

Смещение 0x0058, после сброса 0x0000 0088. TRM: регистр 19.23.

31302928272625242322212019181716
—TX_MEM_EMPTY_THRHDRX_MEM_FULL_THRHDXOFF_THRESHOLD_H2XON_THRESHOLD_H2RX_TOUT_THRHD_H3RX_FLOW_THRHD_H3
1514131211109876543210
RX_FLOW_THRHD_H3—TX_SIZERX_SIZE—MEM_PD
ПолеБитыДоступСбросНазначение
TX_MEM_EMPTY_THRHD30:28R/W0x0
RX_MEM_FULL_THRHD27:25R/W0x0
XOFF_THRESHOLD_H224:23R/W0x0
XON_THRESHOLD_H222:21R/W0x0
RX_TOUT_THRHD_H320:18R/W0x0
RX_FLOW_THRHD_H317:15R/W0x0
TX_SIZE10:7R/W0x1Размер TX FIFO в блоках по 128 байт
RX_SIZE6:3R/W0x1Размер RX FIFO в блоках по 128 байт
MEM_PD0R/W0Выключить питание памяти FIFO

UART_MEM_TX_STATUS_REG(i) — адреса записи и чтения TX FIFO

Смещение 0x005C, после сброса 0x0000 0000. TRM: регистр 19.24.

31302928272625242322212019181716
—MEM_TX_WR_ADDR
1514131211109876543210
MEM_TX_WR_ADDRMEM_TX_RD_ADDR—
ПолеБитыДоступСброс
MEM_TX_WR_ADDR23:13RO0x000
MEM_TX_RD_ADDR12:2RO0x000

UART_MEM_RX_STATUS_REG(i) — адреса записи и чтения RX FIFO

Смещение 0x0060, после сброса 0x0000 0000. TRM: регистр 19.25.

31302928272625242322212019181716
—MEM_RX_WR_ADDR
1514131211109876543210
MEM_RX_WR_ADDRMEM_RX_RD_ADDR—
ПолеБитыДоступСброс
MEM_RX_WR_ADDR23:13RO0x000
MEM_RX_RD_ADDR12:2RO0x000

UART_MEM_CNT_STATUS_REG(i) — старшие биты счётчиков FIFO

Смещение 0x0064, после сброса 0x0000 0000. TRM: регистр 19.26.

1514131211109876543210
—TX_MEM_CNTRX_MEM_CNT
ПолеБитыДоступСброс
TX_MEM_CNT5:3RO0x0
RX_MEM_CNT2:0RO0x0

UART_POSPULSE_REG(i) — автоопределение скорости: самый короткий период по фронтам

Смещение 0x0068, после сброса 0x000F FFFF. TRM: регистр 19.27.

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

UART_NEGPULSE_REG(i) — автоопределение скорости: самый короткий период по спадам

Смещение 0x006C, после сброса 0x000F FFFF. TRM: регистр 19.28.

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

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

Какие значения CLKDIV нужны для 115 200 и 9600 бод на ESP32?

При APB_CLK 80 МГц: 80 000 000 / 115 200 = 694,44 — CLKDIV = 694, CLKDIV_FRAG = 7; для 9600 бод — 8333,33, CLKDIV = 8333, CLKDIV_FRAG = 5. Если UART тактируется от REF_TICK 1 МГц (бит TICK_REF_ALWAYS_ON сброшен), делитель в 80 раз меньше, зато скорость не меняется при смене частоты APB.

Зачем ESP-IDF пишет в UART ESP32 через UART_FIFO_AHB_REG?

Окно DPort (0x3FF4 0000) читает с упреждением и может менять порядок обращений к шине, а для FIFO важна каждая запись. Поэтому байты для передачи пишут по адресу шины AHB — 0x6000 0000 плюс смещение UART, макрос UART_FIFO_AHB_REG, — а принятые читают через UART_FIFO_REG: чтение FIFO по адресу AHB TRM запрещает. Подробности — в разделах 3.3, 3.10, 3.16 и 3.17 документа ESP32 ECO and Workarounds for Bugs.

Источники

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

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

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

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