Регистры RMT ESP32-C3
Регистры RMT ESP32-C3: четыре канала (0 и 1 — передача, 2 и 3 — приём) с памятью по 48 символов, делитель такта, модуляция несущей, пороги для потоковой передачи, повторы, фильтр приёма и флаги прерываний.
Содержание
- Пример на 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 передаёт и принимает последовательности импульсов: символ — 32-битное слово с двумя парами «уровень, длительность 15 бит». Так кодируют инфракрасные пульты (NEC), адресные светодиоды WS2812 и другие однопроводные протоколы.
Четыре канала делят память 192 слова: по умолчанию каждому достаётся блок из 48 слов, поле MEM_SIZE отдаёт каналу несколько блоков подряд. Такт канала — общий такт RMT_SCLK (поля SCLK_SEL и SCLK_DIV_* регистра RMT_SYS_CONF_REG), делённый на DIV_CNT. Изменённые настройки каналов передачи вступают в силу после записи 1 в CONF_UPDATE.
В TRM каналы передачи называются CHn (n = 0, 1), каналы приёма — CHm (m = 2, 3): регистры RMT_CHnCONF0_REG и RMT_CHmCONF0_REG имеют разные поля, хотя макросы ESP-IDF выглядят одинаково — RMT_CH0CONF0_REG и RMT_CH2CONF0_REG.
| Экземпляр | Базовый адрес |
|---|---|
| RMT | 0x6001 6000 |
Пример на C
Канал 0: несущая 38 кГц, 33 % при RMT_SCLK 80 МГц (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_CH0CARRIER_DUTY_REG, RMT_CARRIER_HIGH_CH0, 698); // 8,7 мкс
REG_SET_FIELD(RMT_CH0CARRIER_DUTY_REG, RMT_CARRIER_LOW_CH0, 1407); // 17,6 мкс
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 | 0x0010 + n · 0x0004 | Канал передачи n: запуск, делитель, несущая, память | 0x0071 0200 |
| RMT_CHnCONF0_REG | 0x0008 + n · 0x0008 | Канал приёма n: делитель, порог тишины, несущая | 0x30FF FF02 |
| RMT_CHnCONF1_REG | 0x000C + n · 0x0008 | Канал приёма n: запуск, фильтр, владелец памяти | 0x0000 01E8 |
| RMT_CHnSTATUS_REG | 0x0028 + n · 0x0004 | Канал передачи n: состояние и адреса памяти | 0x0000 0000 |
| RMT_CHnSTATUS_REG | 0x0028 + n · 0x0004 | Канал приёма n: состояние и адреса памяти | 0x0000 0000 |
| RMT_INT_RAW_REG | 0x0038 | Необработанные флаги прерываний | 0x0000 0000 |
| RMT_INT_ST_REG | 0x003C | Флаги прерываний после маски разрешения | 0x0000 0000 |
| RMT_INT_ENA_REG | 0x0040 | Разрешение прерываний | 0x0000 0000 |
| RMT_INT_CLR_REG | 0x0044 | Сброс флагов прерываний записью 1 | 0x0000 0000 |
| RMT_CHnCARRIER_DUTY_REG | 0x0048 + n · 0x0004 | Канал передачи n: длительности уровней несущей | 0x0040 0040 |
| RMT_CHn_RX_CARRIER_RM_REG | 0x0048 + n · 0x0004 | Канал приёма n: удаление несущей | 0x0000 0000 |
| RMT_CHn_TX_LIM_REG | 0x0058 + n · 0x0004 | Канал передачи n: порог и число повторов | 0x0000 0080 |
| RMT_CHn_RX_LIM_REG | 0x0058 + n · 0x0004 | Канал приёма n: порог прерывания | 0x0000 0080 |
| RMT_SYS_CONF_REG | 0x0068 | Общий такт RMT и питание памяти | 0x0500 0010 |
| RMT_TX_SIM_REG | 0x006C | Одновременный запуск каналов передачи | 0x0000 0000 |
| RMT_REF_CNT_RST_REG | 0x0070 | Сброс делителей каналов | 0x0000 0000 |
| RMT_DATE_REG | 0x00CC | Версия блока: дата ревизии аппаратуры | 0x0200 6231 |
Доступ — обозначения TRM: R/W — чтение и запись, RO — только чтение, WO — только запись, WT — запись 1 запускает действие, SS и SC — бит ставится и сбрасывается аппаратно, WTC — сбрасывается записью 1.
RMT_CHnDATA_REG — канал n: доступ к памяти символов через FIFO
4 копии, n = 0…3: смещение 0x0000 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 33.1.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CHnDATA | 31:0 | RO | 0x0000 0000 | Чтение и запись памяти канала по шине APB |
RMT_CHnCONF0_REG — канал передачи n: запуск, делитель, несущая, память
2 копии, n = 0, 1: смещение 0x0010 + n · 0x0004, после сброса 0x0071 0200. TRM: регистр 33.3 (RMT_CHnCONF0_REG).
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | 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 | |||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CONF_UPDATE_CHn | 24 | WT | 0 | Запись 1 применяет настройки канала |
| CARRIER_OUT_LV_CHn | 22 | R/W | 1 | Уровень, на котором модулируется несущая |
| CARRIER_EN_CHn | 21 | R/W | 1 | Модуляция несущей |
| CARRIER_EFF_EN_CHn | 20 | R/W | 1 | Модулировать только данные, не паузы |
| MEM_SIZE_CHn | 18:16 | R/W | 0x1 | Число блоков памяти по 48 слов |
| DIV_CNT_CHn | 15:8 | R/W | 0x02 | Делитель такта канала 1…255; 0 означает 256 (так пишет rmt_ll.h ESP-IDF) |
| TX_STOP_CHn | 7 | R/W/SC | 0 | Остановить передачу |
| IDLE_OUT_EN_CHn | 6 | R/W | 0 | Выдавать уровень покоя |
| IDLE_OUT_LV_CHn | 5 | R/W | 0 | Уровень выхода в покое |
| MEM_TX_WRAP_EN_CHn | 4 | R/W | 0 | Кольцевой режим памяти для длинных последовательностей |
| TX_CONTI_MODE_CHn | 3 | R/W | 0 | Повторять передачу по кругу |
| APB_MEM_RST_CHn | 2 | WT | 0 | Сброс адреса доступа по APB |
| MEM_RD_RST_CHn | 1 | WT | 0 | Сброс адреса чтения памяти |
| TX_START_CHn | 0 | WT | 0 | Запись 1 запускает передачу |
RMT_CHnCONF0_REG — канал приёма n: делитель, порог тишины, несущая
2 копии, n = 2, 3: смещение 0x0008 + n · 0x0008, после сброса 0x30FF FF02. TRM: регистр 33.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 | 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 | |
| CARRIER_EN_CHn | 28 | R/W | 1 | |
| MEM_SIZE_CHn | 25:23 | R/W | 0x1 | Число блоков памяти по 48 слов |
| IDLE_THRES_CHn | 22:8 | R/W | 0x7FFF | Тишина дольше стольких тактов — конец приёма |
| DIV_CNT_CHn | 7:0 | R/W | 0x02 | Делитель такта канала 1…255; 0 означает 256 (так пишет rmt_ll.h ESP-IDF) |
RMT_CHnCONF1_REG — канал приёма n: запуск, фильтр, владелец памяти
2 копии, n = 2, 3: смещение 0x000C + n · 0x0008, после сброса 0x0000 01E8. TRM: регистр 33.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 | |
| RX_FILTER_THRES_CHn | 12:5 | R/W | 0x0F | Импульсы короче стольких тактов RMT_SCLK отбрасываются |
| RX_FILTER_EN_CHn | 4 | R/W | 0 | Фильтр коротких импульсов |
| MEM_OWNER_CHn | 3 | R/W | 1 | Владелец памяти: 1 — приёмник, 0 — программа |
| APB_MEM_RST_CHn | 2 | WT | 0 | |
| MEM_WR_RST_CHn | 1 | WT | 0 | |
| RX_EN_CHn | 0 | R/W | 0 | Включить приём |
RMT_CHnSTATUS_REG — канал передачи n: состояние и адреса памяти
2 копии, n = 0, 1: смещение 0x0028 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 33.8 (RMT_CHnSTATUS_REG).
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| APB_MEM_RADDR_CHn | APB_MEM_WR_ERR_CHn | MEM_EMPTY_CHn | APB_MEM_RD_ERR_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 | STATE_CHn | MEM_RADDR_EX_CHn | |||||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| APB_MEM_RADDR_CHn | 31:24 | RO | 0x00 |
| APB_MEM_WR_ERR_CHn | 23 | RO | 0 |
| MEM_EMPTY_CHn | 22 | RO | 0 |
| APB_MEM_RD_ERR_CHn | 21 | RO | 0 |
| APB_MEM_WADDR_CHn | 20:12 | RO | 0x000 |
| STATE_CHn | 11:9 | RO | 0x0 |
| MEM_RADDR_EX_CHn | 8:0 | RO | 0x000 |
RMT_CHnSTATUS_REG — канал приёма n: состояние и адреса памяти
2 копии, n = 2, 3: смещение 0x0028 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 33.9 (RMT_CHmSTATUS_REG).
| 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 |
| MEM_FULL_CHn | 26 | RO | 0 |
| MEM_OWNER_ERR_CHn | 25 | RO | 0 |
| STATE_CHn | 24:22 | RO | 0x0 |
| APB_MEM_RADDR_CHn | 20:12 | RO | 0x000 |
| MEM_WADDR_EX_CHn | 8:0 | RO | 0x000 |
RMT_INT_RAW_REG — необработанные флаги прерываний
Смещение 0x0038, адрес 0x6001 6038, после сброса 0x0000 0000. TRM: регистр 33.10.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CH1_TX_LOOP_INT_RAW | CH0_TX_LOOP_INT_RAW | CH3_RX_THR_EVENT_INT_RAW | CH2_RX_THR_EVENT_INT_RAW | CH1_TX_THR_EVENT_INT_RAW | CH0_TX_THR_EVENT_INT_RAW | CH3_ERR_INT_RAW | CH2_ERR_INT_RAW | CH1_ERR_INT_RAW | CH0_ERR_INT_RAW | CH3_RX_END_INT_RAW | CH2_RX_END_INT_RAW | CH1_TX_END_INT_RAW | CH0_TX_END_INT_RAW | |
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CH1_TX_LOOP_INT_RAW | 13 | R/WTC/SS | 0 | Канал 1 выполнил заданное число циклов передачи |
| CH0_TX_LOOP_INT_RAW | 12 | R/WTC/SS | 0 | Канал 0 выполнил заданное число циклов передачи |
| CH3_RX_THR_EVENT_INT_RAW | 11 | R/WTC/SS | 0 | Канал 3 принял RX_LIM символов — пора забрать данные |
| CH2_RX_THR_EVENT_INT_RAW | 10 | R/WTC/SS | 0 | Канал 2 принял RX_LIM символов — пора забрать данные |
| CH1_TX_THR_EVENT_INT_RAW | 9 | R/WTC/SS | 0 | Канал 1 передал TX_LIM_CH1 символов — пора дописать память |
| CH0_TX_THR_EVENT_INT_RAW | 8 | R/WTC/SS | 0 | Канал 0 передал TX_LIM_CH0 символов — пора дописать память |
| CH3_ERR_INT_RAW | 7 | R/WTC/SS | 0 | Канал 3: ошибка доступа к памяти RMT |
| CH2_ERR_INT_RAW | 6 | R/WTC/SS | 0 | Канал 2: ошибка доступа к памяти RMT |
| CH1_ERR_INT_RAW | 5 | R/WTC/SS | 0 | Канал 1: ошибка доступа к памяти RMT |
| CH0_ERR_INT_RAW | 4 | R/WTC/SS | 0 | Канал 0: ошибка доступа к памяти RMT |
| CH3_RX_END_INT_RAW | 3 | R/WTC/SS | 0 | Канал 3 закончил приём |
| CH2_RX_END_INT_RAW | 2 | R/WTC/SS | 0 | Канал 2 закончил приём |
| CH1_TX_END_INT_RAW | 1 | R/WTC/SS | 0 | Канал 1 закончил передачу |
| CH0_TX_END_INT_RAW | 0 | R/WTC/SS | 0 | Канал 0 закончил передачу |
RMT_INT_ST_REG — флаги прерываний после маски разрешения
Смещение 0x003C, адрес 0x6001 603C, после сброса 0x0000 0000. TRM: регистр 33.11.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CH1_TX_LOOP_INT_ST | CH0_TX_LOOP_INT_ST | CH3_RX_THR_EVENT_INT_ST | CH2_RX_THR_EVENT_INT_ST | CH1_TX_THR_EVENT_INT_ST | CH0_TX_THR_EVENT_INT_ST | CH3_ERR_INT_ST | CH2_ERR_INT_ST | CH1_ERR_INT_ST | CH0_ERR_INT_ST | CH3_RX_END_INT_ST | CH2_RX_END_INT_ST | CH1_TX_END_INT_ST | CH0_TX_END_INT_ST | |
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CH1_TX_LOOP_INT_ST | 13 | RO | 0 | Канал 1 выполнил заданное число циклов передачи |
| CH0_TX_LOOP_INT_ST | 12 | RO | 0 | Канал 0 выполнил заданное число циклов передачи |
| CH3_RX_THR_EVENT_INT_ST | 11 | RO | 0 | Канал 3 принял RX_LIM символов — пора забрать данные |
| CH2_RX_THR_EVENT_INT_ST | 10 | RO | 0 | Канал 2 принял RX_LIM символов — пора забрать данные |
| 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_RX_END_INT_ST | 3 | RO | 0 | Канал 3 закончил приём |
| CH2_RX_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 — разрешение прерываний
Смещение 0x0040, адрес 0x6001 6040, после сброса 0x0000 0000. TRM: регистр 33.12.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CH1_TX_LOOP_INT_ENA | CH0_TX_LOOP_INT_ENA | CH3_RX_THR_EVENT_INT_ENA | CH2_RX_THR_EVENT_INT_ENA | CH1_TX_THR_EVENT_INT_ENA | CH0_TX_THR_EVENT_INT_ENA | CH3_ERR_INT_ENA | CH2_ERR_INT_ENA | CH1_ERR_INT_ENA | CH0_ERR_INT_ENA | CH3_RX_END_INT_ENA | CH2_RX_END_INT_ENA | CH1_TX_END_INT_ENA | CH0_TX_END_INT_ENA | |
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CH1_TX_LOOP_INT_ENA | 13 | R/W | 0 | Канал 1 выполнил заданное число циклов передачи |
| CH0_TX_LOOP_INT_ENA | 12 | R/W | 0 | Канал 0 выполнил заданное число циклов передачи |
| CH3_RX_THR_EVENT_INT_ENA | 11 | R/W | 0 | Канал 3 принял RX_LIM символов — пора забрать данные |
| CH2_RX_THR_EVENT_INT_ENA | 10 | R/W | 0 | Канал 2 принял RX_LIM символов — пора забрать данные |
| 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_RX_END_INT_ENA | 3 | R/W | 0 | Канал 3 закончил приём |
| CH2_RX_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
Смещение 0x0044, адрес 0x6001 6044, после сброса 0x0000 0000. TRM: регистр 33.13.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CH1_TX_LOOP_INT_CLR | CH0_TX_LOOP_INT_CLR | CH3_RX_THR_EVENT_INT_CLR | CH2_RX_THR_EVENT_INT_CLR | CH1_TX_THR_EVENT_INT_CLR | CH0_TX_THR_EVENT_INT_CLR | CH3_ERR_INT_CLR | CH2_ERR_INT_CLR | CH1_ERR_INT_CLR | CH0_ERR_INT_CLR | CH3_RX_END_INT_CLR | CH2_RX_END_INT_CLR | CH1_TX_END_INT_CLR | CH0_TX_END_INT_CLR | |
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CH1_TX_LOOP_INT_CLR | 13 | WT | 0 | Канал 1 выполнил заданное число циклов передачи |
| CH0_TX_LOOP_INT_CLR | 12 | WT | 0 | Канал 0 выполнил заданное число циклов передачи |
| CH3_RX_THR_EVENT_INT_CLR | 11 | WT | 0 | Канал 3 принял RX_LIM символов — пора забрать данные |
| CH2_RX_THR_EVENT_INT_CLR | 10 | WT | 0 | Канал 2 принял RX_LIM символов — пора забрать данные |
| CH1_TX_THR_EVENT_INT_CLR | 9 | WT | 0 | Канал 1 передал TX_LIM_CH1 символов — пора дописать память |
| CH0_TX_THR_EVENT_INT_CLR | 8 | WT | 0 | Канал 0 передал TX_LIM_CH0 символов — пора дописать память |
| CH3_ERR_INT_CLR | 7 | WT | 0 | Канал 3: ошибка доступа к памяти RMT |
| CH2_ERR_INT_CLR | 6 | WT | 0 | Канал 2: ошибка доступа к памяти RMT |
| CH1_ERR_INT_CLR | 5 | WT | 0 | Канал 1: ошибка доступа к памяти RMT |
| CH0_ERR_INT_CLR | 4 | WT | 0 | Канал 0: ошибка доступа к памяти RMT |
| CH3_RX_END_INT_CLR | 3 | WT | 0 | Канал 3 закончил приём |
| CH2_RX_END_INT_CLR | 2 | WT | 0 | Канал 2 закончил приём |
| CH1_TX_END_INT_CLR | 1 | WT | 0 | Канал 1 закончил передачу |
| CH0_TX_END_INT_CLR | 0 | WT | 0 | Канал 0 закончил передачу |
RMT_CHnCARRIER_DUTY_REG — канал передачи n: длительности уровней несущей
2 копии, n = 0, 1: смещение 0x0048 + n · 0x0004, после сброса 0x0040 0040. TRM: регистр 33.14.
| 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 | Высокий уровень несущей в тактах RMT_SCLK: по TRM — CARRIER_HIGH + 1, драйвер ESP-IDF пишет число тактов без поправки, 0 — 65 536 |
| CARRIER_LOW_CHn | 15:0 | R/W | 0x0040 | Низкий уровень несущей, счёт как у CARRIER_HIGH |
RMT_CHn_RX_CARRIER_RM_REG — канал приёма n: удаление несущей
2 копии, n = 2, 3: смещение 0x0048 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 33.15.
| 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 |
| CARRIER_LOW_THRES_CHn | 15:0 | R/W | 0x0000 |
RMT_CHn_TX_LIM_REG — канал передачи n: порог и число повторов
2 копии, n = 0, 1: смещение 0x0058 + n · 0x0004, после сброса 0x0000 0080. TRM: регистр 33.16.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | 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_COUNT_RESET_CHn | 20 | WT | 0 | |
| TX_LOOP_CNT_EN_CHn | 19 | R/W | 0 | Считать повторы |
| TX_LOOP_NUM_CHn | 18:9 | R/W | 0x000 | Число повторов в режиме TX_CONTI_MODE |
| TX_LIM_CHn | 8:0 | R/W | 0x080 | Порог: после стольких символов — прерывание TX_THR_EVENT |
RMT_CHn_RX_LIM_REG — канал приёма n: порог прерывания
2 копии, n = 2, 3: смещение 0x0058 + n · 0x0004, после сброса 0x0000 0080. TRM: регистр 33.18.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| RX_LIM | 8:0 | R/W | 0x080 |
RMT_SYS_CONF_REG — общий такт RMT и питание памяти
Смещение 0x0068, адрес 0x6001 6068, после сброса 0x0500 0010. TRM: регистр 33.6.
| 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 | Тактирование регистров |
| SCLK_ACTIVE | 26 | R/W | 1 | Включить такт RMT_SCLK |
| SCLK_SEL | 25:24 | R/W | 0x1 | Источник: 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 | Целая часть делителя такта RMT_SCLK минус 1 |
| MEM_FORCE_PU | 3 | R/W | 0 | |
| MEM_FORCE_PD | 2 | R/W | 0 | |
| MEM_CLK_FORCE_ON | 1 | R/W | 0 | |
| APB_FIFO_MASK | 0 | R/W | 0 | 1 — доступ к памяти напрямую, 0 — через FIFO CHnDATA |
RMT_TX_SIM_REG — одновременный запуск каналов передачи
Смещение 0x006C, адрес 0x6001 606C, после сброса 0x0000 0000. TRM: регистр 33.17.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | TX_SIM_EN | TX_SIM_CH1 | TX_SIM_CH0 | ||||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| TX_SIM_EN | 2 | R/W | 0 |
| TX_SIM_CH1 | 1 | R/W | 0 |
| TX_SIM_CH0 | 0 | R/W | 0 |
RMT_REF_CNT_RST_REG — сброс делителей каналов
Смещение 0x0070, адрес 0x6001 6070, после сброса 0x0000 0000. TRM: регистр 33.7.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | REF_CNT_RST_CH3 | REF_CNT_RST_CH2 | REF_CNT_RST_CH1 | REF_CNT_RST_CH0 | |||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| REF_CNT_RST_CH3 | 3 | WT | 0 |
| REF_CNT_RST_CH2 | 2 | WT | 0 |
| REF_CNT_RST_CH1 | 1 | WT | 0 |
| REF_CNT_RST_CH0 | 0 | WT | 0 |
RMT_DATE_REG — версия блока: дата ревизии аппаратуры
Смещение 0x00CC, адрес 0x6001 60CC, после сброса 0x0200 6231. TRM: регистр 33.19.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| RMT_DATE | 27:0 | R/W | 0x2006231 |
Частые вопросы
Сколько каналов RMT у ESP32-C3?
Четыре: каналы 0 и 1 только передают, каналы 2 и 3 только принимают. У каждого блок памяти из 48 слов по 32 бита, то есть 96 пар «уровень — длительность»; длинные последовательности передают порциями по прерыванию TX_THR_EVENT.
Как задать несущую 38 кГц для ИК-пульта на RMT ESP32-C3?
В регистре RMT_CHnCARRIER_DUTY_REG записать длительности высокого и низкого уровней несущей в тактах RMT_SCLK — при 80 МГц около 698 и 1407 тактов дают 38 кГц и скважность 33 % — и включить CARRIER_EN_CHn в RMT_CHnCONF0_REG. Расчёт для любого такта — в калькуляторе RMT.
Источники
- Espressif. ESP32-C3 Technical Reference Manual, версия 1.4 — глава 33: таблица 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
- UART — универсальный асинхронный приёмопередатчикUART_FIFO_REG, UART_INT_RAW_REG, UART_INT_ST_REG, UART_INT_ENA_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
- 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
Статьи, инструменты и термины
- RMT ESP32Разрешение канала, символы WS2812 и NEC, несущая, код ESP-IDF
- RMT (импульсные последовательности ESP32)Периферия ESP32 для передачи и приёма последовательностей импульсов
- ИК-код NECАдрес и команда ↔ код, тайминги кадра, код для Arduino
- Лента WS2812BТок и мощность, время кадра, проверка таймингов SPI