Регистры SYSTIMER ESP32-C3
Регистры системного таймера ESP32-C3: два 52-битных счётчика UNIT0 и UNIT1, которые считают с частотой 16 МГц, три компаратора для разовых и периодических прерываний, загрузка нового значения и защёлкивание текущего для чтения.
Содержание
- Пример на C
- Регистры блока
- SYSTIMER_CONF_REG
- SYSTIMER_UNITn_OP_REG
- SYSTIMER_UNITn_LOAD_HI_REG
- SYSTIMER_UNITn_LOAD_LO_REG
- SYSTIMER_TARGETn_HI_REG
- SYSTIMER_TARGETn_LO_REG
- SYSTIMER_TARGETn_CONF_REG
- SYSTIMER_UNITn_VALUE_HI_REG
- SYSTIMER_UNITn_VALUE_LO_REG
- SYSTIMER_COMPn_LOAD_REG
- SYSTIMER_UNITn_LOAD_REG
- SYSTIMER_INT_ENA_REG
- SYSTIMER_INT_RAW_REG
- SYSTIMER_INT_CLR_REG
- SYSTIMER_INT_ST_REG
- SYSTIMER_DATE_REG
Системный таймер по адресу 0x6002 3000 — источник времени для FreeRTOS и esp_timer: счётчики UNIT0 и UNIT1 тактируются от XTAL_CLK 40 МГц через делитель 2,5 и в среднем считают 16 миллионов раз в секунду. Счётчик можно остановить, пока ядро стоит в отладчике (поля *_CORE0_STALL_EN).
Компараторы TARGET0…TARGET2 подключаются к любому из счётчиков и вызывают прерывание, когда счётчик доходит до заданного 52-битного значения, или повторяют его с 26-битным периодом. Новое значение компаратора применяется записью в COMPn_LOAD.
Чтобы прочитать счётчик, в UNITn_OP записывают бит обновления, ждут флага VALUE_VALID и читают VALUE_HI и VALUE_LO.
| Экземпляр | Базовый адрес |
|---|---|
| SYSTIMER | 0x6002 3000 |
Пример на C
Чтение 52-битного счётчика UNIT0 (soc/systimer_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/systimer_reg.h"
REG_WRITE(SYSTIMER_UNIT0_OP_REG, SYSTIMER_TIMER_UNIT0_UPDATE); // защёлкнуть
while (!REG_GET_BIT(SYSTIMER_UNIT0_OP_REG, SYSTIMER_TIMER_UNIT0_VALUE_VALID)) {}
uint64_t ticks = ((uint64_t)REG_READ(SYSTIMER_UNIT0_VALUE_HI_REG) << 32)
| REG_READ(SYSTIMER_UNIT0_VALUE_LO_REG);
uint64_t us = ticks / 16; // 16 МГцРегистры блока
| Регистр (ESP-IDF) | Смещение | Назначение | После сброса |
|---|---|---|---|
| SYSTIMER_CONF_REG | 0x0000 | Включение счётчиков и компараторов, остановка в отладке | 0x4400 0000 |
| SYSTIMER_UNITn_OP_REG | 0x0004 + n · 0x0004 | Счётчик n: защёлкнуть значение для чтения | 0x0000 0000 |
| SYSTIMER_UNITn_LOAD_HI_REG | 0x000C + n · 0x0008 | Счётчик n: загружаемое значение, старшие 20 бит | 0x0000 0000 |
| SYSTIMER_UNITn_LOAD_LO_REG | 0x0010 + n · 0x0008 | Счётчик n: загружаемое значение, младшие 32 бита | 0x0000 0000 |
| SYSTIMER_TARGETn_HI_REG | 0x001C + n · 0x0008 | Компаратор n: значение срабатывания, старшие 20 бит | 0x0000 0000 |
| SYSTIMER_TARGETn_LO_REG | 0x0020 + n · 0x0008 | Компаратор n: значение срабатывания, младшие 32 бита | 0x0000 0000 |
| SYSTIMER_TARGETn_CONF_REG | 0x0034 + n · 0x0004 | Компаратор n: счётчик, режим и период | 0x0000 0000 |
| SYSTIMER_UNITn_VALUE_HI_REG | 0x0040 + n · 0x0008 | Счётчик n: защёлкнутое значение, старшие 20 бит | 0x0000 0000 |
| SYSTIMER_UNITn_VALUE_LO_REG | 0x0044 + n · 0x0008 | Счётчик n: защёлкнутое значение, младшие 32 бита | 0x0000 0000 |
| SYSTIMER_COMPn_LOAD_REG | 0x0050 + n · 0x0004 | Компаратор n: применить новые настройки | 0x0000 0000 |
| SYSTIMER_UNITn_LOAD_REG | 0x005C + n · 0x0004 | Счётчик n: загрузить значение | 0x0000 0000 |
| SYSTIMER_INT_ENA_REG | 0x0064 | Разрешение прерываний | 0x0000 0000 |
| SYSTIMER_INT_RAW_REG | 0x0068 | Необработанные флаги прерываний | 0x0000 0000 |
| SYSTIMER_INT_CLR_REG | 0x006C | Сброс флагов прерываний записью 1 | 0x0000 0000 |
| SYSTIMER_INT_ST_REG | 0x0070 | Флаги прерываний после маски разрешения | 0x0000 0000 |
| SYSTIMER_DATE_REG | 0x00FC | Версия блока: дата ревизии аппаратуры | 0x0200 6171 |
Доступ — обозначения TRM: R/W — чтение и запись, RO — только чтение, WO — только запись, WT — запись 1 запускает действие, SS и SC — бит ставится и сбрасывается аппаратно, WTC — сбрасывается записью 1.
SYSTIMER_CONF_REG — включение счётчиков и компараторов, остановка в отладке
Смещение 0x0000, адрес 0x6002 3000, после сброса 0x4400 0000. TRM: регистр 10.1.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| CLK_EN | TIMER_UNIT0_WORK_EN | TIMER_UNIT1_WORK_EN | TIMER_UNIT0_CORE0_STALL_EN | — | TIMER_UNIT1_CORE0_STALL_EN | — | TARGET0_WORK_EN | TARGET1_WORK_EN | TARGET2_WORK_EN | — | |||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | |||||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CLK_EN | 31 | R/W | 0 | Тактирование регистров |
| TIMER_UNIT0_WORK_EN | 30 | R/W | 1 | Счётчик 0 работает |
| TIMER_UNIT1_WORK_EN | 29 | R/W | 0 | Счётчик 1 работает |
| TIMER_UNIT0_CORE0_STALL_EN | 28 | R/W | 0 | Останавливать счётчик 0, пока ядро остановлено отладчиком |
| TIMER_UNIT1_CORE0_STALL_EN | 26 | R/W | 1 | Останавливать счётчик 1, пока ядро остановлено отладчиком |
| TARGET0_WORK_EN | 24 | R/W | 0 | Компаратор 0 работает |
| TARGET1_WORK_EN | 23 | R/W | 0 | Компаратор 1 работает |
| TARGET2_WORK_EN | 22 | R/W | 0 | Компаратор 2 работает |
SYSTIMER_UNITn_OP_REG — счётчик n: защёлкнуть значение для чтения
2 копии, n = 0, 1: смещение 0x0004 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 10.2.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | TIMER_UNITn_UPDATE | TIMER_UNITn_VALUE_VALID | — | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | |||||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| TIMER_UNITn_UPDATE | 30 | WT | 0 | Запись 1 защёлкивает значение счётчика |
| TIMER_UNITn_VALUE_VALID | 29 | R/SS/WTC | 0 | Защёлкнутое значение готово к чтению |
SYSTIMER_UNITn_LOAD_HI_REG — счётчик n: загружаемое значение, старшие 20 бит
2 копии, n = 0, 1: смещение 0x000C + n · 0x0008, после сброса 0x0000 0000. TRM: регистр 10.3.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| TIMER_UNITn_LOAD_HI | 19:0 | R/W | 0x00000 |
SYSTIMER_UNITn_LOAD_LO_REG — счётчик n: загружаемое значение, младшие 32 бита
2 копии, n = 0, 1: смещение 0x0010 + n · 0x0008, после сброса 0x0000 0000. TRM: регистр 10.4.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| TIMER_UNITn_LOAD_LO | 31:0 | R/W | 0x0000 0000 |
SYSTIMER_TARGETn_HI_REG — компаратор n: значение срабатывания, старшие 20 бит
3 копии, n = 0…2: смещение 0x001C + n · 0x0008, после сброса 0x0000 0000. TRM: регистр 10.14.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| TIMER_TARGETn_HI | 19:0 | R/W | 0x00000 |
SYSTIMER_TARGETn_LO_REG — компаратор n: значение срабатывания, младшие 32 бита
3 копии, n = 0…2: смещение 0x0020 + n · 0x0008, после сброса 0x0000 0000. TRM: регистр 10.15.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| TIMER_TARGETn_LO | 31:0 | R/W | 0x0000 0000 |
SYSTIMER_TARGETn_CONF_REG — компаратор n: счётчик, режим и период
3 копии, n = 0…2: смещение 0x0034 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 10.16.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| TARGETn_TIMER_UNIT_SEL | TARGETn_PERIOD_MODE | — | TARGETn_PERIOD | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TARGETn_PERIOD | |||||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| TARGETn_TIMER_UNIT_SEL | 31 | R/W | 0 | Счётчик для компаратора: 0 — UNIT0, 1 — UNIT1 |
| TARGETn_PERIOD_MODE | 30 | R/W | 0 | 1 — периодический режим, 0 — разовое срабатывание |
| TARGETn_PERIOD | 25:0 | R/W | 0x0000000 | Период в тактах для периодического режима |
SYSTIMER_UNITn_VALUE_HI_REG — счётчик n: защёлкнутое значение, старшие 20 бит
2 копии, n = 0, 1: смещение 0x0040 + n · 0x0008, после сброса 0x0000 0000. TRM: регистр 10.5.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| TIMER_UNITn_VALUE_HI | 19:0 | RO | 0x00000 |
SYSTIMER_UNITn_VALUE_LO_REG — счётчик n: защёлкнутое значение, младшие 32 бита
2 копии, n = 0, 1: смещение 0x0044 + n · 0x0008, после сброса 0x0000 0000. TRM: регистр 10.6.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| TIMER_UNITn_VALUE_LO | 31:0 | RO | 0x0000 0000 |
SYSTIMER_COMPn_LOAD_REG — компаратор n: применить новые настройки
3 копии, n = 0…2: смещение 0x0050 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 10.17.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| TIMER_COMPn_LOAD | 0 | WT | 0 | Запись 1 применяет значение и режим компаратора |
SYSTIMER_UNITn_LOAD_REG — счётчик n: загрузить значение
2 копии, n = 0, 1: смещение 0x005C + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 10.7.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| TIMER_UNITn_LOAD | 0 | WT | 0 | Запись 1 загружает UNITn_LOAD_HI и LO в счётчик |
SYSTIMER_INT_ENA_REG — разрешение прерываний
Смещение 0x0064, адрес 0x6002 3064, после сброса 0x0000 0000. TRM: регистр 10.26.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | TARGET2_INT_ENA | TARGET1_INT_ENA | TARGET0_INT_ENA | ||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| TARGET2_INT_ENA | 2 | R/W | 0 | Сработал компаратор 2 |
| TARGET1_INT_ENA | 1 | R/W | 0 | Сработал компаратор 1 |
| TARGET0_INT_ENA | 0 | R/W | 0 | Сработал компаратор 0 |
SYSTIMER_INT_RAW_REG — необработанные флаги прерываний
Смещение 0x0068, адрес 0x6002 3068, после сброса 0x0000 0000. TRM: регистр 10.27.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | TARGET2_INT_RAW | TARGET1_INT_RAW | TARGET0_INT_RAW | ||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| TARGET2_INT_RAW | 2 | R/WTC/SS | 0 | Сработал компаратор 2 |
| TARGET1_INT_RAW | 1 | R/WTC/SS | 0 | Сработал компаратор 1 |
| TARGET0_INT_RAW | 0 | R/WTC/SS | 0 | Сработал компаратор 0 |
SYSTIMER_INT_CLR_REG — сброс флагов прерываний записью 1
Смещение 0x006C, адрес 0x6002 306C, после сброса 0x0000 0000. TRM: регистр 10.28.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | TARGET2_INT_CLR | TARGET1_INT_CLR | TARGET0_INT_CLR | ||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| TARGET2_INT_CLR | 2 | WT | 0 | Сработал компаратор 2 |
| TARGET1_INT_CLR | 1 | WT | 0 | Сработал компаратор 1 |
| TARGET0_INT_CLR | 0 | WT | 0 | Сработал компаратор 0 |
SYSTIMER_INT_ST_REG — флаги прерываний после маски разрешения
Смещение 0x0070, адрес 0x6002 3070, после сброса 0x0000 0000. TRM: регистр 10.29.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | TARGET2_INT_ST | TARGET1_INT_ST | TARGET0_INT_ST | ||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| TARGET2_INT_ST | 2 | RO | 0 | Сработал компаратор 2 |
| TARGET1_INT_ST | 1 | RO | 0 | Сработал компаратор 1 |
| TARGET0_INT_ST | 0 | RO | 0 | Сработал компаратор 0 |
SYSTIMER_DATE_REG — версия блока: дата ревизии аппаратуры
Смещение 0x00FC, адрес 0x6002 30FC, после сброса 0x0200 6171. TRM: регистр 10.30.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| DATE | 31:0 | R/W | 0x0200 6171 |
Частые вопросы
С какой частотой считает системный таймер ESP32-C3?
В среднем 16 МГц: счётчики тактируются от кварца 40 МГц через дробный делитель 2,5, поэтому за два такта счётчика проходит пять тактов кварца. Шаг счётчика — 1/16 мкс (esp_timer отдаёт время в микросекундах), а 52 бит хватает на 8,9 года счёта.
Как настроить периодическое прерывание системного таймера ESP32-C3?
В SYSTIMER_TARGETn_CONF_REG выбрать счётчик полем TARGETn_TIMER_UNIT_SEL, записать период в тактах в TARGETn_PERIOD и установить TARGETn_PERIOD_MODE, применить настройку записью в SYSTIMER_COMPn_LOAD_REG, включить компаратор битом TARGETn_WORK_EN в SYSTIMER_CONF_REG и прерывание — в SYSTIMER_INT_ENA_REG.
Источники
- Espressif. ESP32-C3 Technical Reference Manual, версия 1.4 — глава 10: таблица 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
- RMT — контроллер инфракрасного пульта и импульсных протоколовRMT_CHnDATA_REG, RMT_CHnCONF0_REG, RMT_CHnCONF0_REG, RMT_CHnCONF1_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