Регистры UART ESP32-C3
Регистры UART ESP32-C3: скорость обмена и источник тактов, длина слова, чётность и стоп-биты, FIFO на 128 байт, аппаратное и программное управление потоком, режим RS-485 и флаги прерываний — для обоих контроллеров UART0 и UART1.
Содержание
- Пример на C
- Регистры блока
- UART_FIFO_REG
- UART_INT_RAW_REG
- UART_INT_ST_REG
- UART_INT_ENA_REG
- UART_INT_CLR_REG
- UART_CLKDIV_REG
- UART_RX_FILT_REG
- UART_STATUS_REG
- UART_CONF0_REG
- UART_CONF1_REG
- UART_LOWPULSE_REG
- UART_HIGHPULSE_REG
- UART_RXD_CNT_REG
- UART_FLOW_CONF_REG
- UART_SLEEP_CONF_REG
- UART_SWFC_CONF0_REG
- UART_SWFC_CONF1_REG
- UART_TXBRK_CONF_REG
- UART_IDLE_CONF_REG
- UART_RS485_CONF_REG
- UART_AT_CMD_PRECNT_REG
- UART_AT_CMD_POSTCNT_REG
- UART_AT_CMD_GAPTOUT_REG
- UART_AT_CMD_CHAR_REG
- UART_MEM_CONF_REG
- UART_MEM_TX_STATUS_REG
- UART_MEM_RX_STATUS_REG
- UART_FSM_STATUS_REG
- UART_POSPULSE_REG
- UART_NEGPULSE_REG
- UART_CLK_CONF_REG
- UART_DATE_REG
- UART_ID_REG
У 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).
| Экземпляр | Базовый адрес |
|---|---|
| UART0 | 0x6000 0000 |
| UART1 | 0x6001 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 FIFO | 0x0000 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 | Сброс флагов прерываний записью 1 | 0x0000 0000 |
| UART_CLKDIV_REG(i) | 0x0014 | Делитель скорости обмена | 0x0000 02B6 |
| UART_RX_FILT_REG(i) | 0x0018 | Фильтр помех на входе RXD | 0x0000 0008 |
| UART_STATUS_REG(i) | 0x001C | Заполнение FIFO и уровни линий | 0xE000 C000 |
| UART_CONF0_REG(i) | 0x0020 | Формат кадра, инверсия линий, сброс FIFO | 0x1000 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 | Автоопределение скорости: число перепадов на RXD | 0x0000 0000 |
| UART_FLOW_CONF_REG(i) | 0x0034 | Программное управление потоком XON/XOFF | 0x0000 0000 |
| UART_SLEEP_CONF_REG(i) | 0x0038 | Порог пробуждения из лёгкого сна по RXD | 0x0000 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) | 0x0050 | Escape-последовательность: пауза перед ней | 0x0000 0901 |
| UART_AT_CMD_POSTCNT_REG(i) | 0x0054 | Escape-последовательность: пауза после неё | 0x0000 0901 |
| UART_AT_CMD_GAPTOUT_REG(i) | 0x0058 | Escape-последовательность: наибольший промежуток между символами | 0x0000 000B |
| UART_AT_CMD_CHAR_REG(i) | 0x005C | Escape-последовательность: символ и их число | 0x0000 032B |
| UART_MEM_CONF_REG(i) | 0x0060 | Размеры FIFO, порог аппаратного управления потоком, питание памяти | 0x000A 0012 |
| UART_MEM_TX_STATUS_REG(i) | 0x0064 | Адреса записи и чтения TX FIFO | 0x0000 0000 |
| UART_MEM_RX_STATUS_REG(i) | 0x0068 | Адреса записи и чтения RX FIFO | 0x0008 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_BYTE | 7:0 | RO | 0x00 | Чтение забирает байт из RX FIFO; запись кладёт байт в TX FIFO |
UART_INT_RAW_REG(i) — необработанные флаги прерываний
Смещение 0x0004, после сброса 0x0000 0002. TRM: регистр 26.3.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| WAKEUP_INT_RAW | 19 | R/WTC/SS | 0 | Число фронтов на RXD в лёгком сне достигло порога пробуждения |
| AT_CMD_CHAR_DET_INT_RAW | 18 | R/WTC/SS | 0 | Обнаружена escape-последовательность AT_CMD_CHAR |
| RS485_CLASH_INT_RAW | 17 | R/WTC/SS | 0 | Режим RS-485: коллизия передатчика и приёмника |
| RS485_FRM_ERR_INT_RAW | 16 | R/WTC/SS | 0 | Режим RS-485: ошибка кадра при эхо-контроле |
| RS485_PARITY_ERR_INT_RAW | 15 | R/WTC/SS | 0 | Режим RS-485: ошибка чётности при эхо-контроле |
| TX_DONE_INT_RAW | 14 | R/WTC/SS | 0 | Передатчик отправил все данные из FIFO |
| TX_BRK_IDLE_DONE_INT_RAW | 13 | R/WTC/SS | 0 | Выдержана пауза после передачи break |
| TX_BRK_DONE_INT_RAW | 12 | R/WTC/SS | 0 | Передача break после данных закончена |
| GLITCH_DET_INT_RAW | 11 | R/WTC/SS | 0 | На входе RXD замечена помеха посреди стартового бита |
| SW_XOFF_INT_RAW | 10 | R/WTC/SS | 0 | Принят символ XOFF программного управления потоком |
| SW_XON_INT_RAW | 9 | R/WTC/SS | 0 | Принят символ XON программного управления потоком |
| RXFIFO_TOUT_INT_RAW | 8 | R/WTC/SS | 0 | Таймаут приёма: линия молчит дольше RX_TOUT_THRHD битовых интервалов |
| BRK_DET_INT_RAW | 7 | R/WTC/SS | 0 | Принят сигнал break: линия RXD долго в нуле |
| CTS_CHG_INT_RAW | 6 | R/WTC/SS | 0 | Изменился уровень на входе CTS |
| DSR_CHG_INT_RAW | 5 | R/WTC/SS | 0 | Изменился уровень на входе DSR |
| RXFIFO_OVF_INT_RAW | 4 | R/WTC/SS | 0 | RX FIFO переполнен, принятый байт потерян |
| FRM_ERR_INT_RAW | 3 | R/WTC/SS | 0 | Ошибка кадра: на месте стоп-бита принят 0 |
| PARITY_ERR_INT_RAW | 2 | R/WTC/SS | 0 | Принят байт с ошибкой чётности |
| TXFIFO_EMPTY_INT_RAW | 1 | R/WTC/SS | 1 | В TX FIFO меньше байтов, чем задано в TXFIFO_EMPTY_THRHD |
| RXFIFO_FULL_INT_RAW | 0 | R/WTC/SS | 0 | В RX FIFO больше байтов, чем задано в RXFIFO_FULL_THRHD |
UART_INT_ST_REG(i) — флаги прерываний после маски разрешения
Смещение 0x0008, после сброса 0x0000 0000. TRM: регистр 26.4.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| WAKEUP_INT_ST | 19 | RO | 0 | Число фронтов на RXD в лёгком сне достигло порога пробуждения |
| AT_CMD_CHAR_DET_INT_ST | 18 | RO | 0 | Обнаружена escape-последовательность AT_CMD_CHAR |
| RS485_CLASH_INT_ST | 17 | RO | 0 | Режим RS-485: коллизия передатчика и приёмника |
| RS485_FRM_ERR_INT_ST | 16 | RO | 0 | Режим RS-485: ошибка кадра при эхо-контроле |
| RS485_PARITY_ERR_INT_ST | 15 | RO | 0 | Режим RS-485: ошибка чётности при эхо-контроле |
| TX_DONE_INT_ST | 14 | RO | 0 | Передатчик отправил все данные из FIFO |
| TX_BRK_IDLE_DONE_INT_ST | 13 | RO | 0 | Выдержана пауза после передачи break |
| TX_BRK_DONE_INT_ST | 12 | RO | 0 | Передача break после данных закончена |
| GLITCH_DET_INT_ST | 11 | RO | 0 | На входе RXD замечена помеха посреди стартового бита |
| SW_XOFF_INT_ST | 10 | RO | 0 | Принят символ XOFF программного управления потоком |
| SW_XON_INT_ST | 9 | RO | 0 | Принят символ XON программного управления потоком |
| RXFIFO_TOUT_INT_ST | 8 | RO | 0 | Таймаут приёма: линия молчит дольше RX_TOUT_THRHD битовых интервалов |
| BRK_DET_INT_ST | 7 | RO | 0 | Принят сигнал break: линия RXD долго в нуле |
| CTS_CHG_INT_ST | 6 | RO | 0 | Изменился уровень на входе CTS |
| DSR_CHG_INT_ST | 5 | RO | 0 | Изменился уровень на входе DSR |
| RXFIFO_OVF_INT_ST | 4 | RO | 0 | RX FIFO переполнен, принятый байт потерян |
| FRM_ERR_INT_ST | 3 | RO | 0 | Ошибка кадра: на месте стоп-бита принят 0 |
| PARITY_ERR_INT_ST | 2 | RO | 0 | Принят байт с ошибкой чётности |
| TXFIFO_EMPTY_INT_ST | 1 | RO | 0 | В TX FIFO меньше байтов, чем задано в TXFIFO_EMPTY_THRHD |
| RXFIFO_FULL_INT_ST | 0 | RO | 0 | В RX FIFO больше байтов, чем задано в RXFIFO_FULL_THRHD |
UART_INT_ENA_REG(i) — разрешение прерываний
Смещение 0x000C, после сброса 0x0000 0000. TRM: регистр 26.5.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| WAKEUP_INT_ENA | 19 | R/W | 0 | Число фронтов на RXD в лёгком сне достигло порога пробуждения |
| AT_CMD_CHAR_DET_INT_ENA | 18 | R/W | 0 | Обнаружена escape-последовательность AT_CMD_CHAR |
| RS485_CLASH_INT_ENA | 17 | R/W | 0 | Режим RS-485: коллизия передатчика и приёмника |
| RS485_FRM_ERR_INT_ENA | 16 | R/W | 0 | Режим RS-485: ошибка кадра при эхо-контроле |
| RS485_PARITY_ERR_INT_ENA | 15 | R/W | 0 | Режим RS-485: ошибка чётности при эхо-контроле |
| TX_DONE_INT_ENA | 14 | R/W | 0 | Передатчик отправил все данные из FIFO |
| TX_BRK_IDLE_DONE_INT_ENA | 13 | R/W | 0 | Выдержана пауза после передачи break |
| TX_BRK_DONE_INT_ENA | 12 | R/W | 0 | Передача break после данных закончена |
| GLITCH_DET_INT_ENA | 11 | R/W | 0 | На входе RXD замечена помеха посреди стартового бита |
| SW_XOFF_INT_ENA | 10 | R/W | 0 | Принят символ XOFF программного управления потоком |
| SW_XON_INT_ENA | 9 | R/W | 0 | Принят символ XON программного управления потоком |
| RXFIFO_TOUT_INT_ENA | 8 | R/W | 0 | Таймаут приёма: линия молчит дольше RX_TOUT_THRHD битовых интервалов |
| BRK_DET_INT_ENA | 7 | R/W | 0 | Принят сигнал break: линия RXD долго в нуле |
| CTS_CHG_INT_ENA | 6 | R/W | 0 | Изменился уровень на входе CTS |
| DSR_CHG_INT_ENA | 5 | R/W | 0 | Изменился уровень на входе DSR |
| RXFIFO_OVF_INT_ENA | 4 | R/W | 0 | RX FIFO переполнен, принятый байт потерян |
| FRM_ERR_INT_ENA | 3 | R/W | 0 | Ошибка кадра: на месте стоп-бита принят 0 |
| PARITY_ERR_INT_ENA | 2 | R/W | 0 | Принят байт с ошибкой чётности |
| TXFIFO_EMPTY_INT_ENA | 1 | R/W | 0 | В TX FIFO меньше байтов, чем задано в TXFIFO_EMPTY_THRHD |
| RXFIFO_FULL_INT_ENA | 0 | R/W | 0 | В RX FIFO больше байтов, чем задано в RXFIFO_FULL_THRHD |
UART_INT_CLR_REG(i) — сброс флагов прерываний записью 1
Смещение 0x0010, после сброса 0x0000 0000. TRM: регистр 26.6.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| WAKEUP_INT_CLR | 19 | WT | 0 | Число фронтов на RXD в лёгком сне достигло порога пробуждения |
| AT_CMD_CHAR_DET_INT_CLR | 18 | WT | 0 | Обнаружена escape-последовательность AT_CMD_CHAR |
| RS485_CLASH_INT_CLR | 17 | WT | 0 | Режим RS-485: коллизия передатчика и приёмника |
| RS485_FRM_ERR_INT_CLR | 16 | WT | 0 | Режим RS-485: ошибка кадра при эхо-контроле |
| RS485_PARITY_ERR_INT_CLR | 15 | WT | 0 | Режим RS-485: ошибка чётности при эхо-контроле |
| TX_DONE_INT_CLR | 14 | WT | 0 | Передатчик отправил все данные из FIFO |
| TX_BRK_IDLE_DONE_INT_CLR | 13 | WT | 0 | Выдержана пауза после передачи break |
| TX_BRK_DONE_INT_CLR | 12 | WT | 0 | Передача break после данных закончена |
| GLITCH_DET_INT_CLR | 11 | WT | 0 | На входе RXD замечена помеха посреди стартового бита |
| SW_XOFF_INT_CLR | 10 | WT | 0 | Принят символ XOFF программного управления потоком |
| SW_XON_INT_CLR | 9 | WT | 0 | Принят символ XON программного управления потоком |
| RXFIFO_TOUT_INT_CLR | 8 | WT | 0 | Таймаут приёма: линия молчит дольше RX_TOUT_THRHD битовых интервалов |
| BRK_DET_INT_CLR | 7 | WT | 0 | Принят сигнал break: линия RXD долго в нуле |
| CTS_CHG_INT_CLR | 6 | WT | 0 | Изменился уровень на входе CTS |
| DSR_CHG_INT_CLR | 5 | WT | 0 | Изменился уровень на входе DSR |
| RXFIFO_OVF_INT_CLR | 4 | WT | 0 | RX FIFO переполнен, принятый байт потерян |
| FRM_ERR_INT_CLR | 3 | WT | 0 | Ошибка кадра: на месте стоп-бита принят 0 |
| PARITY_ERR_INT_CLR | 2 | WT | 0 | Принят байт с ошибкой чётности |
| TXFIFO_EMPTY_INT_CLR | 1 | WT | 0 | В TX FIFO меньше байтов, чем задано в TXFIFO_EMPTY_THRHD |
| RXFIFO_FULL_INT_CLR | 0 | WT | 0 | В RX FIFO больше байтов, чем задано в RXFIFO_FULL_THRHD |
UART_CLKDIV_REG(i) — делитель скорости обмена
Смещение 0x0014, после сброса 0x0000 02B6. TRM: регистр 26.7.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | CLKDIV_FRAG | — | |||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CLKDIV | ||||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CLKDIV_FRAG | 23:20 | R/W | 0x0 | Дробная часть делителя скорости в шестнадцатых |
| CLKDIV | 11:0 | R/W | 0x2B6 | Целая часть делителя скорости |
UART_RX_FILT_REG(i) — фильтр помех на входе RXD
Смещение 0x0018, после сброса 0x0000 0008. TRM: регистр 26.8.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | GLITCH_FILT_EN | GLITCH_FILT | |||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| GLITCH_FILT_EN | 8 | R/W | 0 | Включить фильтр помех на RXD |
| GLITCH_FILT | 7:0 | R/W | 0x08 | Импульсы короче этого числа тактов отбрасываются |
UART_STATUS_REG(i) — заполнение FIFO и уровни линий
Смещение 0x001C, после сброса 0xE000 C000. TRM: регистр 26.19.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| TXD | RTSN | DTRN | — | TXFIFO_CNT | |||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| RXD | CTSN | DSRN | — | RXFIFO_CNT | |||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| TXD | 31 | RO | 1 | Текущий уровень на линии TXD |
| RTSN | 30 | RO | 1 | Текущий уровень выхода RTS |
| DTRN | 29 | RO | 1 | Текущий уровень выхода DTR |
| TXFIFO_CNT | 25:16 | RO | 0x000 | Число байтов в TX FIFO |
| RXD | 15 | RO | 1 | Текущий уровень на линии RXD |
| CTSN | 14 | RO | 1 | Текущий уровень входа CTS |
| DSRN | 13 | RO | 0 | Текущий уровень входа DSR |
| RXFIFO_CNT | 9:0 | RO | 0x000 | Число принятых байтов в 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_EN | 28 | R/W | 1 | Тактирование памяти FIFO |
| AUTOBAUD_EN | 27 | R/W | 0 | Включить автоопределение скорости |
| ERR_WR_MASK | 26 | R/W | 0 | Не класть в RX FIFO байты с ошибками |
| CLK_EN | 25 | R/W | 0 | |
| DTR_INV | 24 | R/W | 0 | |
| RTS_INV | 23 | R/W | 0 | Инвертировать выход RTS |
| TXD_INV | 22 | R/W | 0 | Инвертировать выход TXD |
| DSR_INV | 21 | R/W | 0 | |
| CTS_INV | 20 | R/W | 0 | Инвертировать вход CTS |
| RXD_INV | 19 | R/W | 0 | Инвертировать вход RXD |
| TXFIFO_RST | 18 | R/W | 0 | Сброс TX FIFO: записать 1, затем 0 |
| RXFIFO_RST | 17 | R/W | 0 | Сброс RX FIFO: записать 1, затем 0 |
| IRDA_EN | 16 | R/W | 0 | Режим IrDA |
| TX_FLOW_EN | 15 | R/W | 0 | Аппаратное управление потоком передатчика по CTS |
| LOOPBACK | 14 | R/W | 0 | Петля: TXD замкнут на RXD внутри чипа, для проверки |
| IRDA_RX_INV | 13 | R/W | 0 | |
| IRDA_TX_INV | 12 | R/W | 0 | |
| IRDA_WCTL | 11 | R/W | 0 | |
| IRDA_TX_EN | 10 | R/W | 0 | |
| IRDA_DPLX | 9 | R/W | 0 | |
| TXD_BRK | 8 | R/W | 0 | После передачи данных отправить break (нули) |
| SW_DTR | 7 | R/W | 0 | Программный уровень DTR |
| SW_RTS | 6 | R/W | 0 | Программный уровень RTS при программном управлении потоком |
| STOP_BIT_NUM | 5:4 | R/W | 0x1 | Число стоп-битов: 1 — один, 2 — полтора, 3 — два |
| BIT_NUM | 3:2 | R/W | 0x3 | Длина слова данных: 0 — 5 бит, 1 — 6, 2 — 7, 3 — 8 бит |
| PARITY_EN | 1 | R/W | 0 | Включить бит чётности |
| PARITY | 0 | R/W | 0 | Тип чётности: 0 — чётный, 1 — нечётный |
UART_CONF1_REG(i) — пороги FIFO и таймаут приёма
Смещение 0x0024, после сброса 0x0000 C060. TRM: регистр 26.10.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | RX_TOUT_EN | RX_FLOW_EN | RX_TOUT_FLOW_DIS | DIS_RX_DAT_OVF | TXFIFO_EMPTY_THRHD | ||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TXFIFO_EMPTY_THRHD | RXFIFO_FULL_THRHD | ||||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| RX_TOUT_EN | 21 | R/W | 0 | Включить таймаут приёма (прерывание RXFIFO_TOUT) |
| RX_FLOW_EN | 20 | R/W | 0 | Аппаратное управление потоком приёмника по RTS |
| RX_TOUT_FLOW_DIS | 19 | R/W | 0 | Не считать паузу таймаута, пока работает управление потоком |
| DIS_RX_DAT_OVF | 18 | R/W | 0 | Не отслеживать переполнение RX FIFO |
| TXFIFO_EMPTY_THRHD | 17:9 | R/W | 0x060 | Порог прерывания TXFIFO_EMPTY: меньше стольких байтов в TX FIFO |
| RXFIFO_FULL_THRHD | 8:0 | R/W | 0x060 | Порог прерывания RXFIFO_FULL: больше стольких байтов в RX FIFO |
UART_LOWPULSE_REG(i) — автоопределение скорости: самый короткий низкий импульс
Смещение 0x0028, после сброса 0x0000 0FFF. TRM: регистр 26.23.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| LOWPULSE_MIN_CNT | 11:0 | RO | 0xFFF |
UART_HIGHPULSE_REG(i) — автоопределение скорости: самый короткий высокий импульс
Смещение 0x002C, после сброса 0x0000 0FFF. TRM: регистр 26.24.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| HIGHPULSE_MIN_CNT | 11:0 | RO | 0xFFF |
UART_RXD_CNT_REG(i) — автоопределение скорости: число перепадов на RXD
Смещение 0x0030, после сброса 0x0000 0000. TRM: регистр 26.25.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| RXD_EDGE_CNT | 9:0 | RO | 0x000 |
UART_FLOW_CONF_REG(i) — программное управление потоком XON/XOFF
Смещение 0x0034, после сброса 0x0000 0000. TRM: регистр 26.11.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | SEND_XOFF | SEND_XON | FORCE_XOFF | FORCE_XON | XONOFF_DEL | SW_FLOW_CON_EN | |||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| SEND_XOFF | 5 | R/W/SS/SC | 0 |
| SEND_XON | 4 | R/W/SS/SC | 0 |
| FORCE_XOFF | 3 | R/W | 0 |
| FORCE_XON | 2 | R/W | 0 |
| XONOFF_DEL | 1 | R/W | 0 |
| SW_FLOW_CON_EN | 0 | R/W | 0 |
UART_SLEEP_CONF_REG(i) — порог пробуждения из лёгкого сна по RXD
Смещение 0x0038, после сброса 0x0000 00F0. TRM: регистр 26.12.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| ACTIVE_THRESHOLD | 9:0 | R/W | 0x0F0 |
UART_SWFC_CONF0_REG(i) — символ XOFF и порог его отправки
Смещение 0x003C, после сброса 0x0000 26E0. TRM: регистр 26.13.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | XOFF_CHAR | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| XOFF_CHAR | XOFF_THRESHOLD | ||||||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| XOFF_CHAR | 16:9 | R/W | 0x13 |
| XOFF_THRESHOLD | 8:0 | R/W | 0x0E0 |
UART_SWFC_CONF1_REG(i) — символ XON и порог его отправки
Смещение 0x0040, после сброса 0x0000 2200. TRM: регистр 26.14.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | XON_CHAR | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| XON_CHAR | XON_THRESHOLD | ||||||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| XON_CHAR | 16:9 | R/W | 0x11 |
| XON_THRESHOLD | 8:0 | R/W | 0x000 |
UART_TXBRK_CONF_REG(i) — длина сигнала break после передачи
Смещение 0x0044, после сброса 0x0000 000A. TRM: регистр 26.15.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| TX_BRK_NUM | 7:0 | R/W | 0x0A |
UART_IDLE_CONF_REG(i) — паузы между кадрами и порог конца кадра
Смещение 0x0048, после сброса 0x0004 0100. TRM: регистр 26.16.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | TX_IDLE_NUM | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TX_IDLE_NUM | RX_IDLE_THRHD | ||||||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| TX_IDLE_NUM | 19:10 | R/W | 0x100 |
| RX_IDLE_THRHD | 9:0 | R/W | 0x100 |
UART_RS485_CONF_REG(i) — режим RS-485 и задержки
Смещение 0x004C, после сброса 0x0000 0000. TRM: регистр 26.17.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | RS485_TX_DLY_NUM | RS485_RX_DLY_NUM | RS485RXBY_TX_EN | RS485TX_RX_EN | DL1_EN | DL0_EN | RS485_EN | ||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| RS485_TX_DLY_NUM | 9:6 | R/W | 0x0 |
| RS485_RX_DLY_NUM | 5 | R/W | 0 |
| RS485RXBY_TX_EN | 4 | R/W | 0 |
| RS485TX_RX_EN | 3 | R/W | 0 |
| DL1_EN | 2 | R/W | 0 |
| DL0_EN | 1 | R/W | 0 |
| RS485_EN | 0 | R/W | 0 |
UART_AT_CMD_PRECNT_REG(i) — escape-последовательность: пауза перед ней
Смещение 0x0050, после сброса 0x0000 0901. TRM: регистр 26.28.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| PRE_IDLE_NUM | 15:0 | R/W | 0x0901 |
UART_AT_CMD_POSTCNT_REG(i) — escape-последовательность: пауза после неё
Смещение 0x0054, после сброса 0x0000 0901. TRM: регистр 26.29.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| POST_IDLE_NUM | 15:0 | R/W | 0x0901 |
UART_AT_CMD_GAPTOUT_REG(i) — escape-последовательность: наибольший промежуток между символами
Смещение 0x0058, после сброса 0x0000 000B. TRM: регистр 26.30.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| RX_GAP_TOUT | 15:0 | R/W | 0x000B |
UART_AT_CMD_CHAR_REG(i) — escape-последовательность: символ и их число
Смещение 0x005C, после сброса 0x0000 032B. TRM: регистр 26.31.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| CHAR_NUM | AT_CMD_CHAR | ||||||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| CHAR_NUM | 15:8 | R/W | 0x03 |
| AT_CMD_CHAR | 7:0 | R/W | 0x2B |
UART_MEM_CONF_REG(i) — размеры FIFO, порог аппаратного управления потоком, питание памяти
Смещение 0x0060, после сброса 0x000A 0012. TRM: регистр 26.2.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | MEM_FORCE_PU | MEM_FORCE_PD | RX_TOUT_THRHD | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| RX_FLOW_THRHD | TX_SIZE | RX_SIZE | — | ||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| MEM_FORCE_PU | 27 | R/W | 0 | |
| MEM_FORCE_PD | 26 | R/W | 0 | |
| RX_TOUT_THRHD | 25:16 | R/W | 0x00A | Таймаут приёма в битовых интервалах |
| RX_FLOW_THRHD | 15:7 | R/W | 0x000 | Порог RX FIFO, при котором снимается RTS |
| TX_SIZE | 6:4 | R/W | 0x1 | Размер TX FIFO в блоках по 128 байт |
| RX_SIZE | 3:1 | R/W | 0x1 | Размер RX FIFO в блоках по 128 байт |
UART_MEM_TX_STATUS_REG(i) — адреса записи и чтения TX FIFO
Смещение 0x0064, после сброса 0x0000 0000. TRM: регистр 26.20.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | TX_RADDR | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TX_RADDR | — | APB_TX_WADDR | |||||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| TX_RADDR | 20:11 | RO | 0x000 |
| APB_TX_WADDR | 9:0 | RO | 0x000 |
UART_MEM_RX_STATUS_REG(i) — адреса записи и чтения RX FIFO
Смещение 0x0068, после сброса 0x0008 0100. TRM: регистр 26.21.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | RX_WADDR | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| RX_WADDR | — | APB_RX_RADDR | |||||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| RX_WADDR | 20:11 | RO | 0x100 |
| APB_RX_RADDR | 9:0 | RO | 0x100 |
UART_FSM_STATUS_REG(i) — состояния автоматов приёмника и передатчика
Смещение 0x006C, после сброса 0x0000 0000. TRM: регистр 26.22.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | ST_UTX_OUT | ST_URX_OUT | |||||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| ST_UTX_OUT | 7:4 | RO | 0x0 |
| ST_URX_OUT | 3:0 | RO | 0x0 |
UART_POSPULSE_REG(i) — автоопределение скорости: самый короткий период по фронтам
Смещение 0x0070, после сброса 0x0000 0FFF. TRM: регистр 26.26.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| POSEDGE_MIN_CNT | 11:0 | RO | 0xFFF |
UART_NEGPULSE_REG(i) — автоопределение скорости: самый короткий период по спадам
Смещение 0x0074, после сброса 0x0000 0FFF. TRM: регистр 26.27.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| NEGEDGE_MIN_CNT | 11:0 | RO | 0xFFF |
UART_CLK_CONF_REG(i) — источник и делитель такта ядра UART, сброс ядра
Смещение 0x0078, после сброса 0x0370 1000. TRM: регистр 26.18.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | RX_SCLK_EN | TX_SCLK_EN | RST_CORE | SCLK_EN | SCLK_SEL | SCLK_DIV_NUM | |||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| SCLK_DIV_NUM | SCLK_DIV_A | SCLK_DIV_B | |||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| RX_SCLK_EN | 25 | R/W | 1 | Включить такт приёмника |
| TX_SCLK_EN | 24 | R/W | 1 | Включить такт передатчика |
| RST_CORE | 23 | R/W | 0 | Сброс ядра UART: записать 1, затем 0 |
| SCLK_EN | 22 | R/W | 1 | Включить такт приёмника и передатчика |
| SCLK_SEL | 21:20 | R/W | 0x3 | Такт ядра UART: 1 — APB_CLK, 2 — RC_FAST_CLK, 3 — XTAL_CLK |
| SCLK_DIV_NUM | 19:12 | R/W | 0x01 | Целая часть делителя такта ядра минус 1 |
| SCLK_DIV_A | 11:6 | R/W | 0x00 | Знаменатель дробной части делителя такта ядра |
| SCLK_DIV_B | 5:0 | R/W | 0x00 | Числитель дробной части делителя такта ядра |
UART_DATE_REG(i) — версия блока: дата ревизии аппаратуры
Смещение 0x007C, после сброса 0x0200 8270. TRM: регистр 26.32.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| DATE | 31:0 | R/W | 0x0200 8270 |
UART_ID_REG(i) — синхронизация настроек с ядром UART и номер версии
Смещение 0x0080, после сброса 0x4000 0500. TRM: регистр 26.33.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| REG_UPDATE | UPDATE_CTRL | ID | |||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| ID | |||||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| REG_UPDATE | 31 | R/W/SC | 0 | Запись 1 передаёт настройки в домен ядра UART; бит сбрасывается сам по окончании (UART_UPDATE в ESP-IDF) |
| UPDATE_CTRL | 30 | R/W | 1 | Режим синхронизации: 1 (после сброса) — автоматический, годится, только когда такт ядра равен APB_CLK; по TRM перед записью REG_UPDATE бит сбрасывают в 0 (UART_HIGH_SPEED в ESP-IDF) |
| ID | 29:0 | R/W | 0x0000 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.
Источники
- Espressif. ESP32-C3 Technical Reference Manual, версия 1.4 — глава 26: таблица 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Блоки периферии и базовые адреса
- GPIO — выводы общего назначения и матрица GPIOGPIO_BT_SELECT_REG, GPIO_OUT_REG, GPIO_OUT_W1TS_REG, GPIO_OUT_W1TC_REG
- IO MUX — мультиплексор функций и электрические настройки выводовPIN_CTRL, IO_MUX_GPIOn_REG, IO_MUX_DATE_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