Регистры UART ESP32
Регистры UART ESP32: скорость обмена от APB_CLK или REF_TICK, длина слова, чётность и стоп-биты, FIFO по 128 байт в общей памяти на 1 КБ, аппаратное и программное управление потоком, режим RS-485 и флаги прерываний — для трёх контроллеров UART0…UART2.
Содержание
- Пример на C
- Регистры блока
- UART_FIFO_REG
- UART_INT_RAW_REG
- UART_INT_ST_REG
- UART_INT_ENA_REG
- UART_INT_CLR_REG
- UART_CLKDIV_REG
- UART_AUTOBAUD_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_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_MEM_CNT_STATUS_REG
- UART_POSPULSE_REG
- UART_NEGPULSE_REG
У 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, даёт непредсказуемые ошибки.
| Экземпляр | Базовый адрес |
|---|---|
| UART0 | 0x3FF4 0000 |
| UART1 | 0x3FF5 0000 |
| UART2 | 0x3FF6 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 FIFO | 0x0000 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 | Сброс флагов прерываний записью 1 | 0x0000 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 | Формат кадра, источник такта, инверсия линий, сброс FIFO | 0x0800 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 | Автоопределение скорости: число перепадов на RXD | 0x0000 0000 |
| UART_FLOW_CONF_REG(i) | 0x0034 | Программное управление потоком XON/XOFF | 0x0000 0000 |
| UART_SLEEP_CONF_REG(i) | 0x0038 | Порог пробуждения из лёгкого сна по RXD | 0x0000 00F0 |
| UART_SWFC_CONF_REG(i) | 0x003C | Символы и пороги XON и XOFF | 0x1311 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) | 0x0048 | Escape-последовательность: пауза перед ней | 0x0018 6A00 |
| UART_AT_CMD_POSTCNT_REG(i) | 0x004C | Escape-последовательность: пауза после неё | 0x0018 6A00 |
| UART_AT_CMD_GAPTOUT_REG(i) | 0x0050 | Escape-последовательность: наибольший промежуток между символами | 0x0000 1E00 |
| UART_AT_CMD_CHAR_REG(i) | 0x0054 | Escape-последовательность: символ и их число | 0x0000 032B |
| UART_MEM_CONF_REG(i) | 0x0058 | Размеры FIFO, старшие биты порогов, питание памяти | 0x0000 0088 |
| UART_MEM_TX_STATUS_REG(i) | 0x005C | Адреса записи и чтения TX FIFO | 0x0000 0000 |
| UART_MEM_RX_STATUS_REG(i) | 0x0060 | Адреса записи и чтения RX FIFO | 0x0000 0000 |
| UART_MEM_CNT_STATUS_REG(i) | 0x0064 | Старшие биты счётчиков FIFO | 0x0000 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_BYTE | 7:0 | R/W | 0x00 | Чтение забирает байт из RX FIFO; запись кладёт байт в TX FIFO |
UART_INT_RAW_REG(i) — необработанные флаги прерываний
Смещение 0x0004, после сброса 0x0000 0000. TRM: регистр 19.2.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| AT_CMD_CHAR_DET_INT_RAW | 18 | RO | 0 | Обнаружена escape-последовательность AT_CMD_CHAR |
| RS485_CLASH_INT_RAW | 17 | RO | 0 | Режим RS-485: коллизия передатчика и приёмника |
| RS485_FRM_ERR_INT_RAW | 16 | RO | 0 | Режим RS-485: ошибка кадра при эхо-контроле |
| RS485_PARITY_ERR_INT_RAW | 15 | RO | 0 | Режим RS-485: ошибка чётности при эхо-контроле |
| TX_DONE_INT_RAW | 14 | RO | 0 | Передатчик отправил все данные из FIFO |
| TX_BRK_IDLE_DONE_INT_RAW | 13 | RO | 0 | Выдержана пауза после передачи break |
| TX_BRK_DONE_INT_RAW | 12 | RO | 0 | Передача break после данных закончена |
| GLITCH_DET_INT_RAW | 11 | RO | 0 | На входе RXD замечена помеха посреди стартового бита |
| SW_XOFF_INT_RAW | 10 | RO | 0 | Принят символ XOFF программного управления потоком |
| SW_XON_INT_RAW | 9 | RO | 0 | Принят символ XON программного управления потоком |
| RXFIFO_TOUT_INT_RAW | 8 | RO | 0 | Таймаут приёма: линия молчит дольше RX_TOUT_THRHD битовых интервалов |
| BRK_DET_INT_RAW | 7 | RO | 0 | Принят сигнал break: линия RXD долго в нуле |
| CTS_CHG_INT_RAW | 6 | RO | 0 | Изменился уровень на входе CTS |
| DSR_CHG_INT_RAW | 5 | RO | 0 | Изменился уровень на входе DSR |
| RXFIFO_OVF_INT_RAW | 4 | RO | 0 | RX FIFO переполнен, принятый байт потерян |
| FRM_ERR_INT_RAW | 3 | RO | 0 | Ошибка кадра: на месте стоп-бита принят 0 |
| PARITY_ERR_INT_RAW | 2 | RO | 0 | Принят байт с ошибкой чётности |
| TXFIFO_EMPTY_INT_RAW | 1 | RO | 0 | В TX FIFO меньше байтов, чем задано в TXFIFO_EMPTY_THRHD |
| RXFIFO_FULL_INT_RAW | 0 | RO | 0 | В RX FIFO больше байтов, чем задано в RXFIFO_FULL_THRHD |
UART_INT_ST_REG(i) — флаги прерываний после маски разрешения
Смещение 0x0008, после сброса 0x0000 0000. TRM: регистр 19.3.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| 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: регистр 19.4.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| 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: регистр 19.5.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| AT_CMD_CHAR_DET_INT_CLR | 18 | WO | 0 | Обнаружена escape-последовательность AT_CMD_CHAR |
| RS485_CLASH_INT_CLR | 17 | WO | 0 | Режим RS-485: коллизия передатчика и приёмника |
| RS485_FRM_ERR_INT_CLR | 16 | WO | 0 | Режим RS-485: ошибка кадра при эхо-контроле |
| RS485_PARITY_ERR_INT_CLR | 15 | WO | 0 | Режим RS-485: ошибка чётности при эхо-контроле |
| TX_DONE_INT_CLR | 14 | WO | 0 | Передатчик отправил все данные из FIFO |
| TX_BRK_IDLE_DONE_INT_CLR | 13 | WO | 0 | Выдержана пауза после передачи break |
| TX_BRK_DONE_INT_CLR | 12 | WO | 0 | Передача break после данных закончена |
| GLITCH_DET_INT_CLR | 11 | WO | 0 | На входе RXD замечена помеха посреди стартового бита |
| SW_XOFF_INT_CLR | 10 | WO | 0 | Принят символ XOFF программного управления потоком |
| SW_XON_INT_CLR | 9 | WO | 0 | Принят символ XON программного управления потоком |
| RXFIFO_TOUT_INT_CLR | 8 | WO | 0 | Таймаут приёма: линия молчит дольше RX_TOUT_THRHD битовых интервалов |
| BRK_DET_INT_CLR | 7 | WO | 0 | Принят сигнал break: линия RXD долго в нуле |
| CTS_CHG_INT_CLR | 6 | WO | 0 | Изменился уровень на входе CTS |
| DSR_CHG_INT_CLR | 5 | WO | 0 | Изменился уровень на входе DSR |
| RXFIFO_OVF_INT_CLR | 4 | WO | 0 | RX FIFO переполнен, принятый байт потерян |
| FRM_ERR_INT_CLR | 3 | WO | 0 | Ошибка кадра: на месте стоп-бита принят 0 |
| PARITY_ERR_INT_CLR | 2 | WO | 0 | Принят байт с ошибкой чётности |
| TXFIFO_EMPTY_INT_CLR | 1 | WO | 0 | В TX FIFO меньше байтов, чем задано в TXFIFO_EMPTY_THRHD |
| RXFIFO_FULL_INT_CLR | 0 | WO | 0 | В RX FIFO больше байтов, чем задано в RXFIFO_FULL_THRHD |
UART_CLKDIV_REG(i) — делитель скорости обмена
Смещение 0x0014, после сброса 0x0000 02B6. TRM: регистр 19.6.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | CLKDIV_FRAG | CLKDIV | |||||||||||||
| 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 | 19:0 | R/W | 0x002B6 | Целая часть делителя скорости |
UART_AUTOBAUD_REG(i) — автоопределение скорости и фильтр помех
Смещение 0x0018, после сброса 0x0000 1000. TRM: регистр 19.7.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| GLITCH_FILT | — | AUTOBAUD_EN | |||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| GLITCH_FILT | 15:8 | R/W | 0x10 | Импульсы короче этого числа тактов отбрасываются |
| AUTOBAUD_EN | 0 | R/W | 0 | Включить автоопределение скорости |
UART_STATUS_REG(i) — заполнение FIFO, уровни линий и состояния автоматов
Смещение 0x001C, после сброса 0x0000 0000. TRM: регистр 19.8.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| TXD | RTSN | DTRN | — | ST_UTX_OUT | TXFIFO_CNT | ||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| RXD | CTSN | DSRN | — | ST_URX_OUT | RXFIFO_CNT | ||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| TXD | 31 | RO | 0 | Текущий уровень на линии TXD |
| RTSN | 30 | RO | 0 | Текущий уровень выхода RTS |
| DTRN | 29 | RO | 0 | |
| ST_UTX_OUT | 27:24 | RO | 0x0 | Состояние автомата передатчика |
| TXFIFO_CNT | 23:16 | RO | 0x00 | Число байтов в TX FIFO (младшие 8 бит; старшие — в MEM_CNT_STATUS) |
| RXD | 15 | RO | 0 | Текущий уровень на линии RXD |
| CTSN | 14 | RO | 0 | Текущий уровень входа CTS |
| DSRN | 13 | RO | 0 | |
| ST_URX_OUT | 11:8 | RO | 0x0 | Состояние автомата приёмника |
| RXFIFO_CNT | 7:0 | RO | 0x00 | Число байтов в RX FIFO (младшие 8 бит) |
UART_CONF0_REG(i) — формат кадра, источник такта, инверсия линий, сброс FIFO
Смещение 0x0020, после сброса 0x0800 001C. TRM: регистр 19.9.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| TICK_REF_ALWAYS_ON | 27 | R/W | 1 | Источник такта: 1 — APB_CLK, 0 — REF_TICK 1 МГц |
| DTR_INV | 24 | R/W | 0 | |
| RTS_INV | 23 | R/W | 0 | |
| TXD_INV | 22 | R/W | 0 | Инвертировать выход TXD |
| DSR_INV | 21 | R/W | 0 | |
| CTS_INV | 20 | R/W | 0 | |
| 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 | |
| SW_RTS | 6 | R/W | 0 | |
| 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 6060. TRM: регистр 19.10.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| RX_TOUT_EN | RX_TOUT_THRHD | RX_FLOW_EN | RX_FLOW_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 | 31 | R/W | 0 | Включить таймаут приёма |
| RX_TOUT_THRHD | 30:24 | R/W | 0x00 | Таймаут приёма в интервалах длительности байта |
| RX_FLOW_EN | 23 | R/W | 0 | Аппаратное управление потоком приёмника по RTS |
| RX_FLOW_THRHD | 22:16 | R/W | 0x00 | Порог RX FIFO для снятия RTS |
| TXFIFO_EMPTY_THRHD | 14:8 | R/W | 0x60 | Порог прерывания TXFIFO_EMPTY (младшие 7 бит) |
| RXFIFO_FULL_THRHD | 6:0 | R/W | 0x60 | Порог прерывания RXFIFO_FULL (младшие 7 бит) |
UART_LOWPULSE_REG(i) — автоопределение скорости: самый короткий низкий импульс
Смещение 0x0028, после сброса 0x000F FFFF. TRM: регистр 19.11.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| LOWPULSE_MIN_CNT | 19:0 | RO | 0xFFFFF |
UART_HIGHPULSE_REG(i) — автоопределение скорости: самый короткий высокий импульс
Смещение 0x002C, после сброса 0x000F FFFF. TRM: регистр 19.12.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| HIGHPULSE_MIN_CNT | 19:0 | RO | 0xFFFFF |
UART_RXD_CNT_REG(i) — автоопределение скорости: число перепадов на RXD
Смещение 0x0030, после сброса 0x0000 0000. TRM: регистр 19.13.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| RXD_EDGE_CNT | 9:0 | RO | 0x000 |
UART_FLOW_CONF_REG(i) — программное управление потоком XON/XOFF
Смещение 0x0034, после сброса 0x0000 0000. TRM: регистр 19.14.
| 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 | 0 |
| SEND_XON | 4 | R/W | 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: регистр 19.15.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| ACTIVE_THRESHOLD | 9:0 | R/W | 0x0F0 |
UART_SWFC_CONF_REG(i) — символы и пороги XON и XOFF
Смещение 0x003C, после сброса 0x1311 E000. TRM: регистр 19.16.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| XOFF_CHAR | XON_CHAR | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| XOFF_THRESHOLD | XON_THRESHOLD | ||||||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| XOFF_CHAR | 31:24 | R/W | 0x13 |
| XON_CHAR | 23:16 | R/W | 0x11 |
| XOFF_THRESHOLD | 15:8 | R/W | 0xE0 |
| XON_THRESHOLD | 7:0 | R/W | 0x00 |
UART_IDLE_CONF_REG(i) — паузы между кадрами, длина break, порог конца кадра
Смещение 0x0040, после сброса 0x00A4 0100. TRM: регистр 19.17.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | TX_BRK_NUM | 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_BRK_NUM | 27:20 | R/W | 0x0A | Длина break в битовых интервалах |
| TX_IDLE_NUM | 19:10 | R/W | 0x100 | Пауза между кадрами передачи |
| RX_IDLE_THRHD | 9:0 | R/W | 0x100 | Пауза на RXD, после которой кадр считается законченным |
UART_RS485_CONF_REG(i) — режим RS-485 и задержки
Смещение 0x0044, после сброса 0x0000 0000. TRM: регистр 19.18.
| 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-последовательность: пауза перед ней
Смещение 0x0048, после сброса 0x0018 6A00. TRM: регистр 19.19.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| PRE_IDLE_NUM | 23:0 | R/W | 0x186A00 |
UART_AT_CMD_POSTCNT_REG(i) — escape-последовательность: пауза после неё
Смещение 0x004C, после сброса 0x0018 6A00. TRM: регистр 19.20.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| POST_IDLE_NUM | 23:0 | R/W | 0x186A00 |
UART_AT_CMD_GAPTOUT_REG(i) — escape-последовательность: наибольший промежуток между символами
Смещение 0x0050, после сброса 0x0000 1E00. TRM: регистр 19.21.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| RX_GAP_TOUT | 23:0 | R/W | 0x001E00 |
UART_AT_CMD_CHAR_REG(i) — escape-последовательность: символ и их число
Смещение 0x0054, после сброса 0x0000 032B. TRM: регистр 19.22.
| 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, старшие биты порогов, питание памяти
Смещение 0x0058, после сброса 0x0000 0088. TRM: регистр 19.23.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | TX_MEM_EMPTY_THRHD | RX_MEM_FULL_THRHD | XOFF_THRESHOLD_H2 | XON_THRESHOLD_H2 | RX_TOUT_THRHD_H3 | RX_FLOW_THRHD_H3 | |||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| RX_FLOW_THRHD_H3 | — | TX_SIZE | RX_SIZE | — | MEM_PD | ||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| TX_MEM_EMPTY_THRHD | 30:28 | R/W | 0x0 | |
| RX_MEM_FULL_THRHD | 27:25 | R/W | 0x0 | |
| XOFF_THRESHOLD_H2 | 24:23 | R/W | 0x0 | |
| XON_THRESHOLD_H2 | 22:21 | R/W | 0x0 | |
| RX_TOUT_THRHD_H3 | 20:18 | R/W | 0x0 | |
| RX_FLOW_THRHD_H3 | 17:15 | R/W | 0x0 | |
| TX_SIZE | 10:7 | R/W | 0x1 | Размер TX FIFO в блоках по 128 байт |
| RX_SIZE | 6:3 | R/W | 0x1 | Размер RX FIFO в блоках по 128 байт |
| MEM_PD | 0 | R/W | 0 | Выключить питание памяти FIFO |
UART_MEM_TX_STATUS_REG(i) — адреса записи и чтения TX FIFO
Смещение 0x005C, после сброса 0x0000 0000. TRM: регистр 19.24.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | MEM_TX_WR_ADDR | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| MEM_TX_WR_ADDR | MEM_TX_RD_ADDR | — | |||||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| MEM_TX_WR_ADDR | 23:13 | RO | 0x000 |
| MEM_TX_RD_ADDR | 12:2 | RO | 0x000 |
UART_MEM_RX_STATUS_REG(i) — адреса записи и чтения RX FIFO
Смещение 0x0060, после сброса 0x0000 0000. TRM: регистр 19.25.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | MEM_RX_WR_ADDR | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| MEM_RX_WR_ADDR | MEM_RX_RD_ADDR | — | |||||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| MEM_RX_WR_ADDR | 23:13 | RO | 0x000 |
| MEM_RX_RD_ADDR | 12:2 | RO | 0x000 |
UART_MEM_CNT_STATUS_REG(i) — старшие биты счётчиков FIFO
Смещение 0x0064, после сброса 0x0000 0000. TRM: регистр 19.26.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | TX_MEM_CNT | RX_MEM_CNT | |||||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| TX_MEM_CNT | 5:3 | RO | 0x0 |
| RX_MEM_CNT | 2:0 | RO | 0x0 |
UART_POSPULSE_REG(i) — автоопределение скорости: самый короткий период по фронтам
Смещение 0x0068, после сброса 0x000F FFFF. TRM: регистр 19.27.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| POSEDGE_MIN_CNT | 19:0 | RO | 0xFFFFF |
UART_NEGPULSE_REG(i) — автоопределение скорости: самый короткий период по спадам
Смещение 0x006C, после сброса 0x000F FFFF. TRM: регистр 19.28.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| NEGEDGE_MIN_CNT | 19:0 | RO | 0xFFFFF |
Частые вопросы
Какие значения 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.
Источники
- Espressif. ESP32 Technical Reference Manual, версия 5.8 — глава 19: таблица Register Summary и рисунки регистров — смещения, поля, тип доступа и значения после сброса
- Espressif. SVD svd/esp32.svd, версия 16 (espressif/svd, коммит be20aa1) — базовые адреса периферии, список регистров и полей; лицензия Apache-2.0
- Espressif. ESP-IDF v6.1: заголовки components/soc/esp32/register/soc/*_reg.h (коммит fff9895) — имена макросов регистров и полей, сверка положения полей и значений по умолчанию; лицензия Apache-2.0 OR MIT
Нашли ошибку в регистрах?
Другие регистры ESP32
- Все регистры ESP32Блоки периферии и базовые адреса
- GPIO — выводы общего назначения и матрица GPIOGPIO_OUT_REG, GPIO_OUT_W1TS_REG, GPIO_OUT_W1TC_REG, GPIO_OUT1_REG
- IO MUX — мультиплексор функций и электрические настройки выводовPIN_CTRL, IO_MUX_GPIOn_REG
- SPI — контроллеры SPI общего назначения HSPI и VSPISPI_CMD_REG, SPI_ADDR_REG, SPI_CTRL_REG, SPI_CTRL1_REG
- I2C — контроллер шины I2CI2C_SCL_LOW_PERIOD_REG, I2C_CTR_REG, I2C_SR_REG, I2C_TO_REG
- LEDC — контроллер ШИМ для светодиодов и не толькоLEDC_HSCHn_CONF0_REG, LEDC_HSCHn_HPOINT_REG, LEDC_HSCHn_DUTY_REG, LEDC_HSCHn_CONF1_REG
- TIMG — группа таймеров: таймеры общего назначения и сторожTIMG_TnCONFIG_REG, TIMG_TnLO_REG, TIMG_TnHI_REG, TIMG_TnUPDATE_REG
- RMT — контроллер инфракрасного пульта и импульсных протоколовRMT_CHnCONF0_REG, RMT_CHnCONF1_REG, RMT_INT_RAW_REG, RMT_INT_ST_REG
- RTC_CNTL — управление питанием, сном и RTCRTC_CNTL_OPTIONS0_REG, RTC_CNTL_SLP_TIMER0_REG, RTC_CNTL_SLP_TIMER1_REG, RTC_CNTL_TIME_UPDATE_REG
- SENS — АЦП, сенсорные входы и ЦАП домена RTCSENS_SAR_READ_CTRL_REG, SENS_ULP_CP_SLEEP_CYC0_REG, SENS_SAR_START_FORCE_REG, SENS_SAR_ATTENn_REG
- eFuse — однократно программируемая память настроек и ключейEFUSE_BLK0_RDATA0_REG, EFUSE_BLK0_RDATA1_REG, EFUSE_BLK0_RDATA2_REG, EFUSE_BLK0_RDATA3_REG