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

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

Регистры RMT ESP32-S3: восемь каналов — 0…3 передают, 4…7 принимают — с памятью по 48 слов, общий дробный делитель и делитель каждого канала, модуляция несущей, пороги для потоковой передачи, повторы, фильтр приёма и DMA для каналов 3 и 7.

RMT по адресу 0x6001 6000 передаёт и принимает последовательности импульсов: каждая запись памяти хранит пары «уровень, длительность» с 15-битной длительностью в тактах канала; нулевая длительность — маркер конца. Так кодируют ИК-пульты, адресные светодиоды WS2812 и другие однопроводные протоколы.

Восемь каналов делят 384 слова памяти — восемь блоков по 48. По умолчанию канал n использует блок n; поле MEM_SIZE отдаёт каналу несколько блоков подряд, и тогда следующие каналы работать не могут. Такт RMT_SCLK выбирает поле SCLK_SEL регистра RMT_SYS_CONF_REG (1 — APB_CLK, 2 — RC_FAST_CLK, 3 — XTAL_CLK) и делит дробный делитель SCLK_DIV_NUM + 1 + SCLK_DIV_A / SCLK_DIV_B; затем каждый канал делит его на DIV_CNT (0 означает 256).

В TRM каналы передачи называются CHn (n = 0…3), приёма — CHm (m = 4…7): регистры RMT_CHnCONF0_REG и RMT_CHmCONF0_REG имеют разные поля, хотя макросы ESP-IDF выглядят одинаково — RMT_CH0CONF0_REG и RMT_CH4CONF0_REG. Изменённые настройки каналов вступают в силу после записи 1 в CONF_UPDATE.

ЭкземплярБазовый адрес
RMT0x6001 6000

Пример на C

