Регистры RMT ESP32-S3
Регистры RMT ESP32-S3: восемь каналов — 0…3 передают, 4…7 принимают — с памятью по 48 слов, общий дробный делитель и делитель каждого канала, модуляция несущей, пороги для потоковой передачи, повторы, фильтр приёма и DMA для каналов 3 и 7.
Содержание
- Пример на C
- Регистры блока
- RMT_CHnDATA_REG
- RMT_CHnCONF0_REG
- RMT_CHnCONF0_REG
- RMT_CHnCONF1_REG
- RMT_CHnSTATUS_REG
- RMT_CHnSTATUS_REG
- RMT_INT_RAW_REG
- RMT_INT_ST_REG
- RMT_INT_ENA_REG
- RMT_INT_CLR_REG
- RMT_CHnCARRIER_DUTY_REG
- RMT_CHn_RX_CARRIER_RM_REG
- RMT_CHn_TX_LIM_REG
- RMT_CHn_RX_LIM_REG
- RMT_SYS_CONF_REG
- RMT_TX_SIM_REG
- RMT_REF_CNT_RST_REG
- RMT_DATE_REG
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.
| Экземпляр | Базовый адрес |
|---|---|
| RMT | 0x6001 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_REG | 0x0000 + n · 0x0004 | Канал n: доступ к памяти символов через FIFO | 0x0000 0000 |
| RMT_CHnCONF0_REG | 0x0020 + n · 0x0004 | Канал передачи n: запуск, делитель, несущая, память | 0x0071 0200 |
| RMT_CHnCONF0_REG | 0x0010 + n · 0x0008 | Канал приёма n: делитель, порог тишины, несущая, память | 0x317F FF02 |
| RMT_CHnCONF1_REG | 0x0014 + n · 0x0008 | Канал приёма n: запуск, фильтр, владелец памяти | 0x0000 01E8 |
| RMT_CHnSTATUS_REG | 0x0050 + n · 0x0004 | Канал передачи n: состояние и адреса памяти | 0x0000 0000 |
| RMT_CHnSTATUS_REG | 0x0050 + n · 0x0004 | Канал приёма n: состояние и адреса памяти | 0x0006 00C0 |
| RMT_INT_RAW_REG | 0x0070 | Необработанные флаги прерываний | 0x0000 0000 |
| RMT_INT_ST_REG | 0x0074 | Флаги прерываний после маски разрешения | 0x0000 0000 |
| RMT_INT_ENA_REG | 0x0078 | Разрешение прерываний | 0x0000 0000 |
| RMT_INT_CLR_REG | 0x007C | Сброс флагов прерываний записью 1 | 0x0000 0000 |
| RMT_CHnCARRIER_DUTY_REG | 0x0080 + n · 0x0004 | Канал передачи n: длительности уровней несущей | 0x0040 0040 |
| RMT_CHn_RX_CARRIER_RM_REG | 0x0080 + n · 0x0004 | Канал приёма n: удаление несущей | 0x0000 0000 |
| RMT_CHn_TX_LIM_REG | 0x00A0 + n · 0x0004 | Канал передачи n: порог и число повторов | 0x0000 0080 |
| RMT_CHn_RX_LIM_REG | 0x00A0 + n · 0x0004 | Канал приёма n: порог прерывания | 0x0000 0080 |
| RMT_SYS_CONF_REG | 0x00C0 | Общий такт RMT_SCLK, питание и доступ к памяти | 0x0500 0010 |
| RMT_TX_SIM_REG | 0x00C4 | Одновременный запуск каналов передачи | 0x0000 0000 |
| RMT_REF_CNT_RST_REG | 0x00C8 | Сброс делителей каналов | 0x0000 0000 |
| RMT_DATE_REG | 0x00CC | Версия блока: дата ревизии аппаратуры | 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.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CHnDATA | 31:0 | RO | 0x0000 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 считает зарезервированным.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | DMA_ACCESS_EN_CH3 | CONF_UPDATE_CHn | — | CARRIER_OUT_LV_CHn | CARRIER_EN_CHn | CARRIER_EFF_EN_CHn | MEM_SIZE_CHn | ||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| DIV_CNT_CHn | TX_STOP_CHn | IDLE_OUT_EN_CHn | IDLE_OUT_LV_CHn | MEM_TX_WRAP_EN_CHn | TX_CONTI_MODE_CHn | APB_MEM_RST_CHn | MEM_RD_RST_CHn | TX_START_CHn | |||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| DMA_ACCESS_EN_CH3 | 25 | R/W | 0 | Только у канала 3 (у каналов 0…2 зарезервировано): разрешение доступа DMA |
| CONF_UPDATE_CHn | 24 | WT | 0 | Запись 1 применяет настройки канала |
| CARRIER_OUT_LV_CHn | 22 | R/W | 1 | Несущая накладывается: 1 — на высокий уровень, 0 — на низкий |
| CARRIER_EN_CHn | 21 | R/W | 1 | 1 — модуляция несущей |
| CARRIER_EFF_EN_CHn | 20 | R/W | 1 | 1 — несущая только при передаче данных, 0 — и в покое |
| MEM_SIZE_CHn | 19:16 | R/W | 0x1 | Число блоков памяти по 48 слов; не больше 8 − n |
| DIV_CNT_CHn | 15:8 | R/W | 0x02 | Делитель такта канала 1…255; 0 означает 256 |
| TX_STOP_CHn | 7 | R/W/SC | 0 | 1 — остановить передачу |
| IDLE_OUT_EN_CHn | 6 | R/W | 0 | Уровень в покое: 1 — из IDLE_OUT_LV, 0 — из маркера конца |
| IDLE_OUT_LV_CHn | 5 | R/W | 0 | Уровень выхода в покое |
| MEM_TX_WRAP_EN_CHn | 4 | R/W | 0 | 1 — кольцевая передача для данных длиннее блока |
| TX_CONTI_MODE_CHn | 3 | R/W | 0 | 1 — непрерывная передача: после конца — снова с начала |
| APB_MEM_RST_CHn | 2 | WT | 0 | Запись 1 сбрасывает адрес доступа по APB в режиме FIFO |
| MEM_RD_RST_CHn | 1 | WT | 0 | Запись 1 сбрасывает адрес чтения передатчика |
| TX_START_CHn | 0 | WT | 0 | Запись 1 запускает передачу |
RMT_CHnCONF0_REG — канал приёма n: делитель, порог тишины, несущая, память
4 копии, n = 4…7: смещение 0x0010 + n · 0x0008, после сброса 0x317F FF02. TRM: регистр 37.4 (RMT_CHmCONF0_REG).
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | CARRIER_OUT_LV_CHn | CARRIER_EN_CHn | MEM_SIZE_CHn | DMA_ACCESS_EN_CH7 | IDLE_THRES_CHn | ||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| IDLE_THRES_CHn | DIV_CNT_CHn | ||||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CARRIER_OUT_LV_CHn | 29 | R/W | 1 | Несущая удаляется: 1 — с высокого уровня, 0 — с низкого |
| CARRIER_EN_CHn | 28 | R/W | 1 | 1 — демодуляция несущей |
| MEM_SIZE_CHn | 27:24 | R/W | 0x1 | Число блоков памяти по 48 слов; не больше 8 − m |
| DMA_ACCESS_EN_CH7 | 23 | R/W | 0 | Только у канала 7 (у каналов 4…6 зарезервировано): 1 — данные приёма идут в GDMA |
| IDLE_THRES_CHn | 22:8 | R/W | 0x7FFF | Без перепадов дольше стольких тактов канала — конец приёма |
| DIV_CNT_CHn | 7:0 | R/W | 0x02 | Делитель такта канала 1…255; 0 означает 256 |
RMT_CHnCONF1_REG — канал приёма n: запуск, фильтр, владелец памяти
4 копии, n = 4…7: смещение 0x0014 + n · 0x0008, после сброса 0x0000 01E8. TRM: регистр 37.5 (RMT_CHmCONF1_REG).
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| CONF_UPDATE_CHn | — | MEM_RX_WRAP_EN_CHn | RX_FILTER_THRES_CHn | RX_FILTER_EN_CHn | MEM_OWNER_CHn | APB_MEM_RST_CHn | MEM_WR_RST_CHn | RX_EN_CHn | |||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CONF_UPDATE_CHn | 15 | WT | 0 | Запись 1 применяет настройки канала |
| MEM_RX_WRAP_EN_CHn | 13 | R/W | 0 | 1 — кольцевой приём для данных длиннее блока |
| RX_FILTER_THRES_CHn | 12:5 | R/W | 0x0F | Импульсы короче стольких тактов RMT_SCLK отбрасываются |
| RX_FILTER_EN_CHn | 4 | R/W | 0 | 1 — фильтр приёмника |
| MEM_OWNER_CHn | 3 | R/W | 1 | Владелец памяти: 1 — приёмник, 0 — шина APB |
| APB_MEM_RST_CHn | 2 | WT | 0 | Запись 1 сбрасывает адрес доступа по APB в режиме FIFO |
| MEM_WR_RST_CHn | 1 | WT | 0 | Запись 1 сбрасывает адрес записи приёмника |
| RX_EN_CHn | 0 | R/W | 0 | 1 — приём включён |
RMT_CHnSTATUS_REG — канал передачи n: состояние и адреса памяти
4 копии, n = 0…3: смещение 0x0050 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 37.9 (RMT_CHnSTATUS_REG).
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | APB_MEM_WR_ERR_CHn | MEM_EMPTY_CHn | STATE_CHn | — | APB_MEM_WADDR_CHn | ||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| APB_MEM_WADDR_CHn | — | MEM_RADDR_EX_CHn | |||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| APB_MEM_WR_ERR_CHn | 26 | RO | 0 | Запись по APB вышла за пределы памяти канала |
| MEM_EMPTY_CHn | 25 | RO | 0 | Данные длиннее памяти, а кольцевой режим выключен |
| STATE_CHn | 24:22 | RO | 0x0 | Состояние автомата канала |
| APB_MEM_WADDR_CHn | 20:11 | RO | 0x000 | Смещение записи по APB |
| MEM_RADDR_EX_CHn | 9:0 | RO | 0x000 | Смещение чтения передатчика |
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.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | APB_MEM_RD_ERR_CHn | MEM_FULL_CHn | MEM_OWNER_ERR_CHn | STATE_CHn | — | APB_MEM_RADDR_CHn | |||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| APB_MEM_RADDR_CHn | — | MEM_WADDR_EX_CHn | |||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| APB_MEM_RD_ERR_CHn | 27 | RO | 0 | Чтение по APB вышло за пределы памяти канала |
| MEM_FULL_CHn | 26 | RO | 0 | Принято больше данных, чем помещается в память |
| MEM_OWNER_ERR_CHn | 25 | RO | 0 | Нарушено владение блоком памяти |
| STATE_CHn | 24:22 | RO | 0x0 | Состояние автомата канала |
| APB_MEM_RADDR_CHn | 20:11 | RO | 0x0C0 | Смещение чтения по APB |
| MEM_WADDR_EX_CHn | 9:0 | RO | 0x0C0 | Смещение записи приёмника |
RMT_INT_RAW_REG — необработанные флаги прерываний
Смещение 0x0070, адрес 0x6001 6070, после сброса 0x0000 0000. TRM: регистр 37.11.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CH7_DMA_ACCESS_FAIL_INT_RAW | 29 | R/WTC/SS | 0 | Канал 7: приём продолжается, хотя GDMA не забрал заполненную память |
| CH3_DMA_ACCESS_FAIL_INT_RAW | 28 | R/WTC/SS | 0 | Канал 3: GDMA пишет в память, которая уже заполнена непереданными символами |
| CH7_RX_THR_EVENT_INT_RAW | 27 | R/W | 0 | Канал 7 принял RX_LIM символов |
| CH6_RX_THR_EVENT_INT_RAW | 26 | R/W | 0 | Канал 6 принял RX_LIM символов |
| CH5_RX_THR_EVENT_INT_RAW | 25 | R/W | 0 | Канал 5 принял RX_LIM символов |
| CH4_RX_THR_EVENT_INT_RAW | 24 | R/W | 0 | Канал 4 принял RX_LIM символов |
| CH7_ERR_INT_RAW | 23 | R/W | 0 | Канал 7: ошибка доступа к памяти RMT |
| CH6_ERR_INT_RAW | 22 | R/W | 0 | Канал 6: ошибка доступа к памяти RMT |
| CH5_ERR_INT_RAW | 21 | R/W | 0 | Канал 5: ошибка доступа к памяти RMT |
| CH4_ERR_INT_RAW | 20 | R/W | 0 | Канал 4: ошибка доступа к памяти RMT |
| CH7_RX_END_INT_RAW | 19 | R/W | 0 | Канал 7 закончил приём |
| CH6_RX_END_INT_RAW | 18 | R/W | 0 | Канал 6 закончил приём |
| CH5_RX_END_INT_RAW | 17 | R/W | 0 | Канал 5 закончил приём |
| CH4_RX_END_INT_RAW | 16 | R/W | 0 | Канал 4 закончил приём |
| CH3_TX_LOOP_INT_RAW | 15 | R/W | 0 | Канал 3 выполнил TX_LOOP_NUM_CH3 циклов передачи |
| CH2_TX_LOOP_INT_RAW | 14 | R/W | 0 | Канал 2 выполнил TX_LOOP_NUM_CH2 циклов передачи |
| CH1_TX_LOOP_INT_RAW | 13 | R/W | 0 | Канал 1 выполнил TX_LOOP_NUM_CH1 циклов передачи |
| CH0_TX_LOOP_INT_RAW | 12 | R/W | 0 | Канал 0 выполнил TX_LOOP_NUM_CH0 циклов передачи |
| CH3_TX_THR_EVENT_INT_RAW | 11 | R/W | 0 | Канал 3 передал TX_LIM_CH3 символов |
| CH2_TX_THR_EVENT_INT_RAW | 10 | R/W | 0 | Канал 2 передал TX_LIM_CH2 символов |
| CH1_TX_THR_EVENT_INT_RAW | 9 | R/W | 0 | Канал 1 передал TX_LIM_CH1 символов |
| CH0_TX_THR_EVENT_INT_RAW | 8 | R/W | 0 | Канал 0 передал TX_LIM_CH0 символов |
| CH3_ERR_INT_RAW | 7 | R/W | 0 | Канал 3: ошибка доступа к памяти RMT |
| CH2_ERR_INT_RAW | 6 | R/W | 0 | Канал 2: ошибка доступа к памяти RMT |
| CH1_ERR_INT_RAW | 5 | R/W | 0 | Канал 1: ошибка доступа к памяти RMT |
| CH0_ERR_INT_RAW | 4 | R/W | 0 | Канал 0: ошибка доступа к памяти RMT |
| CH3_TX_END_INT_RAW | 3 | R/W | 0 | Канал 3 закончил передачу |
| CH2_TX_END_INT_RAW | 2 | R/W | 0 | Канал 2 закончил передачу |
| CH1_TX_END_INT_RAW | 1 | R/W | 0 | Канал 1 закончил передачу |
| CH0_TX_END_INT_RAW | 0 | R/W | 0 | Канал 0 закончил передачу |
RMT_INT_ST_REG — флаги прерываний после маски разрешения
Смещение 0x0074, адрес 0x6001 6074, после сброса 0x0000 0000. TRM: регистр 37.12.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CH7_DMA_ACCESS_FAIL_INT_ST | 29 | RO | 0 | Канал 7: приём продолжается, хотя GDMA не забрал заполненную память |
| CH3_DMA_ACCESS_FAIL_INT_ST | 28 | RO | 0 | Канал 3: GDMA пишет в память, которая уже заполнена непереданными символами |
| CH7_RX_THR_EVENT_INT_ST | 27 | RO | 0 | Канал 7 принял RX_LIM символов |
| CH6_RX_THR_EVENT_INT_ST | 26 | RO | 0 | Канал 6 принял RX_LIM символов |
| CH5_RX_THR_EVENT_INT_ST | 25 | RO | 0 | Канал 5 принял RX_LIM символов |
| CH4_RX_THR_EVENT_INT_ST | 24 | RO | 0 | Канал 4 принял RX_LIM символов |
| CH7_ERR_INT_ST | 23 | RO | 0 | Канал 7: ошибка доступа к памяти RMT |
| CH6_ERR_INT_ST | 22 | RO | 0 | Канал 6: ошибка доступа к памяти RMT |
| CH5_ERR_INT_ST | 21 | RO | 0 | Канал 5: ошибка доступа к памяти RMT |
| CH4_ERR_INT_ST | 20 | RO | 0 | Канал 4: ошибка доступа к памяти RMT |
| CH7_RX_END_INT_ST | 19 | RO | 0 | Канал 7 закончил приём |
| CH6_RX_END_INT_ST | 18 | RO | 0 | Канал 6 закончил приём |
| CH5_RX_END_INT_ST | 17 | RO | 0 | Канал 5 закончил приём |
| CH4_RX_END_INT_ST | 16 | RO | 0 | Канал 4 закончил приём |
| CH3_TX_LOOP_INT_ST | 15 | RO | 0 | Канал 3 выполнил TX_LOOP_NUM_CH3 циклов передачи |
| CH2_TX_LOOP_INT_ST | 14 | RO | 0 | Канал 2 выполнил TX_LOOP_NUM_CH2 циклов передачи |
| CH1_TX_LOOP_INT_ST | 13 | RO | 0 | Канал 1 выполнил TX_LOOP_NUM_CH1 циклов передачи |
| CH0_TX_LOOP_INT_ST | 12 | RO | 0 | Канал 0 выполнил TX_LOOP_NUM_CH0 циклов передачи |
| CH3_TX_THR_EVENT_INT_ST | 11 | RO | 0 | Канал 3 передал TX_LIM_CH3 символов |
| CH2_TX_THR_EVENT_INT_ST | 10 | RO | 0 | Канал 2 передал TX_LIM_CH2 символов |
| CH1_TX_THR_EVENT_INT_ST | 9 | RO | 0 | Канал 1 передал TX_LIM_CH1 символов |
| CH0_TX_THR_EVENT_INT_ST | 8 | RO | 0 | Канал 0 передал TX_LIM_CH0 символов |
| CH3_ERR_INT_ST | 7 | RO | 0 | Канал 3: ошибка доступа к памяти RMT |
| CH2_ERR_INT_ST | 6 | RO | 0 | Канал 2: ошибка доступа к памяти RMT |
| CH1_ERR_INT_ST | 5 | RO | 0 | Канал 1: ошибка доступа к памяти RMT |
| CH0_ERR_INT_ST | 4 | RO | 0 | Канал 0: ошибка доступа к памяти RMT |
| CH3_TX_END_INT_ST | 3 | RO | 0 | Канал 3 закончил передачу |
| CH2_TX_END_INT_ST | 2 | RO | 0 | Канал 2 закончил передачу |
| CH1_TX_END_INT_ST | 1 | RO | 0 | Канал 1 закончил передачу |
| CH0_TX_END_INT_ST | 0 | RO | 0 | Канал 0 закончил передачу |
RMT_INT_ENA_REG — разрешение прерываний
Смещение 0x0078, адрес 0x6001 6078, после сброса 0x0000 0000. TRM: регистр 37.13.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CH7_DMA_ACCESS_FAIL_INT_ENA | 29 | R/W | 0 | Канал 7: приём продолжается, хотя GDMA не забрал заполненную память |
| CH3_DMA_ACCESS_FAIL_INT_ENA | 28 | R/W | 0 | Канал 3: GDMA пишет в память, которая уже заполнена непереданными символами |
| CH7_RX_THR_EVENT_INT_ENA | 27 | R/W | 0 | Канал 7 принял RX_LIM символов |
| CH6_RX_THR_EVENT_INT_ENA | 26 | R/W | 0 | Канал 6 принял RX_LIM символов |
| CH5_RX_THR_EVENT_INT_ENA | 25 | R/W | 0 | Канал 5 принял RX_LIM символов |
| CH4_RX_THR_EVENT_INT_ENA | 24 | R/W | 0 | Канал 4 принял RX_LIM символов |
| CH7_ERR_INT_ENA | 23 | R/W | 0 | Канал 7: ошибка доступа к памяти RMT |
| CH6_ERR_INT_ENA | 22 | R/W | 0 | Канал 6: ошибка доступа к памяти RMT |
| CH5_ERR_INT_ENA | 21 | R/W | 0 | Канал 5: ошибка доступа к памяти RMT |
| CH4_ERR_INT_ENA | 20 | R/W | 0 | Канал 4: ошибка доступа к памяти RMT |
| CH7_RX_END_INT_ENA | 19 | R/W | 0 | Канал 7 закончил приём |
| CH6_RX_END_INT_ENA | 18 | R/W | 0 | Канал 6 закончил приём |
| CH5_RX_END_INT_ENA | 17 | R/W | 0 | Канал 5 закончил приём |
| CH4_RX_END_INT_ENA | 16 | R/W | 0 | Канал 4 закончил приём |
| CH3_TX_LOOP_INT_ENA | 15 | R/W | 0 | Канал 3 выполнил TX_LOOP_NUM_CH3 циклов передачи |
| CH2_TX_LOOP_INT_ENA | 14 | R/W | 0 | Канал 2 выполнил TX_LOOP_NUM_CH2 циклов передачи |
| CH1_TX_LOOP_INT_ENA | 13 | R/W | 0 | Канал 1 выполнил TX_LOOP_NUM_CH1 циклов передачи |
| CH0_TX_LOOP_INT_ENA | 12 | R/W | 0 | Канал 0 выполнил TX_LOOP_NUM_CH0 циклов передачи |
| CH3_TX_THR_EVENT_INT_ENA | 11 | R/W | 0 | Канал 3 передал TX_LIM_CH3 символов |
| CH2_TX_THR_EVENT_INT_ENA | 10 | R/W | 0 | Канал 2 передал TX_LIM_CH2 символов |
| CH1_TX_THR_EVENT_INT_ENA | 9 | R/W | 0 | Канал 1 передал TX_LIM_CH1 символов |
| CH0_TX_THR_EVENT_INT_ENA | 8 | R/W | 0 | Канал 0 передал TX_LIM_CH0 символов |
| CH3_ERR_INT_ENA | 7 | R/W | 0 | Канал 3: ошибка доступа к памяти RMT |
| CH2_ERR_INT_ENA | 6 | R/W | 0 | Канал 2: ошибка доступа к памяти RMT |
| CH1_ERR_INT_ENA | 5 | R/W | 0 | Канал 1: ошибка доступа к памяти RMT |
| CH0_ERR_INT_ENA | 4 | R/W | 0 | Канал 0: ошибка доступа к памяти RMT |
| CH3_TX_END_INT_ENA | 3 | R/W | 0 | Канал 3 закончил передачу |
| CH2_TX_END_INT_ENA | 2 | R/W | 0 | Канал 2 закончил передачу |
| CH1_TX_END_INT_ENA | 1 | R/W | 0 | Канал 1 закончил передачу |
| CH0_TX_END_INT_ENA | 0 | R/W | 0 | Канал 0 закончил передачу |
RMT_INT_CLR_REG — сброс флагов прерываний записью 1
Смещение 0x007C, адрес 0x6001 607C, после сброса 0x0000 0000. TRM: регистр 37.14.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CH7_DMA_ACCESS_FAIL_INT_CLR | 29 | WT | 0 | Канал 7: приём продолжается, хотя GDMA не забрал заполненную память |
| CH3_DMA_ACCESS_FAIL_INT_CLR | 28 | WT | 0 | Канал 3: GDMA пишет в память, которая уже заполнена непереданными символами |
| CH7_RX_THR_EVENT_INT_CLR | 27 | WO | 0 | Канал 7 принял RX_LIM символов |
| CH6_RX_THR_EVENT_INT_CLR | 26 | WO | 0 | Канал 6 принял RX_LIM символов |
| CH5_RX_THR_EVENT_INT_CLR | 25 | WO | 0 | Канал 5 принял RX_LIM символов |
| CH4_RX_THR_EVENT_INT_CLR | 24 | WO | 0 | Канал 4 принял RX_LIM символов |
| CH7_ERR_INT_CLR | 23 | WO | 0 | Канал 7: ошибка доступа к памяти RMT |
| CH6_ERR_INT_CLR | 22 | WO | 0 | Канал 6: ошибка доступа к памяти RMT |
| CH5_ERR_INT_CLR | 21 | WO | 0 | Канал 5: ошибка доступа к памяти RMT |
| CH4_ERR_INT_CLR | 20 | WO | 0 | Канал 4: ошибка доступа к памяти RMT |
| CH7_RX_END_INT_CLR | 19 | WO | 0 | Канал 7 закончил приём |
| CH6_RX_END_INT_CLR | 18 | WO | 0 | Канал 6 закончил приём |
| CH5_RX_END_INT_CLR | 17 | WO | 0 | Канал 5 закончил приём |
| CH4_RX_END_INT_CLR | 16 | WO | 0 | Канал 4 закончил приём |
| CH3_TX_LOOP_INT_CLR | 15 | WO | 0 | Канал 3 выполнил TX_LOOP_NUM_CH3 циклов передачи |
| CH2_TX_LOOP_INT_CLR | 14 | WO | 0 | Канал 2 выполнил TX_LOOP_NUM_CH2 циклов передачи |
| CH1_TX_LOOP_INT_CLR | 13 | WO | 0 | Канал 1 выполнил TX_LOOP_NUM_CH1 циклов передачи |
| CH0_TX_LOOP_INT_CLR | 12 | WO | 0 | Канал 0 выполнил TX_LOOP_NUM_CH0 циклов передачи |
| CH3_TX_THR_EVENT_INT_CLR | 11 | WO | 0 | Канал 3 передал TX_LIM_CH3 символов |
| CH2_TX_THR_EVENT_INT_CLR | 10 | WO | 0 | Канал 2 передал TX_LIM_CH2 символов |
| CH1_TX_THR_EVENT_INT_CLR | 9 | WO | 0 | Канал 1 передал TX_LIM_CH1 символов |
| CH0_TX_THR_EVENT_INT_CLR | 8 | WO | 0 | Канал 0 передал TX_LIM_CH0 символов |
| CH3_ERR_INT_CLR | 7 | WO | 0 | Канал 3: ошибка доступа к памяти RMT |
| CH2_ERR_INT_CLR | 6 | WO | 0 | Канал 2: ошибка доступа к памяти RMT |
| CH1_ERR_INT_CLR | 5 | WO | 0 | Канал 1: ошибка доступа к памяти RMT |
| CH0_ERR_INT_CLR | 4 | WO | 0 | Канал 0: ошибка доступа к памяти RMT |
| CH3_TX_END_INT_CLR | 3 | WO | 0 | Канал 3 закончил передачу |
| CH2_TX_END_INT_CLR | 2 | WO | 0 | Канал 2 закончил передачу |
| CH1_TX_END_INT_CLR | 1 | WO | 0 | Канал 1 закончил передачу |
| CH0_TX_END_INT_CLR | 0 | WO | 0 | Канал 0 закончил передачу |
RMT_CHnCARRIER_DUTY_REG — канал передачи n: длительности уровней несущей
4 копии, n = 0…3: смещение 0x0080 + n · 0x0004, после сброса 0x0040 0040. TRM: регистр 37.15.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| CARRIER_HIGH_CHn | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| CARRIER_LOW_CHn | |||||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CARRIER_HIGH_CHn | 31:16 | R/W | 0x0040 | Высокий уровень несущей: по TRM CARRIER_HIGH_CHn + 1 тактов RMT_SCLK; ESP-IDF пишет число тактов без поправки, 0 — 65 536 |
| CARRIER_LOW_CHn | 15:0 | R/W | 0x0040 | Низкий уровень несущей, счёт как у CARRIER_HIGH_CHn |
RMT_CHn_RX_CARRIER_RM_REG — канал приёма n: удаление несущей
4 копии, n = 4…7: смещение 0x0080 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 37.6.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| CARRIER_HIGH_THRES_CHn | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| CARRIER_LOW_THRES_CHn | |||||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CARRIER_HIGH_THRES_CHn | 31:16 | R/W | 0x0000 | Высокий уровень удаляемой несущей: значение + 1 тактов |
| CARRIER_LOW_THRES_CHn | 15:0 | R/W | 0x0000 | Низкий уровень удаляемой несущей: значение + 1 тактов |
RMT_CHn_TX_LIM_REG — канал передачи n: порог и число повторов
4 копии, n = 0…3: смещение 0x00A0 + n · 0x0004, после сброса 0x0000 0080. TRM: регистр 37.16.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | LOOP_STOP_EN_CHn | LOOP_COUNT_RESET_CHn | TX_LOOP_CNT_EN_CHn | TX_LOOP_NUM_CHn | |||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TX_LOOP_NUM_CHn | TX_LIM_CHn | ||||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| LOOP_STOP_EN_CHn | 21 | R/W | 0 | 1 — остановить непрерывную передачу, когда счёт повторов дошёл до TX_LOOP_NUM |
| LOOP_COUNT_RESET_CHn | 20 | WT | 0 | Запись 1 сбрасывает счётчик повторов |
| TX_LOOP_CNT_EN_CHn | 19 | R/W | 0 | 1 — считать повторы |
| TX_LOOP_NUM_CHn | 18:9 | R/W | 0x000 | Число повторов в непрерывном режиме |
| TX_LIM_CHn | 8:0 | R/W | 0x080 | Порог прерывания TX_THR_EVENT в символах |
RMT_CHn_RX_LIM_REG — канал приёма n: порог прерывания
4 копии, n = 4…7: смещение 0x00A0 + n · 0x0004, после сброса 0x0000 0080. TRM: регистр 37.18.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| RX_LIM | 8:0 | R/W | 0x080 | Порог прерывания RX_THR_EVENT в символах (RMT_RX_LIM_CHm в TRM) |
RMT_SYS_CONF_REG — общий такт RMT_SCLK, питание и доступ к памяти
Смещение 0x00C0, адрес 0x6001 60C0, после сброса 0x0500 0010. TRM: регистр 37.7.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| CLK_EN | — | SCLK_ACTIVE | SCLK_SEL | SCLK_DIV_B | SCLK_DIV_A | ||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| SCLK_DIV_A | SCLK_DIV_NUM | MEM_FORCE_PU | MEM_FORCE_PD | MEM_CLK_FORCE_ON | APB_FIFO_MASK | ||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CLK_EN | 31 | R/W | 0 | 1 — такт регистров включён |
| SCLK_ACTIVE | 26 | R/W | 1 | 1 — включить RMT_SCLK |
| SCLK_SEL | 25:24 | R/W | 0x1 | Источник RMT_SCLK: 1 — APB_CLK, 2 — RC_FAST_CLK, 3 — XTAL_CLK |
| SCLK_DIV_B | 23:18 | R/W | 0x00 | Знаменатель дробной части делителя |
| SCLK_DIV_A | 17:12 | R/W | 0x00 | Числитель дробной части делителя |
| SCLK_DIV_NUM | 11:4 | R/W | 0x01 | Целая часть делителя минус 1: делитель = SCLK_DIV_NUM + 1 + A / B |
| MEM_FORCE_PU | 3 | R/W | 0 | 1 — не выключать память RMT в лёгком сне |
| MEM_FORCE_PD | 2 | R/W | 0 | 1 — выключить память RMT |
| MEM_CLK_FORCE_ON | 1 | R/W | 0 | 1 — такт памяти включён |
| APB_FIFO_MASK | 0 | R/W | 0 | Доступ к памяти: 1 — напрямую по адресам, 0 — через FIFO CHnDATA |
RMT_TX_SIM_REG — одновременный запуск каналов передачи
Смещение 0x00C4, адрес 0x6001 60C4, после сброса 0x0000 0000. TRM: регистр 37.17.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | TX_SIM_EN | TX_SIM_CH3 | TX_SIM_CH2 | TX_SIM_CH1 | TX_SIM_CH0 | ||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| TX_SIM_EN | 4 | R/W | 0 | 1 — одновременный запуск выбранных каналов передачи |
| TX_SIM_CH3 | 3 | R/W | 0 | 1 — канал 3 участвует в одновременном запуске |
| TX_SIM_CH2 | 2 | R/W | 0 | 1 — канал 2 участвует в одновременном запуске |
| TX_SIM_CH1 | 1 | R/W | 0 | 1 — канал 1 участвует в одновременном запуске |
| TX_SIM_CH0 | 0 | R/W | 0 | 1 — канал 0 участвует в одновременном запуске |
RMT_REF_CNT_RST_REG — сброс делителей каналов
Смещение 0x00C8, адрес 0x6001 60C8, после сброса 0x0000 0000. TRM: регистр 37.8.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | REF_CNT_RST_CH7 | REF_CNT_RST_CH6 | REF_CNT_RST_CH5 | REF_CNT_RST_CH4 | REF_CNT_RST_CH3 | REF_CNT_RST_CH2 | REF_CNT_RST_CH1 | REF_CNT_RST_CH0 | |||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| REF_CNT_RST_CH7 | 7 | WO | 0 |
| REF_CNT_RST_CH6 | 6 | WO | 0 |
| REF_CNT_RST_CH5 | 5 | WO | 0 |
| REF_CNT_RST_CH4 | 4 | WO | 0 |
| REF_CNT_RST_CH3 | 3 | WO | 0 |
| REF_CNT_RST_CH2 | 2 | WO | 0 |
| REF_CNT_RST_CH1 | 1 | WO | 0 |
| REF_CNT_RST_CH0 | 0 | WO | 0 |
RMT_DATE_REG — версия блока: дата ревизии аппаратуры
Смещение 0x00CC, адрес 0x6001 60CC, после сброса 0x0210 1181. TRM: регистр 37.19.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| DATE | 27:0 | R/W | 0x2101181 |
Частые вопросы
Сколько каналов 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 % в обоих прочтениях.
Источники
- Espressif. ESP32-S3 Technical Reference Manual, версия 1.8 — глава 37: таблица Register Summary и рисунки регистров — смещения, поля, тип доступа и значения после сброса
- Espressif. SVD svd/esp32s3.svd, версия 21 (espressif/svd, коммит be20aa1) — базовые адреса периферии, список регистров и полей; лицензия Apache-2.0
- Espressif. ESP-IDF v6.1: заголовки components/soc/esp32s3/register/soc/*_reg.h (коммит fff9895) — имена макросов регистров и полей, сверка положения полей и значений по умолчанию; лицензия Apache-2.0 OR MIT
Нашли ошибку в регистрах?
Другие регистры ESP32-S3
- Все регистры ESP32-S3Блоки периферии и базовые адреса
- GPIO — выводы общего назначения и матрица GPIOGPIO_BT_SELECT_REG, GPIO_OUT_REG, GPIO_OUT_W1TS_REG, GPIO_OUT_W1TC_REG
- IO MUX — мультиплексор функций и электрические настройки выводовPIN_CTRL, IO_MUX_GPIOn_REG
- UART — универсальный асинхронный приёмопередатчикUART_FIFO_REG, UART_INT_RAW_REG, UART_INT_ST_REG, UART_INT_ENA_REG
- SPI — контроллеры SPI общего назначения GP-SPI2 и GP-SPI3SPI_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_TnCONFIG_REG, TIMG_TnLO_REG, TIMG_TnHI_REG, TIMG_TnUPDATE_REG
- SYSTIMER — системный таймерSYSTIMER_CONF_REG, SYSTIMER_UNITn_OP_REG, SYSTIMER_UNITn_LOAD_HI_REG, SYSTIMER_UNITn_LOAD_LO_REG
- RTC_CNTL — управление питанием, сном и RTC-доменомRTC_CNTL_OPTIONS0_REG, RTC_CNTL_SLP_TIMER0_REG, RTC_CNTL_SLP_TIMER1_REG, RTC_CNTL_TIME_UPDATE_REG
- APB_SARADC — цифровой контроллер АЦПAPB_SARADC_CTRL_REG, APB_SARADC_CTRL2_REG, APB_SARADC_FILTER_CTRL1_REG, APB_SARADC_SAR1_PATT_TABn_REG
- SENS — RTC-контроллеры АЦП, датчиков касания и температурыSENS_SAR_READER1_CTRL_REG, SENS_SAR_MEAS1_CTRL2_REG, SENS_SAR_MEAS1_MUX_REG, SENS_SAR_ATTENn_REG
- USB Serial/JTAG — встроенный USB-переходник на последовательный порт и 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_MAC_INTR_MAP_REG, INTERRUPT_CORE0_MAC_NMI_MAP_REG, INTERRUPT_CORE0_PWR_INTR_MAP_REG, INTERRUPT_CORE0_BB_INT_MAP_REG
Статьи, инструменты и термины
- RMT ESP32Разрешение канала, символы WS2812 и NEC, несущая, код ESP-IDF
- RMT (импульсные последовательности ESP32)Периферия ESP32 для передачи и приёма последовательностей импульсов
- ИК-код NECАдрес и команда ↔ код, тайминги кадра, код для Arduino
- Лента WS2812BТок и мощность, время кадра, проверка таймингов SPI