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

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

Регистры UART ESP32-C3: скорость обмена и источник тактов, длина слова, чётность и стоп-биты, FIFO на 128 байт, аппаратное и программное управление потоком, режим RS-485 и флаги прерываний — для обоих контроллеров UART0 и UART1.

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

Скорость задаёт делитель: 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 МГц, это значение после сброса) и делит SCLK_DIV_NUM + 1. Например, 80 МГц / (694 + 7/16) = 115 200 бод. Максимум — 5 Мбод.

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

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

Пример на 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_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);
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_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Формат кадра, инверсия линий, сброс FIFO0x1000 001C
UART_CONF1_REG(i)0x0024Пороги FIFO и таймаут приёма0x0000 C060
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 26E0
UART_SWFC_CONF1_REG(i)0x0040Символ XON и порог его отправки0x0000 2200
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)0x0050Escape-последовательность: пауза перед ней0x0000 0901
UART_AT_CMD_POSTCNT_REG(i)0x0054Escape-последовательность: пауза после неё0x0000 0901
UART_AT_CMD_GAPTOUT_REG(i)0x0058Escape-последовательность: наибольший промежуток между символами0x0000 000B
UART_AT_CMD_CHAR_REG(i)0x005CEscape-последовательность: символ и их число0x0000 032B
UART_MEM_CONF_REG(i)0x0060Размеры FIFO, порог аппаратного управления потоком, питание памяти0x000A 0012
UART_MEM_TX_STATUS_REG(i)0x0064Адреса записи и чтения TX FIFO0x0000 0000
UART_MEM_RX_STATUS_REG(i)0x0068Адреса записи и чтения RX FIFO0x0008 0100
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 в лёгком сне достигло порога пробуждения
AT_CMD_CHAR_DET_INT_RAW18R/WTC/SS0Обнаружена escape-последовательность AT_CMD_CHAR
RS485_CLASH_INT_RAW17R/WTC/SS0Режим RS-485: коллизия передатчика и приёмника
RS485_FRM_ERR_INT_RAW16R/WTC/SS0Режим RS-485: ошибка кадра при эхо-контроле
RS485_PARITY_ERR_INT_RAW15R/WTC/SS0Режим RS-485: ошибка чётности при эхо-контроле
TX_DONE_INT_RAW14R/WTC/SS0Передатчик отправил все данные из FIFO
TX_BRK_IDLE_DONE_INT_RAW13R/WTC/SS0Выдержана пауза после передачи break
TX_BRK_DONE_INT_RAW12R/WTC/SS0Передача break после данных закончена
GLITCH_DET_INT_RAW11R/WTC/SS0На входе RXD замечена помеха посреди стартового бита
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Принят сигнал break: линия RXD долго в нуле
CTS_CHG_INT_RAW6R/WTC/SS0Изменился уровень на входе CTS
DSR_CHG_INT_RAW5R/WTC/SS0Изменился уровень на входе DSR
RXFIFO_OVF_INT_RAW4R/WTC/SS0RX FIFO переполнен, принятый байт потерян
FRM_ERR_INT_RAW3R/WTC/SS0Ошибка кадра: на месте стоп-бита принят 0
PARITY_ERR_INT_RAW2R/WTC/SS0Принят байт с ошибкой чётности
TXFIFO_EMPTY_INT_RAW1R/WTC/SS1В TX FIFO меньше байтов, чем задано в TXFIFO_EMPTY_THRHD
RXFIFO_FULL_INT_RAW0R/WTC/SS0В RX FIFO больше байтов, чем задано в RXFIFO_FULL_THRHD

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

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

ПолеБитыДоступСбросНазначение
WAKEUP_INT_ST19RO0Число фронтов на RXD в лёгком сне достигло порога пробуждения
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: регистр 26.5.

ПолеБитыДоступСбросНазначение
WAKEUP_INT_ENA19R/W0Число фронтов на RXD в лёгком сне достигло порога пробуждения
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: регистр 26.6.

ПолеБитыДоступСбросНазначение
WAKEUP_INT_CLR19WT0Число фронтов на RXD в лёгком сне достигло порога пробуждения
AT_CMD_CHAR_DET_INT_CLR18WT0Обнаружена escape-последовательность AT_CMD_CHAR
RS485_CLASH_INT_CLR17WT0Режим RS-485: коллизия передатчика и приёмника
RS485_FRM_ERR_INT_CLR16WT0Режим RS-485: ошибка кадра при эхо-контроле
RS485_PARITY_ERR_INT_CLR15WT0Режим RS-485: ошибка чётности при эхо-контроле
TX_DONE_INT_CLR14WT0Передатчик отправил все данные из FIFO
TX_BRK_IDLE_DONE_INT_CLR13WT0Выдержана пауза после передачи break
TX_BRK_DONE_INT_CLR12WT0Передача break после данных закончена
GLITCH_DET_INT_CLR11WT0На входе RXD замечена помеха посреди стартового бита
SW_XOFF_INT_CLR10WT0Принят символ XOFF программного управления потоком
SW_XON_INT_CLR9WT0Принят символ XON программного управления потоком
RXFIFO_TOUT_INT_CLR8WT0Таймаут приёма: линия молчит дольше RX_TOUT_THRHD битовых интервалов
BRK_DET_INT_CLR7WT0Принят сигнал break: линия RXD долго в нуле
CTS_CHG_INT_CLR6WT0Изменился уровень на входе CTS
DSR_CHG_INT_CLR5WT0Изменился уровень на входе DSR
RXFIFO_OVF_INT_CLR4WT0RX FIFO переполнен, принятый байт потерян
FRM_ERR_INT_CLR3WT0Ошибка кадра: на месте стоп-бита принят 0
PARITY_ERR_INT_CLR2WT0Принят байт с ошибкой чётности
TXFIFO_EMPTY_INT_CLR1WT0В TX FIFO меньше байтов, чем задано в TXFIFO_EMPTY_THRHD
RXFIFO_FULL_INT_CLR0WT0В RX FIFO больше байтов, чем задано в 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/W0Включить фильтр помех на 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

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

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

