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

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

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

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

Скорость: baud = f_core / (CLKDIV + CLKDIV_FRAG / 16), где f_core — такт ядра UART. Его источник выбирает поле SCLK_SEL регистра UART_CLK_CONF_REG (1 — APB_CLK 80 МГц, 2 — RC_FAST_CLK, 3 — XTAL_CLK 40 МГц, после сброса 3), затем такт делится. TRM (раздел 26.4.1) записывает этот делитель как SCLK_DIV_NUM + SCLK_DIV_B / SCLK_DIV_A, а драйвер ESP-IDF (uart_ll.h) пишет в SCLK_DIV_NUM делитель минус 1 и при расчёте скорости прибавляет 1. При такте 80 МГц UART работает до 5 Мбод.

Делитель скорости, формат кадра, RS-485 и программное управление потоком — синхронные регистры (таблица 26.5-1 TRM): их значения попадают в домен такта ядра UART только при синхронизации. Порядок по TRM: сбросить UPDATE_CTRL регистра UART_ID_REG (после сброса там 1 — автоматическая синхронизация), дождаться нуля в REG_UPDATE, записать настройки и установить REG_UPDATE. В ESP-IDF маски этих битов называются UART_HIGH_SPEED и UART_REG_UPDATE.

ЭкземплярБазовый адрес
UART00x6000 0000
UART10x6001 0000
UART20x6002 E000

Пример на C

