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

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.

Источники

  1. 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, будильник сразу, если цель уже прошла
  2. 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

Нашли ошибку?