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

Регистры SYSTIMER ESP32-C3

Регистры системного таймера ESP32-C3: два 52-битных счётчика UNIT0 и UNIT1, которые считают с частотой 16 МГц, три компаратора для разовых и периодических прерываний, загрузка нового значения и защёлкивание текущего для чтения.

Системный таймер по адресу 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.

ЭкземплярБазовый адрес
SYSTIMER0x6002 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_REG0x0000Включение счётчиков и компараторов, остановка в отладке0x4400 0000
SYSTIMER_UNITn_OP_REG0x0004 + n · 0x0004Счётчик n: защёлкнуть значение для чтения0x0000 0000
SYSTIMER_UNITn_LOAD_HI_REG0x000C + n · 0x0008Счётчик n: загружаемое значение, старшие 20 бит0x0000 0000
SYSTIMER_UNITn_LOAD_LO_REG0x0010 + n · 0x0008Счётчик n: загружаемое значение, младшие 32 бита0x0000 0000
SYSTIMER_TARGETn_HI_REG0x001C + n · 0x0008Компаратор n: значение срабатывания, старшие 20 бит0x0000 0000
SYSTIMER_TARGETn_LO_REG0x0020 + n · 0x0008Компаратор n: значение срабатывания, младшие 32 бита0x0000 0000
SYSTIMER_TARGETn_CONF_REG0x0034 + n · 0x0004Компаратор n: счётчик, режим и период0x0000 0000
SYSTIMER_UNITn_VALUE_HI_REG0x0040 + n · 0x0008Счётчик n: защёлкнутое значение, старшие 20 бит0x0000 0000
SYSTIMER_UNITn_VALUE_LO_REG0x0044 + n · 0x0008Счётчик n: защёлкнутое значение, младшие 32 бита0x0000 0000
SYSTIMER_COMPn_LOAD_REG0x0050 + n · 0x0004Компаратор n: применить новые настройки0x0000 0000
SYSTIMER_UNITn_LOAD_REG0x005C + n · 0x0004Счётчик n: загрузить значение0x0000 0000
SYSTIMER_INT_ENA_REG0x0064Разрешение прерываний0x0000 0000
SYSTIMER_INT_RAW_REG0x0068Необработанные флаги прерываний0x0000 0000
SYSTIMER_INT_CLR_REG0x006CСброс флагов прерываний записью 10x0000 0000
SYSTIMER_INT_ST_REG0x0070Флаги прерываний после маски разрешения0x0000 0000
SYSTIMER_DATE_REG0x00FCВерсия блока: дата ревизии аппаратуры0x0200 6171

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

SYSTIMER_CONF_REG — включение счётчиков и компараторов, остановка в отладке

Смещение 0x0000, адрес 0x6002 3000, после сброса 0x4400 0000. TRM: регистр 10.1.

31302928272625242322212019181716
CLK_ENTIMER_UNIT0_WORK_ENTIMER_UNIT1_WORK_ENTIMER_UNIT0_CORE0_STALL_EN—TIMER_UNIT1_CORE0_STALL_EN—TARGET0_WORK_ENTARGET1_WORK_ENTARGET2_WORK_EN—
1514131211109876543210
—
ПолеБитыДоступСбросНазначение
CLK_EN31R/W0Тактирование регистров
TIMER_UNIT0_WORK_EN30R/W1Счётчик 0 работает
TIMER_UNIT1_WORK_EN29R/W0Счётчик 1 работает
TIMER_UNIT0_CORE0_STALL_EN28R/W0Останавливать счётчик 0, пока ядро остановлено отладчиком
TIMER_UNIT1_CORE0_STALL_EN26R/W1Останавливать счётчик 1, пока ядро остановлено отладчиком
TARGET0_WORK_EN24R/W0Компаратор 0 работает
TARGET1_WORK_EN23R/W0Компаратор 1 работает
TARGET2_WORK_EN22R/W0Компаратор 2 работает

SYSTIMER_UNITn_OP_REG — счётчик n: защёлкнуть значение для чтения

2 копии, n = 0, 1: смещение 0x0004 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 10.2.

31302928272625242322212019181716
—TIMER_UNITn_UPDATETIMER_UNITn_VALUE_VALID—
1514131211109876543210
—
ПолеБитыДоступСбросНазначение
TIMER_UNITn_UPDATE30WT0Запись 1 защёлкивает значение счётчика
TIMER_UNITn_VALUE_VALID29R/SS/WTC0Защёлкнутое значение готово к чтению

SYSTIMER_UNITn_LOAD_HI_REG — счётчик n: загружаемое значение, старшие 20 бит

2 копии, n = 0, 1: смещение 0x000C + n · 0x0008, после сброса 0x0000 0000. TRM: регистр 10.3.

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

SYSTIMER_UNITn_LOAD_LO_REG — счётчик n: загружаемое значение, младшие 32 бита

2 копии, n = 0, 1: смещение 0x0010 + n · 0x0008, после сброса 0x0000 0000. TRM: регистр 10.4.

ПолеБитыДоступСброс
TIMER_UNITn_LOAD_LO31:0R/W0x0000 0000

SYSTIMER_TARGETn_HI_REG — компаратор n: значение срабатывания, старшие 20 бит