ПолеБитыДоступСбросНазначение
MEM_CLK_EN28R/W1Тактирование памяти FIFO
AUTOBAUD_EN27R/W0Включить автоопределение скорости
ERR_WR_MASK26R/W0Не класть в RX FIFO байты с ошибками
CLK_EN25R/W0
DTR_INV24R/W0
RTS_INV23R/W0Инвертировать выход RTS
TXD_INV22R/W0Инвертировать выход TXD
DSR_INV21R/W0
CTS_INV20R/W0Инвертировать вход CTS
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Программный уровень DTR
SW_RTS6R/W0Программный уровень RTS при программном управлении потоком
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 C060. 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_EN21R/W0Включить таймаут приёма (прерывание RXFIFO_TOUT)
RX_FLOW_EN20R/W0Аппаратное управление потоком приёмника по RTS
RX_TOUT_FLOW_DIS19R/W0Не считать паузу таймаута, пока работает управление потоком
DIS_RX_DAT_OVF18R/W0Не отслеживать переполнение RX FIFO
TXFIFO_EMPTY_THRHD17:9R/W0x060Порог прерывания TXFIFO_EMPTY: меньше стольких байтов в TX FIFO
RXFIFO_FULL_THRHD8:0R/W0x060Порог прерывания RXFIFO_FULL: больше стольких байтов в RX FIFO

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/SC0
SEND_XON4R/W/SS/SC0
FORCE_XOFF3R/W0
FORCE_XON2R/W0
XONOFF_DEL1R/W0
SW_FLOW_CON_EN0R/W0

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

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

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

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

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

31302928272625242322212019181716
—XOFF_CHAR
1514131211109876543210
XOFF_CHARXOFF_THRESHOLD
ПолеБитыДоступСброс
XOFF_CHAR16:9R/W0x13
XOFF_THRESHOLD8:0R/W0x0E0

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

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

31302928272625242322212019181716
—XON_CHAR
1514131211109876543210
XON_CHARXON_THRESHOLD
ПолеБитыДоступСброс
XON_CHAR16:9R/W0x11
XON_THRESHOLD8:0R/W0x000

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

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

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

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/W0
RS485TX_RX_EN3R/W0
DL1_EN2R/W0
DL0_EN1R/W0
RS485_EN0R/W0

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

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

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

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

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

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

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

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

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

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

Смещение 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, после сброса 0x000A 0012. TRM: регистр 26.2.

31302928272625242322212019181716
—MEM_FORCE_PUMEM_FORCE_PDRX_TOUT_THRHD
1514131211109876543210
RX_FLOW_THRHDTX_SIZERX_SIZE—
ПолеБитыДоступСбросНазначение
MEM_FORCE_PU27R/W0
MEM_FORCE_PD26R/W0
RX_TOUT_THRHD25:16R/W0x00AТаймаут приёма в битовых интервалах
RX_FLOW_THRHD15:7R/W0x000Порог RX FIFO, при котором снимается RTS
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, после сброса 0x0008 0100. TRM: регистр 26.21.

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

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.

31302928272625242322212019181716
—RX_SCLK_ENTX_SCLK_ENRST_CORESCLK_ENSCLK_SELSCLK_DIV_NUM
1514131211109876543210
SCLK_DIV_NUMSCLK_DIV_ASCLK_DIV_B
ПолеБитыДоступСбросНазначение
RX_SCLK_EN25R/W1Включить такт приёмника
TX_SCLK_EN24R/W1Включить такт передатчика
RST_CORE23R/W0Сброс ядра UART: записать 1, затем 0
SCLK_EN22R/W1Включить такт приёмника и передатчика
SCLK_SEL21:20R/W0x3Такт ядра UART: 1 — APB_CLK, 2 — RC_FAST_CLK, 3 — XTAL_CLK
SCLK_DIV_NUM19:12R/W0x01Целая часть делителя такта ядра минус 1
SCLK_DIV_A11:6R/W0x00Знаменатель дробной части делителя такта ядра
SCLK_DIV_B5:0R/W0x00Числитель дробной части делителя такта ядра

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_UPDATE в ESP-IDF)
UPDATE_CTRL30R/W1Режим синхронизации: 1 (после сброса) — автоматический, годится, только когда такт ядра равен APB_CLK; по TRM перед записью REG_UPDATE бит сбрасывают в 0 (UART_HIGH_SPEED в ESP-IDF)
ID29:0R/W0x0000 0500Номер версии блока

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

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

Разделить частоту ядра UART на скорость: 80 000 000 / 115 200 = 694,44. Целая часть 694 идёт в CLKDIV, дробная 0,44 · 16 ≈ 7 — в CLKDIV_FRAG. Частота ядра — источник из SCLK_SEL, делённый на SCLK_DIV_NUM + 1; ESP-IDF по умолчанию берёт APB_CLK 80 МГц без деления.

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

Ядро UART работает в своём тактовом домене, и часть регистров попадает в него только после синхронизации. По TRM бит UPDATE_CTRL регистра UART_ID_REG (UART_HIGH_SPEED в ESP-IDF, после сброса 1) нужно сбросить, а после записи настроек установить REG_UPDATE (UART_UPDATE) — бит сбрасывается сам, когда значения переданы. Кроме того, у UART1 должно быть включено тактирование в SYSTEM_PERIP_CLK_EN0_REG.

Источники

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

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