UART1: 115 200 бод от APB_CLK и передача байта (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_CLR_BIT(UART_ID_REG(1), UART_HIGH_SPEED);            // UPDATE_CTRL = 0: синхронизация по REG_UPDATE
while (REG_GET_BIT(UART_ID_REG(1), UART_REG_UPDATE)) {}  // прошлая синхронизация закончена
REG_SET_FIELD(UART_CLK_CONF_REG(1), UART_SCLK_SEL, 1);   // такт ядра — APB_CLK 80 МГц
REG_SET_FIELD(UART_CLK_CONF_REG(1), UART_SCLK_DIV_NUM, 0); // без деления (ESP-IDF пишет делитель − 1)
REG_SET_FIELD(UART_CLKDIV_REG(1), UART_CLKDIV, 694);     // 80 МГц / 694,4375 = 115 200
REG_SET_FIELD(UART_CLKDIV_REG(1), UART_CLKDIV_FRAG, 7);
REG_SET_FIELD(UART_CONF0_REG(1), UART_BIT_NUM, 3);       // 8 бит данных
REG_CLR_BIT(UART_CONF0_REG(1), UART_PARITY_EN);          // без чётности
REG_SET_FIELD(UART_CONF0_REG(1), UART_STOP_BIT_NUM, 1);  // 1 стоп-бит
REG_SET_BIT(UART_ID_REG(1), UART_REG_UPDATE);            // передать настройки ядру UART

while (REG_GET_FIELD(UART_STATUS_REG(1), UART_TXFIFO_CNT) >= 128) {}  // FIFO полон
REG_WRITE(UART_FIFO_REG(1), 'A');

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

Регистр (ESP-IDF)СмещениеНазначениеПосле сброса
UART_FIFO_REG(i)0x0000Чтение байта из RX FIFO и запись в TX FIFO0x0000 0000
UART_INT_RAW_REG(i)0x0004Необработанные флаги прерываний0x0000 0002
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_RX_FILT_REG(i)0x0018Фильтр помех на входе RXD0x0000 0008
UART_STATUS_REG(i)0x001CЗаполнение FIFO и уровни линий0xE000 C000
UART_CONF0_REG(i)0x0020Формат кадра, инверсия линий, сброс FIFO, IrDA0x1000 001C
UART_CONF1_REG(i)0x0024Пороги FIFO и таймаут приёма0x0001 8060
UART_LOWPULSE_REG(i)0x0028Автоопределение скорости: самый короткий низкий импульс0x0000 0FFF
UART_HIGHPULSE_REG(i)0x002CАвтоопределение скорости: самый короткий высокий импульс0x0000 0FFF
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_CONF0_REG(i)0x003CСимвол XOFF и порог его отправки0x0000 4CE0
UART_SWFC_CONF1_REG(i)0x0040Символ XON и порог его отправки0x0000 4400
UART_TXBRK_CONF_REG(i)0x0044Длина сигнала break после передачи0x0000 000A
UART_IDLE_CONF_REG(i)0x0048Пауза между кадрами и порог конца кадра0x0004 0100
UART_RS485_CONF_REG(i)0x004CРежим RS-485 и задержки0x0000 0000
UART_AT_CMD_PRECNT_REG(i)0x0050Последовательность AT_CMD: пауза перед ней0x0000 0901
UART_AT_CMD_POSTCNT_REG(i)0x0054Последовательность AT_CMD: пауза после неё0x0000 0901
UART_AT_CMD_GAPTOUT_REG(i)0x0058Последовательность AT_CMD: наибольший промежуток между символами0x0000 000B
UART_AT_CMD_CHAR_REG(i)0x005CПоследовательность AT_CMD: символ и их число0x0000 032B
UART_MEM_CONF_REG(i)0x0060Размеры FIFO, порог управления потоком, таймаут, питание памяти0x0014 0012
UART_MEM_TX_STATUS_REG(i)0x0064Адреса записи и чтения TX FIFO0x0000 0000
UART_MEM_RX_STATUS_REG(i)0x0068Адреса записи и чтения RX FIFO0x0010 0200
UART_FSM_STATUS_REG(i)0x006CСостояния автоматов приёмника и передатчика0x0000 0000
UART_POSPULSE_REG(i)0x0070Автоопределение скорости: самый короткий период по фронтам0x0000 0FFF
UART_NEGPULSE_REG(i)0x0074Автоопределение скорости: самый короткий период по спадам0x0000 0FFF
UART_CLK_CONF_REG(i)0x0078Источник и делитель такта ядра UART, сбросы0x0370 1000
UART_DATE_REG(i)0x007CВерсия блока: дата ревизии аппаратуры0x0200 8270
UART_ID_REG(i)0x0080Синхронизация настроек с ядром UART и номер версии0x4000 0500

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

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

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

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

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

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

ПолеБитыДоступСбросНазначение
WAKEUP_INT_RAW19R/WTC/SS0В лёгком сне на RXD не меньше ACTIVE_THRESHOLD + 3 фронтов (в описании флага TRM — «больше»)
AT_CMD_CHAR_DET_INT_RAW18R/WTC/SS0Обнаружена последовательность символов AT_CMD_CHAR
RS485_CLASH_INT_RAW17R/WTC/SS0RS-485: коллизия передатчика и приёмника
RS485_FRM_ERR_INT_RAW16R/WTC/SS0RS-485: ошибка кадра в эхе собственной передачи
RS485_PARITY_ERR_INT_RAW15R/WTC/SS0RS-485: ошибка чётности в эхе собственной передачи
TX_DONE_INT_RAW14R/WTC/SS0Передатчик отправил все данные из FIFO
TX_BRK_IDLE_DONE_INT_RAW13R/WTC/SS0После последнего байта выдержана пауза TX_IDLE_NUM
TX_BRK_DONE_INT_RAW12R/WTC/SS0После передачи всех данных отправлены нули break
GLITCH_DET_INT_RAW11R/WTC/SS0Помеха посреди стартового бита
SW_XOFF_INT_RAW10R/WTC/SS0Принят символ XOFF при включённом программном управлении потоком
SW_XON_INT_RAW9R/WTC/SS0Принят символ XON при включённом программном управлении потоком
RXFIFO_TOUT_INT_RAW8R/WTC/SS0Приём байта длится дольше RX_TOUT_THRHD битовых интервалов
BRK_DET_INT_RAW7R/WTC/SS0После стоп-бита принят 0 — сигнал break
CTS_CHG_INT_RAW6R/WTC/SS0Изменился уровень на входе CTS
DSR_CHG_INT_RAW5R/WTC/SS0Изменился уровень на входе DSR
RXFIFO_OVF_INT_RAW4R/WTC/SS0Принято больше данных, чем вмещает RX FIFO
FRM_ERR_INT_RAW3R/WTC/SS0Ошибка кадра
PARITY_ERR_INT_RAW2R/WTC/SS0Принят байт с ошибкой чётности
TXFIFO_EMPTY_INT_RAW1R/WTC/SS1В TX FIFO меньше байтов, чем задано в TXFIFO_EMPTY_THRHD
RXFIFO_FULL_INT_RAW0R/WTC/SS0Принято больше байтов, чем задано в RXFIFO_FULL_THRHD

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

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

ПолеБитыДоступСбросНазначение
WAKEUP_INT_ST19RO0В лёгком сне на RXD не меньше ACTIVE_THRESHOLD + 3 фронтов (в описании флага TRM — «больше»)
AT_CMD_CHAR_DET_INT_ST18RO0Обнаружена последовательность символов AT_CMD_CHAR
RS485_CLASH_INT_ST17RO0RS-485: коллизия передатчика и приёмника
RS485_FRM_ERR_INT_ST16RO0RS-485: ошибка кадра в эхе собственной передачи
RS485_PARITY_ERR_INT_ST15RO0RS-485: ошибка чётности в эхе собственной передачи
TX_DONE_INT_ST14RO0Передатчик отправил все данные из FIFO
TX_BRK_IDLE_DONE_INT_ST13RO0После последнего байта выдержана пауза TX_IDLE_NUM
TX_BRK_DONE_INT_ST12RO0После передачи всех данных отправлены нули break
GLITCH_DET_INT_ST11RO0Помеха посреди стартового бита
SW_XOFF_INT_ST10RO0Принят символ XOFF при включённом программном управлении потоком
SW_XON_INT_ST9RO0Принят символ XON при включённом программном управлении потоком
RXFIFO_TOUT_INT_ST8RO0Приём байта длится дольше RX_TOUT_THRHD битовых интервалов
BRK_DET_INT_ST7RO0После стоп-бита принят 0 — сигнал break
CTS_CHG_INT_ST6RO0Изменился уровень на входе CTS
DSR_CHG_INT_ST5RO0Изменился уровень на входе DSR
RXFIFO_OVF_INT_ST4RO0Принято больше данных, чем вмещает RX FIFO
FRM_ERR_INT_ST3RO0Ошибка кадра
PARITY_ERR_INT_ST2RO0Принят байт с ошибкой чётности
TXFIFO_EMPTY_INT_ST1RO0В TX FIFO меньше байтов, чем задано в TXFIFO_EMPTY_THRHD
RXFIFO_FULL_INT_ST0RO0Принято больше байтов, чем задано в RXFIFO_FULL_THRHD

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

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

ПолеБитыДоступСбросНазначение
WAKEUP_INT_ENA19R/W0В лёгком сне на RXD не меньше ACTIVE_THRESHOLD + 3 фронтов (в описании флага TRM — «больше»)
AT_CMD_CHAR_DET_INT_ENA18R/W0Обнаружена последовательность символов AT_CMD_CHAR
RS485_CLASH_INT_ENA17R/W0RS-485: коллизия передатчика и приёмника
RS485_FRM_ERR_INT_ENA16R/W0RS-485: ошибка кадра в эхе собственной передачи
RS485_PARITY_ERR_INT_ENA15R/W0RS-485: ошибка чётности в эхе собственной передачи
TX_DONE_INT_ENA14R/W0Передатчик отправил все данные из FIFO
TX_BRK_IDLE_DONE_INT_ENA13R/W0После последнего байта выдержана пауза TX_IDLE_NUM
TX_BRK_DONE_INT_ENA12R/W0После передачи всех данных отправлены нули break
GLITCH_DET_INT_ENA11R/W0Помеха посреди стартового бита
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После стоп-бита принят 0 — сигнал break
CTS_CHG_INT_ENA6R/W0Изменился уровень на входе CTS
DSR_CHG_INT_ENA5R/W0Изменился уровень на входе DSR
RXFIFO_OVF_INT_ENA4R/W0Принято больше данных, чем вмещает RX FIFO
FRM_ERR_INT_ENA3R/W0Ошибка кадра
PARITY_ERR_INT_ENA2R/W0Принят байт с ошибкой чётности
TXFIFO_EMPTY_INT_ENA1R/W0В TX FIFO меньше байтов, чем задано в TXFIFO_EMPTY_THRHD
RXFIFO_FULL_INT_ENA0R/W0Принято больше байтов, чем задано в RXFIFO_FULL_THRHD

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

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

ПолеБитыДоступСбросНазначение
WAKEUP_INT_CLR19WT0В лёгком сне на RXD не меньше ACTIVE_THRESHOLD + 3 фронтов (в описании флага TRM — «больше»)
AT_CMD_CHAR_DET_INT_CLR18WT0Обнаружена последовательность символов AT_CMD_CHAR
RS485_CLASH_INT_CLR17WT0RS-485: коллизия передатчика и приёмника
RS485_FRM_ERR_INT_CLR16WT0RS-485: ошибка кадра в эхе собственной передачи
RS485_PARITY_ERR_INT_CLR15WT0RS-485: ошибка чётности в эхе собственной передачи
TX_DONE_INT_CLR14WT0Передатчик отправил все данные из FIFO
TX_BRK_IDLE_DONE_INT_CLR13WT0После последнего байта выдержана пауза TX_IDLE_NUM
TX_BRK_DONE_INT_CLR12WT0После передачи всех данных отправлены нули break
GLITCH_DET_INT_CLR11WT0Помеха посреди стартового бита
SW_XOFF_INT_CLR10WT0Принят символ XOFF при включённом программном управлении потоком
SW_XON_INT_CLR9WT0Принят символ XON при включённом программном управлении потоком
RXFIFO_TOUT_INT_CLR8WT0Приём байта длится дольше RX_TOUT_THRHD битовых интервалов
BRK_DET_INT_CLR7WT0После стоп-бита принят 0 — сигнал break
CTS_CHG_INT_CLR6WT0Изменился уровень на входе CTS
DSR_CHG_INT_CLR5WT0Изменился уровень на входе DSR
RXFIFO_OVF_INT_CLR4WT0Принято больше данных, чем вмещает RX FIFO
FRM_ERR_INT_CLR3WT0Ошибка кадра
PARITY_ERR_INT_CLR2WT0Принят байт с ошибкой чётности
TXFIFO_EMPTY_INT_CLR1WT0В TX FIFO меньше байтов, чем задано в TXFIFO_EMPTY_THRHD
RXFIFO_FULL_INT_CLR0WT0Принято больше байтов, чем задано в RXFIFO_FULL_THRHD

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

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

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

UART_RX_FILT_REG(i) — фильтр помех на входе RXD

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

1514131211109876543210
—GLITCH_FILT_ENGLITCH_FILT
ПолеБитыДоступСбросНазначение
GLITCH_FILT_EN8R/W01 — включить фильтр помех на RXD
GLITCH_FILT7:0R/W0x08Импульсы короче этого значения отбрасываются

UART_STATUS_REG(i) — заполнение FIFO и уровни линий

Смещение 0x001C, после сброса 0xE000 C000. TRM: регистр 26.19.

31302928272625242322212019181716
TXDRTSNDTRN—TXFIFO_CNT
1514131211109876543210
RXDCTSNDSRN—RXFIFO_CNT
ПолеБитыДоступСбросНазначение
TXD31RO1Текущий уровень внутреннего сигнала TXD
RTSN30RO1Текущий уровень внутреннего сигнала RTS
DTRN29RO1Текущий уровень внутреннего сигнала DTR
TXFIFO_CNT25:16RO0x000Число байтов в TX FIFO
RXD15RO1Текущий уровень внутреннего сигнала RXD
CTSN14RO1Текущий уровень внутреннего сигнала CTS
DSRN13RO0Текущий уровень внутреннего сигнала DSR
RXFIFO_CNT9:0RO0x000Число принятых байтов в RX FIFO

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

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

Формат кадра 8N1 — BIT_NUM = 3, PARITY_EN = 0, STOP_BIT_NUM = 1 — записан уже после сброса (0x1000 001C). Поля формата кадра, IrDA, петли и автоопределения скорости — синхронные: они вступают в силу после записи REG_UPDATE.

ПолеБитыДоступСбросНазначение
MEM_CLK_EN28R/W1Тактирование памяти FIFO
AUTOBAUD_EN27R/W01 — автоопределение скорости
ERR_WR_MASK26R/W0
CLK_EN25R/W0
DTR_INV24R/W01 — инвертировать выход DTR
RTS_INV23R/W01 — инвертировать выход RTS
TXD_INV22R/W01 — инвертировать выход TXD
DSR_INV21R/W01 — инвертировать вход DSR
CTS_INV20R/W01 — инвертировать вход CTS
RXD_INV19R/W01 — инвертировать вход RXD
TXFIFO_RST18R/W01 — сброс TX FIFO
RXFIFO_RST17R/W01 — сброс RX FIFO
IRDA_EN16R/W01 — протокол IrDA
TX_FLOW_EN15R/W01 — аппаратное управление потоком передатчика
LOOPBACK14R/W01 — петля для проверки: передатчик замкнут на приёмник внутри чипа
IRDA_RX_INV13R/W01 — инвертировать вход приёмника IrDA
IRDA_TX_INV12R/W01 — инвертировать выход передатчика IrDA
IRDA_WCTL11R/W011-й бит передатчика IrDA: 0 — всегда 0, 1 — равен 10-му
IRDA_TX_EN10R/W0Запуск передатчика IrDA
IRDA_DPLX9R/W01 — петля IrDA
TXD_BRK8R/W01 — после передачи данных отправить нули break (TX_BRK_NUM штук)
SW_DTR7R/W0Программный уровень DTR
SW_RTS6R/W0Программный уровень RTS при программном управлении потоком
STOP_BIT_NUM5:4R/W0x1Стоп-биты: 1 — один, 2 — полтора, 3 — два (значения UART_STOP_BITS_1, _1_5, _2 ESP-IDF)
BIT_NUM3:2R/W0x3Длина слова: 0 — 5 бит, 1 — 6, 2 — 7, 3 — 8 бит (значения UART_DATA_5_BITS…UART_DATA_8_BITS ESP-IDF)
PARITY_EN1R/W01 — добавлять и проверять бит чётности
PARITY0R/W0Тип чётности: 0 — чётный, 1 — нечётный (ESP-IDF пишет младший бит UART_PARITY_EVEN = 2 и UART_PARITY_ODD = 3)

UART_CONF1_REG(i) — пороги FIFO и таймаут приёма

Смещение 0x0024, после сброса 0x0001 8060. TRM: регистр 26.10.

31302928272625242322212019181716
—RX_TOUT_ENRX_FLOW_ENRX_TOUT_FLOW_DISDIS_RX_DAT_OVFTXFIFO_EMPTY_THRHD
1514131211109876543210
TXFIFO_EMPTY_THRHDRXFIFO_FULL_THRHD
ПолеБитыДоступСбросНазначение
RX_TOUT_EN23R/W01 — таймаут приёма (прерывание RXFIFO_TOUT)
RX_FLOW_EN22R/W01 — аппаратное управление потоком приёмника
RX_TOUT_FLOW_DIS21R/W01 — не считать паузу таймаута, пока работает аппаратное управление потоком
DIS_RX_DAT_OVF20R/W01 — не отслеживать переполнение RX FIFO
TXFIFO_EMPTY_THRHD19:10R/W0x060Порог прерывания TXFIFO_EMPTY: в TX FIFO меньше стольких байтов
RXFIFO_FULL_THRHD9:0R/W0x060Порог прерывания RXFIFO_FULL: принято больше стольких байтов (в разделе 26.4.2 TRM — «не меньше»)

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

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

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

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

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

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

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

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

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

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

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

1514131211109876543210
—SEND_XOFFSEND_XONFORCE_XOFFFORCE_XONXONOFF_DELSW_FLOW_CON_EN
ПолеБитыДоступСбросНазначение
SEND_XOFF5R/W/SS/SC01 — отправить XOFF; сбрасывается сам
SEND_XON4R/W/SS/SC01 — отправить XON; сбрасывается сам
FORCE_XOFF3R/W01 — остановить передатчик
FORCE_XON2R/W01 — заставить передатчик передавать
XONOFF_DEL1R/W01 — удалять символы XON и XOFF из принятых данных
SW_FLOW_CON_EN0R/W01 — программное управление потоком

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

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

ПолеБитыДоступСбросНазначение
ACTIVE_THRESHOLD9:0R/W0x0F0Пробуждение из лёгкого сна, когда фронтов на RXD не меньше ACTIVE_THRESHOLD + 3 (раздел 26.3 TRM; в описаниях полей TRM — «больше»)

UART_SWFC_CONF0_REG(i) — символ XOFF и порог его отправки

Смещение 0x003C, после сброса 0x0000 4CE0. TRM: регистр 26.13.

31302928272625242322212019181716
—XOFF_CHAR
1514131211109876543210
XOFF_CHARXOFF_THRESHOLD
ПолеБитыДоступСбросНазначение
XOFF_CHAR17:10R/W0x13Символ XOFF
XOFF_THRESHOLD9:0R/W0x0E0В RX FIFO больше стольких байтов — отправляется XOFF

UART_SWFC_CONF1_REG(i) — символ XON и порог его отправки

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

31302928272625242322212019181716
—XON_CHAR
1514131211109876543210
XON_CHARXON_THRESHOLD
ПолеБитыДоступСбросНазначение
XON_CHAR17:10R/W0x11Символ XON
XON_THRESHOLD9:0R/W0x000В RX FIFO меньше стольких байтов — отправляется XON

UART_TXBRK_CONF_REG(i) — длина сигнала break после передачи

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

ПолеБитыДоступСбросНазначение
TX_BRK_NUM7:0R/W0x0AЧисло нулевых символов break после передачи

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

Смещение 0x0048, после сброса 0x0004 0100. TRM: регистр 26.16.

31302928272625242322212019181716
—TX_IDLE_NUM
1514131211109876543210
TX_IDLE_NUMRX_IDLE_THRHD
ПолеБитыДоступСбросНазначение
TX_IDLE_NUM19:10R/W0x100Наименьшая пауза между передачами в битовых интервалах
RX_IDLE_THRHD9:0R/W0x100Пауза приёма дольше стольких битовых интервалов — конец кадра

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

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

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/W01 — передатчик передаёт, когда линия приёмника занята
RS485TX_RX_EN3R/W01 — приёмник принимает данные во время передачи
DL1_EN2R/W01 — пауза в 1 бит после стоп-бита
DL0_EN1R/W01 — пауза в 1 бит перед стартовым битом
RS485_EN0R/W01 — режим RS-485

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

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

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

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

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

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

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

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

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

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

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

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

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

Смещение 0x0060, после сброса 0x0014 0012. TRM: регистр 26.2.

31302928272625242322212019181716
—MEM_FORCE_PUMEM_FORCE_PDRX_TOUT_THRHDRX_FLOW_THRHD
1514131211109876543210
RX_FLOW_THRHDTX_SIZERX_SIZE—
ПолеБитыДоступСбросНазначение
MEM_FORCE_PU28R/W01 — держать память UART включённой
MEM_FORCE_PD27R/W01 — выключить память UART
RX_TOUT_THRHD26:17R/W0x00AПорог таймаута приёма в битовых интервалах
RX_FLOW_THRHD16:7R/W0x000Сколько байтов можно принять при аппаратном управлении потоком
TX_SIZE6:4R/W0x1Размер TX FIFO в блоках по 128 байт
RX_SIZE3:1R/W0x1Размер RX FIFO в блоках по 128 байт

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

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

31302928272625242322212019181716
—TX_RADDR
1514131211109876543210
TX_RADDR—APB_TX_WADDR
ПолеБитыДоступСброс
TX_RADDR20:11RO0x000
APB_TX_WADDR9:0RO0x000

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

Смещение 0x0068, после сброса 0x0010 0200. TRM: регистр 26.21.

31302928272625242322212019181716
—RX_WADDR
1514131211109876543210
RX_WADDR—APB_RX_RADDR
ПолеБитыДоступСброс
RX_WADDR20:11RO0x200
APB_RX_RADDR9:0RO0x200

UART_FSM_STATUS_REG(i) — состояния автоматов приёмника и передатчика

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

1514131211109876543210
—ST_UTX_OUTST_URX_OUT
ПолеБитыДоступСброс
ST_UTX_OUT7:4RO0x0
ST_URX_OUT3:0RO0x0

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

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

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

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

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

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

UART_CLK_CONF_REG(i) — источник и делитель такта ядра UART, сбросы

Смещение 0x0078, после сброса 0x0370 1000. TRM: регистр 26.18.

После сброса SCLK_SEL = 3 (XTAL_CLK) и SCLK_DIV_NUM = 1. Формула делителя в TRM и драйвер ESP-IDF расходятся на единицу: TRM — SCLK_DIV_NUM + SCLK_DIV_B / SCLK_DIV_A, uart_ll.h — SCLK_DIV_NUM + 1. Описания полей SCLK_DIV_A и SCLK_DIV_B в TRM (A — числитель, B — знаменатель) тоже противоречат формуле раздела 26.4.1; ESP-IDF их не использует.

31302928272625242322212019181716
—RX_RST_CORETX_RST_CORERX_SCLK_ENTX_SCLK_ENRST_CORESCLK_ENSCLK_SELSCLK_DIV_NUM
1514131211109876543210
SCLK_DIV_NUMSCLK_DIV_ASCLK_DIV_B
ПолеБитыДоступСбросНазначение
RX_RST_CORE27R/W0Сброс приёмника: записать 1, затем 0
TX_RST_CORE26R/W0Сброс передатчика: записать 1, затем 0
RX_SCLK_EN25R/W11 — такт приёмника
TX_SCLK_EN24R/W11 — такт передатчика
RST_CORE23R/W0Сброс приёмника и передатчика: записать 1, затем 0
SCLK_EN22R/W11 — такт приёмника и передатчика
SCLK_SEL21:20R/W0x3Такт ядра UART: 1 — APB_CLK, 2 — RC_FAST_CLK, 3 — XTAL_CLK
SCLK_DIV_NUM19:12R/W0x01Целая часть делителя такта ядра; ESP-IDF записывает сюда делитель минус 1
SCLK_DIV_A11:6R/W0x00Дробная часть делителя такта ядра (см. текст о формуле TRM)
SCLK_DIV_B5:0R/W0x00Дробная часть делителя такта ядра (см. текст о формуле TRM)

UART_DATE_REG(i) — версия блока: дата ревизии аппаратуры

Смещение 0x007C, после сброса 0x0200 8270. TRM: регистр 26.32.

ПолеБитыДоступСброс
DATE31:0R/W0x0200 8270

UART_ID_REG(i) — синхронизация настроек с ядром UART и номер версии

Смещение 0x0080, после сброса 0x4000 0500. TRM: регистр 26.33.

31302928272625242322212019181716
REG_UPDATEUPDATE_CTRLID
1514131211109876543210
ID
ПолеБитыДоступСбросНазначение
REG_UPDATE31R/W/SC0Запись 1 передаёт синхронные регистры в домен ядра UART; бит сбрасывается сам по окончании (UART_REG_UPDATE в ESP-IDF)
UPDATE_CTRL30R/W1Режим синхронизации: 1 (после сброса) — автоматический, 0 — по записи REG_UPDATE; по TRM перед настройкой бит сбрасывают (UART_HIGH_SPEED в ESP-IDF)
ID29:0R/W0x0000 0500Номер версии блока

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

Как рассчитать CLKDIV для нужной скорости UART ESP32-S3?

Разделить частоту такта ядра UART на скорость: 80 000 000 / 115 200 = 694,44. Целая часть 694 идёт в CLKDIV, дробная 0,44 · 16 ≈ 7 — в CLKDIV_FRAG: делитель 694 + 7/16 = 694,4375, это пример из раздела 26.4.3.1 TRM. Целая часть CLKDIV — 12 бит, до 4095.

Почему запись в CLKDIV UART ESP32-S3 не меняет скорость?

CLKDIV — синхронный регистр. По TRM для его применения нужно сбросить бит UPDATE_CTRL в UART_ID_REG (UART_HIGH_SPEED в ESP-IDF), дождаться нуля в REG_UPDATE, записать делитель и установить REG_UPDATE — бит сбросится сам, когда значения переданы ядру UART. Кроме того, должно быть включено тактирование контроллера: у UART1 — бит SYSTEM_UART1_CLK_EN регистра SYSTEM_PERIP_CLK_EN0_REG, у UART2 — SYSTEM_UART2_CLK_EN в SYSTEM_PERIP_CLK_EN1_REG.

Источники

  1. Espressif. ESP32-S3 Technical Reference Manual, версия 1.8 — глава 26: таблица 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

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