Регистры SYSTIMER ESP32-S3
Регистры системного таймера ESP32-S3: два 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_REAL_TARGETn_LO_REG
- SYSTIMER_REAL_TARGETn_HI_REG
- SYSTIMER_DATE_REG
Системный таймер по адресу 0x6002 3000 тактируется от XTAL_CLK 40 МГц через дробный делитель: один такт счётчика длится три такта кварца, следующий — два, в среднем f_XTAL / 2,5 = 16 МГц, шаг счёта — 1/16 мкс. Тактирование регистров включает бит SYSTEM_SYSTIMER_CLK_EN регистра SYSTEM_PERIP_CLK_EN0_REG.
Счётчик UNITn работает, если установлен TIMER_UNITn_WORK_EN регистра SYSTIMER_CONF_REG; биты TIMER_UNITn_CORE0_STALL_EN и CORE1_STALL_EN останавливают его, пока стоит соответствующее ядро. После сброса UNIT0 включён, UNIT1 выключен.
Компараторы COMP0…COMP2 сравнивают выбранный счётчик с 52-битным значением (разовый режим) или с началом плюс n периодов по 26 бит (периодический режим). Записанные значения компаратор получает после записи 1 в TIMER_COMPx_LOAD, счётчик — после TIMER_UNITn_LOAD.
| Экземпляр | Базовый адрес |
|---|---|
| SYSTIMER | 0x6002 3000 |
Пример на C
Чтение счётчика 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); // 16 тактов на микросекундуРегистры блока
| Регистр (ESP-IDF) | Смещение | Назначение | После сброса |
|---|---|---|---|
| SYSTIMER_CONF_REG | 0x0000 | Включение счётчиков и компараторов, остановка при остановке ядер | 0x4600 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_REAL_TARGETn_LO_REG | 0x0074 + n · 0x0008 | Компаратор n: фактическое значение срабатывания, младшие 32 бита | 0x0000 0000 |
| SYSTIMER_REAL_TARGETn_HI_REG | 0x0078 + n · 0x0008 | Компаратор n: фактическое значение срабатывания, старшие 20 бит | 0x0000 0000 |
| SYSTIMER_DATE_REG | 0x00FC | Версия блока: дата ревизии аппаратуры | 0x0201 2251 |
Доступ — обозначения TRM: R/W — чтение и запись, RO — только чтение, WO — только запись, WT — запись 1 запускает действие, SS и SC — бит ставится и сбрасывается аппаратно, WTC — сбрасывается записью 1.
SYSTIMER_CONF_REG — включение счётчиков и компараторов, остановка при остановке ядер
Смещение 0x0000, адрес 0x6002 3000, после сброса 0x4600 0000. TRM: регистр 11.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_UNIT0_CORE1_STALL_EN | TIMER_UNIT1_CORE0_STALL_EN | TIMER_UNIT1_CORE1_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 | 1 — такт регистров всегда включён |
| TIMER_UNIT0_WORK_EN | 30 | R/W | 1 | 1 — счётчик UNIT0 работает |
| TIMER_UNIT1_WORK_EN | 29 | R/W | 0 | 1 — счётчик UNIT1 работает |
| TIMER_UNIT0_CORE0_STALL_EN | 28 | R/W | 0 | 1 — UNIT0 стоит, пока остановлено ядро 0 |
| TIMER_UNIT0_CORE1_STALL_EN | 27 | R/W | 0 | 1 — UNIT0 стоит, пока остановлено ядро 1 |
| TIMER_UNIT1_CORE0_STALL_EN | 26 | R/W | 1 | 1 — UNIT1 стоит, пока остановлено ядро 0 |
| TIMER_UNIT1_CORE1_STALL_EN | 25 | R/W | 1 | 1 — UNIT1 стоит, пока остановлено ядро 1 |
| TARGET0_WORK_EN | 24 | R/W | 0 | 1 — компаратор COMP0 работает |
| TARGET1_WORK_EN | 23 | R/W | 0 | 1 — компаратор COMP1 работает |
| TARGET2_WORK_EN | 22 | R/W | 0 | 1 — компаратор COMP2 работает |
SYSTIMER_UNITn_OP_REG — счётчик n: защёлкнуть значение и признак готовности
2 копии, n = 0, 1: смещение 0x0004 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 11.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 защёлкивает значение счётчика в VALUE_HI и VALUE_LO |
| TIMER_UNITn_VALUE_VALID | 29 | R/SS/WTC | 0 | 1 — защёлкнутое значение готово |
SYSTIMER_UNITn_LOAD_HI_REG — счётчик n: загружаемое значение, старшие 20 бит
2 копии, n = 0, 1: смещение 0x000C + n · 0x0008, после сброса 0x0000 0000. TRM: регистр 11.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: регистр 11.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: регистр 11.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: регистр 11.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: регистр 11.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 | Счётчик для компаратора: 1 — UNIT1, 0 — UNIT0 |
| TARGETn_PERIOD_MODE | 30 | R/W | 0 | 1 — периодический режим, 0 — разовый |
| TARGETn_PERIOD | 25:0 | R/W | 0x0000000 | Период в тактах 16 МГц, 26 бит |
SYSTIMER_UNITn_VALUE_HI_REG — счётчик n: защёлкнутое значение, старшие 20 бит
2 копии, n = 0, 1: смещение 0x0040 + n · 0x0008, после сброса 0x0000 0000. TRM: регистр 11.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: регистр 11.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: регистр 11.17.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| TIMER_COMPn_LOAD | 0 | WT | 0 | Запись 1 передаёт компаратору значение или период |
SYSTIMER_UNITn_LOAD_REG — счётчик n: загрузить новое значение
2 копии, n = 0, 1: смещение 0x005C + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 11.7.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| TIMER_UNITn_LOAD | 0 | WT | 0 | Запись 1 загружает в счётчик LOAD_HI и LOAD_LO |
SYSTIMER_INT_ENA_REG — разрешение прерываний
Смещение 0x0064, адрес 0x6002 3064, после сброса 0x0000 0000. TRM: регистр 11.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 | Сработал компаратор COMP2 |
| TARGET1_INT_ENA | 1 | R/W | 0 | Сработал компаратор COMP1 |
| TARGET0_INT_ENA | 0 | R/W | 0 | Сработал компаратор COMP0 |
SYSTIMER_INT_RAW_REG — необработанные флаги прерываний
Смещение 0x0068, адрес 0x6002 3068, после сброса 0x0000 0000. TRM: регистр 11.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 | Сработал компаратор COMP2 |
| TARGET1_INT_RAW | 1 | R/WTC/SS | 0 | Сработал компаратор COMP1 |
| TARGET0_INT_RAW | 0 | R/WTC/SS | 0 | Сработал компаратор COMP0 |
SYSTIMER_INT_CLR_REG — сброс флагов прерываний записью 1
Смещение 0x006C, адрес 0x6002 306C, после сброса 0x0000 0000. TRM: регистр 11.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 | Сработал компаратор COMP2 |
| TARGET1_INT_CLR | 1 | WT | 0 | Сработал компаратор COMP1 |
| TARGET0_INT_CLR | 0 | WT | 0 | Сработал компаратор COMP0 |
SYSTIMER_INT_ST_REG — флаги прерываний после маски разрешения
Смещение 0x0070, адрес 0x6002 3070, после сброса 0x0000 0000. TRM: регистр 11.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 | Сработал компаратор COMP2 |
| TARGET1_INT_ST | 1 | RO | 0 | Сработал компаратор COMP1 |
| TARGET0_INT_ST | 0 | RO | 0 | Сработал компаратор COMP0 |
SYSTIMER_REAL_TARGETn_LO_REG — компаратор n: фактическое значение срабатывания, младшие 32 бита
3 копии, n = 0…2: смещение 0x0074 + n · 0x0008, после сброса 0x0000 0000. TRM: регистр 11.30.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| TARGETn_LO_RO | 31:0 | RO | 0x0000 0000 |
SYSTIMER_REAL_TARGETn_HI_REG — компаратор n: фактическое значение срабатывания, старшие 20 бит
3 копии, n = 0…2: смещение 0x0078 + n · 0x0008, после сброса 0x0000 0000. TRM: регистр 11.31.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| TARGETn_HI_RO | 19:0 | RO | 0x00000 |
SYSTIMER_DATE_REG — версия блока: дата ревизии аппаратуры
Смещение 0x00FC, адрес 0x6002 30FC, после сброса 0x0201 2251. TRM: регистр 11.36.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| DATE | 31:0 | R/W | 0x0201 2251 |
Частые вопросы
С какой частотой считает системный таймер ESP32-S3?
В среднем 16 МГц: счётчики тактируются от кварца 40 МГц через делитель, который чередует деление на 3 и на 2, то есть в среднем на 2,5. Шаг счёта — 1/16 мкс; 52-битного счётчика при этой частоте хватает примерно на 8,9 года.
Как настроить периодическое прерывание системного таймера ESP32-S3?
По разделу 11.5.3 TRM: выбрать счётчик битом TARGETx_TIMER_UNIT_SEL, записать период в TARGETx_PERIOD, установить TIMER_COMPx_LOAD, сбросить и снова установить TARGETx_PERIOD_MODE, включить компаратор битом TARGETx_WORK_EN регистра SYSTIMER_CONF_REG и прерывание битом TARGETx_INT_ENA. Прерывания пойдут через каждые TARGETx_PERIOD тактов.
Источники
- Espressif. ESP32-S3 Technical Reference Manual, версия 1.8 — глава 11: таблица 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
- RMT — контроллер инфракрасного пульта и импульсных протоколовRMT_CHnDATA_REG, RMT_CHnCONF0_REG, RMT_CHnCONF0_REG, RMT_CHnCONF1_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