SYSTIMER — системный таймер ESP32-C3 и ESP32-S3
Операционной системе нужен таймер, который тикает всегда и никогда не переполняется на практике. В ESP32-C3 и ESP32-S3 это SYSTIMER: 52-битный счётчик на 16 МГц с тремя компараторами, которые выдают прерывания по заданному времени или с заданным периодом.
Обновлено Редакция GAW
SYSTIMER (System Timer) — 52-битный таймер в ESP32-C3 и ESP32-S3, который служит источником тиков операционной системы или общим таймером для периодических и разовых прерываний (TRM ESP32-C3 v1.4, гл. 10; TRM ESP32-S3 v1.8, гл. 11).
Устройство
- Два счётчика UNIT0 и UNIT1 по 52 бита.
- Три компаратора COMP0–COMP2, каждый сравнивает значение одного из счётчиков с уставкой и выдаёт своё прерывание через матрицу прерываний.
- Тактирование. Счётчики работают от кварца 40 МГц: дробный делитель делит его по очереди на 3 и на 2, в среднем на 2,5, — получается 16 МГц, шаг счёта 1/16 мкс (разд. 10.3). Регистры при этом читаются и пишутся на частоте шины APB.
Режимы будильника
| Режим | Как задаётся | Что происходит |
|---|---|---|
| Target (разовый) | 52-битное значение t | одно прерывание, когда счётчик дойдёт до t |
| Period (периодический) | 26-битный период t | прерывания при t1 + t, t1 + 2t и так далее |
Если уставка разового режима уже пройдена, прерывание выдаётся сразу (разд. 10.4.2). Это похоже на сравнение счётчика обычного таймера, только без перезапуска счётчика.
По нашему расчёту, 52-битный счётчик на 16 МГц переполнится через 2⁵² / 16 000 000 ≈ 2,8 · 10⁸ с, то есть почти через 9 лет, а наибольший период при 26-битном поле — (2²⁶ − 1) / 16 МГц ≈ 4,2 с.
Чтение и загрузка значения
Значение счётчика читают через защёлку: запись 1 в SYSTIMER_TIMER_UNITn_UPDATE переписывает текущее значение в пару регистров VALUE_LO/VALUE_HI и выставляет VALUE_VALID; до следующего UPDATE они не меняются. Новое значение загружают битом LOAD из регистров LOAD_LO/LOAD_HI (разд. 10.4.1). Так, например, после Light-sleep программа может загрузить в счётчик время сна, отмеренное таймером RTC (разд. 10.2).
Остановка при отладке
Счётчик можно настроить так, чтобы он останавливался, пока процессор остановлен (например, отладчиком), или продолжал считать. У ESP32-C3 за это отвечает бит UNITn_CORE0_STALL_EN (табл. 10.4-1), у двухъядерного ESP32-S3 — отдельные биты для ядер 0 и 1.
Не путать
Со SysTick — таймером ядра Arm Cortex-M в STM32 и других микроконтроллерах. Назначение у них общее, но SYSTIMER — периферия Espressif. Подробнее о чипах — на страницах ESP32-C3 и ESP32-S3.
Частые вопросы
Чем SYSTIMER отличается от SysTick?
SysTick — таймер, встроенный в ядро Arm Cortex-M. SYSTIMER — периферийный блок Espressif в ESP32-C3 и ESP32-S3: 52 бита, два счётчика и три компаратора, тактирование 16 МГц от кварца (TRM ESP32-C3, гл. 10). Назначение похожее — тики операционной системы.
Через сколько переполнится SYSTIMER?
По нашему расчёту, 52-битный счётчик на 16 МГц переполняется через 2⁵² / 16 000 000 ≈ 2,8 · 10⁸ с — почти 9 лет. Самый длинный период периодического будильника при 26-битном поле — около 4,2 с.
Есть ли SYSTIMER в классическом ESP32?
В TRM ESP32 v5.8 такого блока нет — он описан в TRM ESP32-C3 (гл. 10) и ESP32-S3 (гл. 11). Для других чипов проверяйте их TRM.
Источники
- Espressif. ESP32-C3 Technical Reference Manual v1.4 — гл. 10: разд. 10.1 — 52-битный таймер для тиков ОС, периодических и разовых прерываний, счётчики UNIT0 и UNIT1, компараторы COMP0–COMP2; разд. 10.2 — 52-битные значения будильника и 26-битный период, режимы target и period, после Light-sleep можно загрузить время сна из таймера RTC, остановка или работа при остановке CPU и отладке; разд. 10.3 — XTAL_CLK 40 МГц, по очереди /3 и /2, в среднем /2,5 = 16 МГц, шаг 1/16 мкс; табл. 10.4-1 — SYSTIMER_TIMER_UNITn_WORK_EN и UNITn_CORE0_STALL_EN; разд. 10.4.1 — LOAD и UPDATE, VALUE_VALID; разд. 10.4.2 — режимы, выбор UNIT, будильник сразу, если цель уже прошла
- Espressif. ESP32-S3 Technical Reference Manual v1.8 — гл. 11, разд. 11.1–11.2: те же 52-битные счётчики и компараторы, 16 МГц от XTAL_CLK 40 МГц, режимы target и period; биты остановки для двух ядер — UNITn_CORE0_STALL_EN и UNITn_CORE1_STALL_EN
Нашли ошибку?
Смотрите также
- SysTick24-битный таймер ядра Cortex-M для системного тика
- Light-sleep ESP32Лёгкий сон ESP32: процессор остановлен, пробуждение без перезагрузки
- Матрица прерываний ESP32Коммутатор источников прерываний периферии на входы ядер ESP32
- ESP32-C3: выводы и GPIO22 GPIO: функции, свободные и занятые выводы, флеш-память, strapping, USB, JTAG, токи
- ESP32-S3: выводы и GPIO45 GPIO: функции, свободные и занятые выводы, флеш и PSRAM, strapping, USB, JTAG, токи
- Output compare (сравнение)Действие на выводе и флаг при совпадении счётчика с регистром