Канал 0: RMT_SCLK 80 МГц и несущая около 38 кГц, 33 % (soc/rmt_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/rmt_reg.h"

REG_SET_FIELD(RMT_SYS_CONF_REG, RMT_SCLK_SEL, 1);                   // APB_CLK 80 МГц
REG_SET_FIELD(RMT_SYS_CONF_REG, RMT_SCLK_DIV_NUM, 0);               // делитель 0 + 1 = 1
REG_SET_FIELD(RMT_CH0CARRIER_DUTY_REG, RMT_CARRIER_HIGH_CH0, 698);
REG_SET_FIELD(RMT_CH0CARRIER_DUTY_REG, RMT_CARRIER_LOW_CH0, 1407);
REG_SET_BIT(RMT_CH0CONF0_REG, RMT_CARRIER_EN_CH0);                  // модуляция включена
REG_SET_BIT(RMT_CH0CONF0_REG, RMT_CONF_UPDATE_CH0);                 // применить

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

Регистр (ESP-IDF)СмещениеНазначениеПосле сброса
RMT_CHnDATA_REG0x0000 + n · 0x0004Канал n: доступ к памяти символов через FIFO0x0000 0000
RMT_CHnCONF0_REG0x0020 + n · 0x0004Канал передачи n: запуск, делитель, несущая, память0x0071 0200
RMT_CHnCONF0_REG0x0010 + n · 0x0008Канал приёма n: делитель, порог тишины, несущая, память0x317F FF02
RMT_CHnCONF1_REG0x0014 + n · 0x0008Канал приёма n: запуск, фильтр, владелец памяти0x0000 01E8
RMT_CHnSTATUS_REG0x0050 + n · 0x0004Канал передачи n: состояние и адреса памяти0x0000 0000
RMT_CHnSTATUS_REG0x0050 + n · 0x0004Канал приёма n: состояние и адреса памяти0x0006 00C0
RMT_INT_RAW_REG0x0070Необработанные флаги прерываний0x0000 0000
RMT_INT_ST_REG0x0074Флаги прерываний после маски разрешения0x0000 0000
RMT_INT_ENA_REG0x0078Разрешение прерываний0x0000 0000
RMT_INT_CLR_REG0x007CСброс флагов прерываний записью 10x0000 0000
RMT_CHnCARRIER_DUTY_REG0x0080 + n · 0x0004Канал передачи n: длительности уровней несущей0x0040 0040
RMT_CHn_RX_CARRIER_RM_REG0x0080 + n · 0x0004Канал приёма n: удаление несущей0x0000 0000
RMT_CHn_TX_LIM_REG0x00A0 + n · 0x0004Канал передачи n: порог и число повторов0x0000 0080
RMT_CHn_RX_LIM_REG0x00A0 + n · 0x0004Канал приёма n: порог прерывания0x0000 0080
RMT_SYS_CONF_REG0x00C0Общий такт RMT_SCLK, питание и доступ к памяти0x0500 0010
RMT_TX_SIM_REG0x00C4Одновременный запуск каналов передачи0x0000 0000
RMT_REF_CNT_RST_REG0x00C8Сброс делителей каналов0x0000 0000
RMT_DATE_REG0x00CCВерсия блока: дата ревизии аппаратуры0x0210 1181

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

RMT_CHnDATA_REG — канал n: доступ к памяти символов через FIFO

8 копий, n = 0…7: смещение 0x0000 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 37.1.

ПолеБитыДоступСбросНазначение
CHnDATA31:0RO0x0000 0000Чтение и запись памяти канала n в режиме FIFO

RMT_CHnCONF0_REG — канал передачи n: запуск, делитель, несущая, память

4 копии, n = 0…3: смещение 0x0020 + n · 0x0004, после сброса 0x0071 0200. TRM: регистр 37.3 (RMT_CHnCONF0_REG).

Бит 25 есть только у канала 3: в TRM он подписан «RMT_DMA_ACCESS_EN_CH3 (reserved for n: 0-2)», у каналов 0…2 зарезервирован, а в ESP-IDF объявлен только в RMT_CH3CONF0_REG. В SVD этого бита нет, зато есть AFIFO_RST в бите 23, который TRM считает зарезервированным.

31302928272625242322212019181716
—DMA_ACCESS_EN_CH3CONF_UPDATE_CHn—CARRIER_OUT_LV_CHnCARRIER_EN_CHnCARRIER_EFF_EN_CHnMEM_SIZE_CHn
1514131211109876543210
DIV_CNT_CHnTX_STOP_CHnIDLE_OUT_EN_CHnIDLE_OUT_LV_CHnMEM_TX_WRAP_EN_CHnTX_CONTI_MODE_CHnAPB_MEM_RST_CHnMEM_RD_RST_CHnTX_START_CHn
ПолеБитыДоступСбросНазначение
DMA_ACCESS_EN_CH325R/W0Только у канала 3 (у каналов 0…2 зарезервировано): разрешение доступа DMA
CONF_UPDATE_CHn24WT0Запись 1 применяет настройки канала
CARRIER_OUT_LV_CHn22R/W1Несущая накладывается: 1 — на высокий уровень, 0 — на низкий
CARRIER_EN_CHn21R/W11 — модуляция несущей
CARRIER_EFF_EN_CHn20R/W11 — несущая только при передаче данных, 0 — и в покое
MEM_SIZE_CHn19:16R/W0x1Число блоков памяти по 48 слов; не больше 8 − n
DIV_CNT_CHn15:8R/W0x02Делитель такта канала 1…255; 0 означает 256
TX_STOP_CHn7R/W/SC01 — остановить передачу
IDLE_OUT_EN_CHn6R/W0Уровень в покое: 1 — из IDLE_OUT_LV, 0 — из маркера конца
IDLE_OUT_LV_CHn5R/W0Уровень выхода в покое
MEM_TX_WRAP_EN_CHn4R/W01 — кольцевая передача для данных длиннее блока
TX_CONTI_MODE_CHn3R/W01 — непрерывная передача: после конца — снова с начала
APB_MEM_RST_CHn2WT0Запись 1 сбрасывает адрес доступа по APB в режиме FIFO
MEM_RD_RST_CHn1WT0Запись 1 сбрасывает адрес чтения передатчика
TX_START_CHn0WT0Запись 1 запускает передачу

RMT_CHnCONF0_REG — канал приёма n: делитель, порог тишины, несущая, память

4 копии, n = 4…7: смещение 0x0010 + n · 0x0008, после сброса 0x317F FF02. TRM: регистр 37.4 (RMT_CHmCONF0_REG).

31302928272625242322212019181716
—CARRIER_OUT_LV_CHnCARRIER_EN_CHnMEM_SIZE_CHnDMA_ACCESS_EN_CH7IDLE_THRES_CHn
1514131211109876543210
IDLE_THRES_CHnDIV_CNT_CHn
ПолеБитыДоступСбросНазначение
CARRIER_OUT_LV_CHn29R/W1Несущая удаляется: 1 — с высокого уровня, 0 — с низкого
CARRIER_EN_CHn28R/W11 — демодуляция несущей
MEM_SIZE_CHn27:24R/W0x1Число блоков памяти по 48 слов; не больше 8 − m
DMA_ACCESS_EN_CH723R/W0Только у канала 7 (у каналов 4…6 зарезервировано): 1 — данные приёма идут в GDMA
IDLE_THRES_CHn22:8R/W0x7FFFБез перепадов дольше стольких тактов канала — конец приёма
DIV_CNT_CHn7:0R/W0x02Делитель такта канала 1…255; 0 означает 256

RMT_CHnCONF1_REG — канал приёма n: запуск, фильтр, владелец памяти

4 копии, n = 4…7: смещение 0x0014 + n · 0x0008, после сброса 0x0000 01E8. TRM: регистр 37.5 (RMT_CHmCONF1_REG).

1514131211109876543210
CONF_UPDATE_CHn—MEM_RX_WRAP_EN_CHnRX_FILTER_THRES_CHnRX_FILTER_EN_CHnMEM_OWNER_CHnAPB_MEM_RST_CHnMEM_WR_RST_CHnRX_EN_CHn
ПолеБитыДоступСбросНазначение
CONF_UPDATE_CHn15WT0Запись 1 применяет настройки канала
MEM_RX_WRAP_EN_CHn13R/W01 — кольцевой приём для данных длиннее блока
RX_FILTER_THRES_CHn12:5R/W0x0FИмпульсы короче стольких тактов RMT_SCLK отбрасываются
RX_FILTER_EN_CHn4R/W01 — фильтр приёмника
MEM_OWNER_CHn3R/W1Владелец памяти: 1 — приёмник, 0 — шина APB
APB_MEM_RST_CHn2WT0Запись 1 сбрасывает адрес доступа по APB в режиме FIFO
MEM_WR_RST_CHn1WT0Запись 1 сбрасывает адрес записи приёмника
RX_EN_CHn0R/W01 — приём включён

RMT_CHnSTATUS_REG — канал передачи n: состояние и адреса памяти

4 копии, n = 0…3: смещение 0x0050 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 37.9 (RMT_CHnSTATUS_REG).

31302928272625242322212019181716
—APB_MEM_WR_ERR_CHnMEM_EMPTY_CHnSTATE_CHn—APB_MEM_WADDR_CHn
1514131211109876543210
APB_MEM_WADDR_CHn—MEM_RADDR_EX_CHn
ПолеБитыДоступСбросНазначение
APB_MEM_WR_ERR_CHn26RO0Запись по APB вышла за пределы памяти канала
MEM_EMPTY_CHn25RO0Данные длиннее памяти, а кольцевой режим выключен
STATE_CHn24:22RO0x0Состояние автомата канала
APB_MEM_WADDR_CHn20:11RO0x000Смещение записи по APB
MEM_RADDR_EX_CHn9:0RO0x000Смещение чтения передатчика

RMT_CHnSTATUS_REG — канал приёма n: состояние и адреса памяти

4 копии, n = 4…7: смещение 0x0050 + n · 0x0004, после сброса 0x0006 00C0. TRM: регистр 37.10 (RMT_CHmSTATUS_REG).

SVD называет эти регистры CHn_RX_STATUS с номерами 0…3, TRM — RMT_CHmSTATUS_REG для каналов 4…7 по смещениям 0x60…0x6C; страница следует TRM.

31302928272625242322212019181716
—APB_MEM_RD_ERR_CHnMEM_FULL_CHnMEM_OWNER_ERR_CHnSTATE_CHn—APB_MEM_RADDR_CHn
1514131211109876543210
APB_MEM_RADDR_CHn—MEM_WADDR_EX_CHn
ПолеБитыДоступСбросНазначение
APB_MEM_RD_ERR_CHn27RO0Чтение по APB вышло за пределы памяти канала
MEM_FULL_CHn26RO0Принято больше данных, чем помещается в память
MEM_OWNER_ERR_CHn25RO0Нарушено владение блоком памяти
STATE_CHn24:22RO0x0Состояние автомата канала
APB_MEM_RADDR_CHn20:11RO0x0C0Смещение чтения по APB
MEM_WADDR_EX_CHn9:0RO0x0C0Смещение записи приёмника

RMT_INT_RAW_REG — необработанные флаги прерываний

Смещение 0x0070, адрес 0x6001 6070, после сброса 0x0000 0000. TRM: регистр 37.11.

ПолеБитыДоступСбросНазначение
CH7_DMA_ACCESS_FAIL_INT_RAW29R/WTC/SS0Канал 7: приём продолжается, хотя GDMA не забрал заполненную память
CH3_DMA_ACCESS_FAIL_INT_RAW28R/WTC/SS0Канал 3: GDMA пишет в память, которая уже заполнена непереданными символами
CH7_RX_THR_EVENT_INT_RAW27R/W0Канал 7 принял RX_LIM символов
CH6_RX_THR_EVENT_INT_RAW26R/W0Канал 6 принял RX_LIM символов
CH5_RX_THR_EVENT_INT_RAW25R/W0Канал 5 принял RX_LIM символов
CH4_RX_THR_EVENT_INT_RAW24R/W0Канал 4 принял RX_LIM символов
CH7_ERR_INT_RAW23R/W0Канал 7: ошибка доступа к памяти RMT
CH6_ERR_INT_RAW22R/W0Канал 6: ошибка доступа к памяти RMT
CH5_ERR_INT_RAW21R/W0Канал 5: ошибка доступа к памяти RMT
CH4_ERR_INT_RAW20R/W0Канал 4: ошибка доступа к памяти RMT
CH7_RX_END_INT_RAW19R/W0Канал 7 закончил приём
CH6_RX_END_INT_RAW18R/W0Канал 6 закончил приём
CH5_RX_END_INT_RAW17R/W0Канал 5 закончил приём
CH4_RX_END_INT_RAW16R/W0Канал 4 закончил приём
CH3_TX_LOOP_INT_RAW15R/W0Канал 3 выполнил TX_LOOP_NUM_CH3 циклов передачи
CH2_TX_LOOP_INT_RAW14R/W0Канал 2 выполнил TX_LOOP_NUM_CH2 циклов передачи
CH1_TX_LOOP_INT_RAW13R/W0Канал 1 выполнил TX_LOOP_NUM_CH1 циклов передачи
CH0_TX_LOOP_INT_RAW12R/W0Канал 0 выполнил TX_LOOP_NUM_CH0 циклов передачи
CH3_TX_THR_EVENT_INT_RAW11R/W0Канал 3 передал TX_LIM_CH3 символов
CH2_TX_THR_EVENT_INT_RAW10R/W0Канал 2 передал TX_LIM_CH2 символов
CH1_TX_THR_EVENT_INT_RAW9R/W0Канал 1 передал TX_LIM_CH1 символов
CH0_TX_THR_EVENT_INT_RAW8R/W0Канал 0 передал TX_LIM_CH0 символов
CH3_ERR_INT_RAW7R/W0Канал 3: ошибка доступа к памяти RMT
CH2_ERR_INT_RAW6R/W0Канал 2: ошибка доступа к памяти RMT
CH1_ERR_INT_RAW5R/W0Канал 1: ошибка доступа к памяти RMT
CH0_ERR_INT_RAW4R/W0Канал 0: ошибка доступа к памяти RMT
CH3_TX_END_INT_RAW3R/W0Канал 3 закончил передачу
CH2_TX_END_INT_RAW2R/W0Канал 2 закончил передачу
CH1_TX_END_INT_RAW1R/W0Канал 1 закончил передачу
CH0_TX_END_INT_RAW0R/W0Канал 0 закончил передачу

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

Смещение 0x0074, адрес 0x6001 6074, после сброса 0x0000 0000. TRM: регистр 37.12.

ПолеБитыДоступСбросНазначение
CH7_DMA_ACCESS_FAIL_INT_ST29RO0Канал 7: приём продолжается, хотя GDMA не забрал заполненную память
CH3_DMA_ACCESS_FAIL_INT_ST28RO0Канал 3: GDMA пишет в память, которая уже заполнена непереданными символами
CH7_RX_THR_EVENT_INT_ST27RO0Канал 7 принял RX_LIM символов
CH6_RX_THR_EVENT_INT_ST26RO0Канал 6 принял RX_LIM символов
CH5_RX_THR_EVENT_INT_ST25RO0Канал 5 принял RX_LIM символов
CH4_RX_THR_EVENT_INT_ST24RO0Канал 4 принял RX_LIM символов
CH7_ERR_INT_ST23RO0Канал 7: ошибка доступа к памяти RMT
CH6_ERR_INT_ST22RO0Канал 6: ошибка доступа к памяти RMT
CH5_ERR_INT_ST21RO0Канал 5: ошибка доступа к памяти RMT
CH4_ERR_INT_ST20RO0Канал 4: ошибка доступа к памяти RMT
CH7_RX_END_INT_ST19RO0Канал 7 закончил приём
CH6_RX_END_INT_ST18RO0Канал 6 закончил приём
CH5_RX_END_INT_ST17RO0Канал 5 закончил приём
CH4_RX_END_INT_ST16RO0Канал 4 закончил приём
CH3_TX_LOOP_INT_ST15RO0Канал 3 выполнил TX_LOOP_NUM_CH3 циклов передачи
CH2_TX_LOOP_INT_ST14RO0Канал 2 выполнил TX_LOOP_NUM_CH2 циклов передачи
CH1_TX_LOOP_INT_ST13RO0Канал 1 выполнил TX_LOOP_NUM_CH1 циклов передачи
CH0_TX_LOOP_INT_ST12RO0Канал 0 выполнил TX_LOOP_NUM_CH0 циклов передачи
CH3_TX_THR_EVENT_INT_ST11RO0Канал 3 передал TX_LIM_CH3 символов
CH2_TX_THR_EVENT_INT_ST10RO0Канал 2 передал TX_LIM_CH2 символов
CH1_TX_THR_EVENT_INT_ST9RO0Канал 1 передал TX_LIM_CH1 символов
CH0_TX_THR_EVENT_INT_ST8RO0Канал 0 передал TX_LIM_CH0 символов
CH3_ERR_INT_ST7RO0Канал 3: ошибка доступа к памяти RMT
CH2_ERR_INT_ST6RO0Канал 2: ошибка доступа к памяти RMT
CH1_ERR_INT_ST5RO0Канал 1: ошибка доступа к памяти RMT
CH0_ERR_INT_ST4RO0Канал 0: ошибка доступа к памяти RMT
CH3_TX_END_INT_ST3RO0Канал 3 закончил передачу
CH2_TX_END_INT_ST2RO0Канал 2 закончил передачу
CH1_TX_END_INT_ST1RO0Канал 1 закончил передачу
CH0_TX_END_INT_ST0RO0Канал 0 закончил передачу

RMT_INT_ENA_REG — разрешение прерываний

Смещение 0x0078, адрес 0x6001 6078, после сброса 0x0000 0000. TRM: регистр 37.13.

ПолеБитыДоступСбросНазначение
CH7_DMA_ACCESS_FAIL_INT_ENA29R/W0Канал 7: приём продолжается, хотя GDMA не забрал заполненную память
CH3_DMA_ACCESS_FAIL_INT_ENA28R/W0Канал 3: GDMA пишет в память, которая уже заполнена непереданными символами
CH7_RX_THR_EVENT_INT_ENA27R/W0Канал 7 принял RX_LIM символов
CH6_RX_THR_EVENT_INT_ENA26R/W0Канал 6 принял RX_LIM символов
CH5_RX_THR_EVENT_INT_ENA25R/W0Канал 5 принял RX_LIM символов
CH4_RX_THR_EVENT_INT_ENA24R/W0Канал 4 принял RX_LIM символов
CH7_ERR_INT_ENA23R/W0Канал 7: ошибка доступа к памяти RMT
CH6_ERR_INT_ENA22R/W0Канал 6: ошибка доступа к памяти RMT
CH5_ERR_INT_ENA21R/W0Канал 5: ошибка доступа к памяти RMT
CH4_ERR_INT_ENA20R/W0Канал 4: ошибка доступа к памяти RMT
CH7_RX_END_INT_ENA19R/W0Канал 7 закончил приём
CH6_RX_END_INT_ENA18R/W0Канал 6 закончил приём
CH5_RX_END_INT_ENA17R/W0Канал 5 закончил приём
CH4_RX_END_INT_ENA16R/W0Канал 4 закончил приём
CH3_TX_LOOP_INT_ENA15R/W0Канал 3 выполнил TX_LOOP_NUM_CH3 циклов передачи
CH2_TX_LOOP_INT_ENA14R/W0Канал 2 выполнил TX_LOOP_NUM_CH2 циклов передачи
CH1_TX_LOOP_INT_ENA13R/W0Канал 1 выполнил TX_LOOP_NUM_CH1 циклов передачи
CH0_TX_LOOP_INT_ENA12R/W0Канал 0 выполнил TX_LOOP_NUM_CH0 циклов передачи
CH3_TX_THR_EVENT_INT_ENA11R/W0Канал 3 передал TX_LIM_CH3 символов
CH2_TX_THR_EVENT_INT_ENA10R/W0Канал 2 передал TX_LIM_CH2 символов
CH1_TX_THR_EVENT_INT_ENA9R/W0Канал 1 передал TX_LIM_CH1 символов
CH0_TX_THR_EVENT_INT_ENA8R/W0Канал 0 передал TX_LIM_CH0 символов
CH3_ERR_INT_ENA7R/W0Канал 3: ошибка доступа к памяти RMT
CH2_ERR_INT_ENA6R/W0Канал 2: ошибка доступа к памяти RMT
CH1_ERR_INT_ENA5R/W0Канал 1: ошибка доступа к памяти RMT
CH0_ERR_INT_ENA4R/W0Канал 0: ошибка доступа к памяти RMT
CH3_TX_END_INT_ENA3R/W0Канал 3 закончил передачу
CH2_TX_END_INT_ENA2R/W0Канал 2 закончил передачу
CH1_TX_END_INT_ENA1R/W0Канал 1 закончил передачу
CH0_TX_END_INT_ENA0R/W0Канал 0 закончил передачу

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

Смещение 0x007C, адрес 0x6001 607C, после сброса 0x0000 0000. TRM: регистр 37.14.

ПолеБитыДоступСбросНазначение
CH7_DMA_ACCESS_FAIL_INT_CLR29WT0Канал 7: приём продолжается, хотя GDMA не забрал заполненную память
CH3_DMA_ACCESS_FAIL_INT_CLR28WT0Канал 3: GDMA пишет в память, которая уже заполнена непереданными символами
CH7_RX_THR_EVENT_INT_CLR27WO0Канал 7 принял RX_LIM символов
CH6_RX_THR_EVENT_INT_CLR26WO0Канал 6 принял RX_LIM символов
CH5_RX_THR_EVENT_INT_CLR25WO0Канал 5 принял RX_LIM символов
CH4_RX_THR_EVENT_INT_CLR24WO0Канал 4 принял RX_LIM символов
CH7_ERR_INT_CLR23WO0Канал 7: ошибка доступа к памяти RMT
CH6_ERR_INT_CLR22WO0Канал 6: ошибка доступа к памяти RMT
CH5_ERR_INT_CLR21WO0Канал 5: ошибка доступа к памяти RMT
CH4_ERR_INT_CLR20WO0Канал 4: ошибка доступа к памяти RMT
CH7_RX_END_INT_CLR19WO0Канал 7 закончил приём
CH6_RX_END_INT_CLR18WO0Канал 6 закончил приём
CH5_RX_END_INT_CLR17WO0Канал 5 закончил приём
CH4_RX_END_INT_CLR16WO0Канал 4 закончил приём
CH3_TX_LOOP_INT_CLR15WO0Канал 3 выполнил TX_LOOP_NUM_CH3 циклов передачи
CH2_TX_LOOP_INT_CLR14WO0Канал 2 выполнил TX_LOOP_NUM_CH2 циклов передачи
CH1_TX_LOOP_INT_CLR13WO0Канал 1 выполнил TX_LOOP_NUM_CH1 циклов передачи
CH0_TX_LOOP_INT_CLR12WO0Канал 0 выполнил TX_LOOP_NUM_CH0 циклов передачи
CH3_TX_THR_EVENT_INT_CLR11WO0Канал 3 передал TX_LIM_CH3 символов
CH2_TX_THR_EVENT_INT_CLR10WO0Канал 2 передал TX_LIM_CH2 символов
CH1_TX_THR_EVENT_INT_CLR9WO0Канал 1 передал TX_LIM_CH1 символов
CH0_TX_THR_EVENT_INT_CLR8WO0Канал 0 передал TX_LIM_CH0 символов
CH3_ERR_INT_CLR7WO0Канал 3: ошибка доступа к памяти RMT
CH2_ERR_INT_CLR6WO0Канал 2: ошибка доступа к памяти RMT
CH1_ERR_INT_CLR5WO0Канал 1: ошибка доступа к памяти RMT
CH0_ERR_INT_CLR4WO0Канал 0: ошибка доступа к памяти RMT
CH3_TX_END_INT_CLR3WO0Канал 3 закончил передачу
CH2_TX_END_INT_CLR2WO0Канал 2 закончил передачу
CH1_TX_END_INT_CLR1WO0Канал 1 закончил передачу
CH0_TX_END_INT_CLR0WO0Канал 0 закончил передачу

RMT_CHnCARRIER_DUTY_REG — канал передачи n: длительности уровней несущей

4 копии, n = 0…3: смещение 0x0080 + n · 0x0004, после сброса 0x0040 0040. TRM: регистр 37.15.

31302928272625242322212019181716
CARRIER_HIGH_CHn
1514131211109876543210
CARRIER_LOW_CHn
ПолеБитыДоступСбросНазначение
CARRIER_HIGH_CHn31:16R/W0x0040Высокий уровень несущей: по TRM CARRIER_HIGH_CHn + 1 тактов RMT_SCLK; ESP-IDF пишет число тактов без поправки, 0 — 65 536
CARRIER_LOW_CHn15:0R/W0x0040Низкий уровень несущей, счёт как у CARRIER_HIGH_CHn

RMT_CHn_RX_CARRIER_RM_REG — канал приёма n: удаление несущей

4 копии, n = 4…7: смещение 0x0080 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 37.6.

31302928272625242322212019181716
CARRIER_HIGH_THRES_CHn
1514131211109876543210
CARRIER_LOW_THRES_CHn
ПолеБитыДоступСбросНазначение
CARRIER_HIGH_THRES_CHn31:16R/W0x0000Высокий уровень удаляемой несущей: значение + 1 тактов
CARRIER_LOW_THRES_CHn15:0R/W0x0000Низкий уровень удаляемой несущей: значение + 1 тактов

RMT_CHn_TX_LIM_REG — канал передачи n: порог и число повторов

4 копии, n = 0…3: смещение 0x00A0 + n · 0x0004, после сброса 0x0000 0080. TRM: регистр 37.16.

31302928272625242322212019181716
—LOOP_STOP_EN_CHnLOOP_COUNT_RESET_CHnTX_LOOP_CNT_EN_CHnTX_LOOP_NUM_CHn
1514131211109876543210
TX_LOOP_NUM_CHnTX_LIM_CHn
ПолеБитыДоступСбросНазначение
LOOP_STOP_EN_CHn21R/W01 — остановить непрерывную передачу, когда счёт повторов дошёл до TX_LOOP_NUM
LOOP_COUNT_RESET_CHn20WT0Запись 1 сбрасывает счётчик повторов
TX_LOOP_CNT_EN_CHn19R/W01 — считать повторы
TX_LOOP_NUM_CHn18:9R/W0x000Число повторов в непрерывном режиме
TX_LIM_CHn8:0R/W0x080Порог прерывания TX_THR_EVENT в символах

RMT_CHn_RX_LIM_REG — канал приёма n: порог прерывания

4 копии, n = 4…7: смещение 0x00A0 + n · 0x0004, после сброса 0x0000 0080. TRM: регистр 37.18.

ПолеБитыДоступСбросНазначение
RX_LIM8:0R/W0x080Порог прерывания RX_THR_EVENT в символах (RMT_RX_LIM_CHm в TRM)

RMT_SYS_CONF_REG — общий такт RMT_SCLK, питание и доступ к памяти

Смещение 0x00C0, адрес 0x6001 60C0, после сброса 0x0500 0010. TRM: регистр 37.7.

31302928272625242322212019181716
CLK_EN—SCLK_ACTIVESCLK_SELSCLK_DIV_BSCLK_DIV_A
1514131211109876543210
SCLK_DIV_ASCLK_DIV_NUMMEM_FORCE_PUMEM_FORCE_PDMEM_CLK_FORCE_ONAPB_FIFO_MASK
ПолеБитыДоступСбросНазначение
CLK_EN31R/W01 — такт регистров включён
SCLK_ACTIVE26R/W11 — включить RMT_SCLK
SCLK_SEL25:24R/W0x1Источник RMT_SCLK: 1 — APB_CLK, 2 — RC_FAST_CLK, 3 — XTAL_CLK
SCLK_DIV_B23:18R/W0x00Знаменатель дробной части делителя
SCLK_DIV_A17:12R/W0x00Числитель дробной части делителя
SCLK_DIV_NUM11:4R/W0x01Целая часть делителя минус 1: делитель = SCLK_DIV_NUM + 1 + A / B
MEM_FORCE_PU3R/W01 — не выключать память RMT в лёгком сне
MEM_FORCE_PD2R/W01 — выключить память RMT
MEM_CLK_FORCE_ON1R/W01 — такт памяти включён
APB_FIFO_MASK0R/W0Доступ к памяти: 1 — напрямую по адресам, 0 — через FIFO CHnDATA

RMT_TX_SIM_REG — одновременный запуск каналов передачи

Смещение 0x00C4, адрес 0x6001 60C4, после сброса 0x0000 0000. TRM: регистр 37.17.

1514131211109876543210
—TX_SIM_ENTX_SIM_CH3TX_SIM_CH2TX_SIM_CH1TX_SIM_CH0
ПолеБитыДоступСбросНазначение
TX_SIM_EN4R/W01 — одновременный запуск выбранных каналов передачи
TX_SIM_CH33R/W01 — канал 3 участвует в одновременном запуске
TX_SIM_CH22R/W01 — канал 2 участвует в одновременном запуске
TX_SIM_CH11R/W01 — канал 1 участвует в одновременном запуске
TX_SIM_CH00R/W01 — канал 0 участвует в одновременном запуске

RMT_REF_CNT_RST_REG — сброс делителей каналов

Смещение 0x00C8, адрес 0x6001 60C8, после сброса 0x0000 0000. TRM: регистр 37.8.

1514131211109876543210
—REF_CNT_RST_CH7REF_CNT_RST_CH6REF_CNT_RST_CH5REF_CNT_RST_CH4REF_CNT_RST_CH3REF_CNT_RST_CH2REF_CNT_RST_CH1REF_CNT_RST_CH0
ПолеБитыДоступСброс
REF_CNT_RST_CH77WO0
REF_CNT_RST_CH66WO0
REF_CNT_RST_CH55WO0
REF_CNT_RST_CH44WO0
REF_CNT_RST_CH33WO0
REF_CNT_RST_CH22WO0
REF_CNT_RST_CH11WO0
REF_CNT_RST_CH00WO0

RMT_DATE_REG — версия блока: дата ревизии аппаратуры

Смещение 0x00CC, адрес 0x6001 60CC, после сброса 0x0210 1181. TRM: регистр 37.19.

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

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

Сколько каналов RMT у ESP32-S3 и чем они отличаются от ESP32-C3?

Восемь: каналы 0…3 только передают, 4…7 только принимают, у ESP32-C3 — по два. Память — 384 слова по 32 бита, по блоку из 48 слов на канал. Каналы 3 и 7 работают с GDMA (биты DMA_ACCESS_EN_CH3 и DMA_ACCESS_EN_CH7), поэтому длинные последовательности для WS2812 и ИК можно передавать и принимать через GDMA.

Как задать несущую 38 кГц для ИК-пульта на RMT ESP32-S3?

Записать длительности высокого и низкого уровней несущей в RMT_CHnCARRIER_DUTY_REG и включить CARRIER_EN_CHn в RMT_CHnCONF0_REG. По TRM высокий уровень длится CARRIER_HIGH_CHn + 1 тактов RMT_SCLK, низкий — CARRIER_LOW_CHn + 1; драйвер ESP-IDF (rmt_ll.h) пишет число тактов без вычитания единицы, а 0 у него означает 65 536. При RMT_SCLK 80 МГц значения 698 и 1407 дают около 38 кГц и скважность около 33 % в обоих прочтениях.

Источники

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

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