3 копии, n = 0…2: смещение 0x001C + n · 0x0008, после сброса 0x0000 0000. TRM: регистр 10.14.

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

SYSTIMER_TARGETn_LO_REG — компаратор n: значение срабатывания, младшие 32 бита

3 копии, n = 0…2: смещение 0x0020 + n · 0x0008, после сброса 0x0000 0000. TRM: регистр 10.15.

ПолеБитыДоступСброс
TIMER_TARGETn_LO31:0R/W0x0000 0000

SYSTIMER_TARGETn_CONF_REG — компаратор n: счётчик, режим и период

3 копии, n = 0…2: смещение 0x0034 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 10.16.

31302928272625242322212019181716
TARGETn_TIMER_UNIT_SELTARGETn_PERIOD_MODE—TARGETn_PERIOD
1514131211109876543210
TARGETn_PERIOD
ПолеБитыДоступСбросНазначение
TARGETn_TIMER_UNIT_SEL31R/W0Счётчик для компаратора: 0 — UNIT0, 1 — UNIT1
TARGETn_PERIOD_MODE30R/W01 — периодический режим, 0 — разовое срабатывание
TARGETn_PERIOD25:0R/W0x0000000Период в тактах для периодического режима

SYSTIMER_UNITn_VALUE_HI_REG — счётчик n: защёлкнутое значение, старшие 20 бит

2 копии, n = 0, 1: смещение 0x0040 + n · 0x0008, после сброса 0x0000 0000. TRM: регистр 10.5.

ПолеБитыДоступСброс
TIMER_UNITn_VALUE_HI19:0RO0x00000

SYSTIMER_UNITn_VALUE_LO_REG — счётчик n: защёлкнутое значение, младшие 32 бита

2 копии, n = 0, 1: смещение 0x0044 + n · 0x0008, после сброса 0x0000 0000. TRM: регистр 10.6.

ПолеБитыДоступСброс
TIMER_UNITn_VALUE_LO31:0RO0x0000 0000

SYSTIMER_COMPn_LOAD_REG — компаратор n: применить новые настройки

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

ПолеБитыДоступСбросНазначение
TIMER_COMPn_LOAD0WT0Запись 1 применяет значение и режим компаратора

SYSTIMER_UNITn_LOAD_REG — счётчик n: загрузить значение

2 копии, n = 0, 1: смещение 0x005C + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 10.7.

ПолеБитыДоступСбросНазначение
TIMER_UNITn_LOAD0WT0Запись 1 загружает UNITn_LOAD_HI и LO в счётчик

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

Смещение 0x0064, адрес 0x6002 3064, после сброса 0x0000 0000. TRM: регистр 10.26.

1514131211109876543210
—TARGET2_INT_ENATARGET1_INT_ENATARGET0_INT_ENA
ПолеБитыДоступСбросНазначение
TARGET2_INT_ENA2R/W0Сработал компаратор 2
TARGET1_INT_ENA1R/W0Сработал компаратор 1
TARGET0_INT_ENA0R/W0Сработал компаратор 0

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

Смещение 0x0068, адрес 0x6002 3068, после сброса 0x0000 0000. TRM: регистр 10.27.

1514131211109876543210
—TARGET2_INT_RAWTARGET1_INT_RAWTARGET0_INT_RAW
ПолеБитыДоступСбросНазначение
TARGET2_INT_RAW2R/WTC/SS0Сработал компаратор 2
TARGET1_INT_RAW1R/WTC/SS0Сработал компаратор 1
TARGET0_INT_RAW0R/WTC/SS0Сработал компаратор 0

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

Смещение 0x006C, адрес 0x6002 306C, после сброса 0x0000 0000. TRM: регистр 10.28.

1514131211109876543210
—TARGET2_INT_CLRTARGET1_INT_CLRTARGET0_INT_CLR
ПолеБитыДоступСбросНазначение
TARGET2_INT_CLR2WT0Сработал компаратор 2
TARGET1_INT_CLR1WT0Сработал компаратор 1
TARGET0_INT_CLR0WT0Сработал компаратор 0

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

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

1514131211109876543210
—TARGET2_INT_STTARGET1_INT_STTARGET0_INT_ST
ПолеБитыДоступСбросНазначение
TARGET2_INT_ST2RO0Сработал компаратор 2
TARGET1_INT_ST1RO0Сработал компаратор 1
TARGET0_INT_ST0RO0Сработал компаратор 0

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

Смещение 0x00FC, адрес 0x6002 30FC, после сброса 0x0200 6171. TRM: регистр 10.30.

ПолеБитыДоступСброс
DATE31:0R/W0x0200 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.

Источники

  1. Espressif. ESP32-C3 Technical Reference Manual, версия 1.4 — глава 10: таблица Register Summary и рисунки регистров — смещения, поля, тип доступа и значения после сброса
  2. Espressif. SVD svd/esp32c3.svd, версия 18 (espressif/svd, коммит be20aa1) — базовые адреса периферии, список регистров и полей; лицензия Apache-2.0
  3. Espressif. ESP-IDF v6.1: заголовки components/soc/esp32c3/register/soc/*_reg.h (коммит fff9895) — имена макросов регистров и полей, сверка положения полей и значений по умолчанию; лицензия Apache-2.0 OR MIT

Нашли ошибку в регистрах?

Другие регистры ESP32-C3

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