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

Регистры TIMG ESP32-S3

Регистры групп таймеров ESP32-S3: в каждой группе два 54-битных таймера T0 и T1 с 16-битным делителем, будильником и перезагрузкой, сторожевой таймер MWDT с четырьмя стадиями и схема измерения частоты медленного RTC-генератора.

У ESP32-S3 две группы таймеров: TIMG0 по адресу 0x6001 F000 и TIMG1 по адресу 0x6002 0000, макросы ESP-IDF принимают номер группы — TIMG_T0CONFIG_REG(1). В группе два таймера, T0 и T1, с одинаковыми регистрами через 0x24: 54-битный счётчик вверх или вниз, такт — APB_CLK или XTAL_CLK (бит USE_XTAL) через делитель 2…65 536.

Чтобы прочитать счётчик, в TIMG_TxUPDATE_REG записывают любое значение; когда бит сбросится, текущее значение лежит в TxLO (младшие 32 бита) и TxHI (старшие 22). Будильник сравнивает счётчик с ALARMLO и ALARMHI, сбрасывает ALARM_EN и, если включено, перезагружает счётчик значением LOADLO и LOADHI.

Сторож MWDT проходит четыре стадии; действие каждой — прерывание, сброс процессора или сброс системы. Регистры сторожа защищены: пока в TIMG_WDTWPROTECT_REG не записан ключ 0x50D83AA1, запись в них не действует. При загрузке из флеш-памяти MWDT группы 0 включается автоматически (глава 13 TRM).

ЭкземплярБазовый адрес
TIMG00x6001 F000
TIMG10x6002 0000

Пример на C

TIMG0: чтение 54-битного счётчика T0 (soc/timer_group_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/timer_group_reg.h"

REG_WRITE(TIMG_T0UPDATE_REG(0), TIMG_T0_UPDATE);         // защёлкнуть значение
while (REG_GET_BIT(TIMG_T0UPDATE_REG(0), TIMG_T0_UPDATE)) {}
uint64_t t = ((uint64_t)REG_READ(TIMG_T0HI_REG(0)) << 32) | REG_READ(TIMG_T0LO_REG(0));

Регистры блока

Регистр (ESP-IDF)СмещениеНазначениеПосле сброса
TIMG_TnCONFIG_REG(i)0x0000 + n · 0x0024Таймер n: включение, направление, делитель, будильник0x6000 2000
TIMG_TnLO_REG(i)0x0004 + n · 0x0024Таймер n: защёлкнутое значение, младшие 32 бита0x0000 0000
TIMG_TnHI_REG(i)0x0008 + n · 0x0024Таймер n: защёлкнутое значение, старшие 22 бита0x0000 0000
TIMG_TnUPDATE_REG(i)0x000C + n · 0x0024Таймер n: защёлкнуть текущее значение0x0000 0000
TIMG_TnALARMLO_REG(i)0x0010 + n · 0x0024Таймер n: значение будильника, младшие 32 бита0x0000 0000
TIMG_TnALARMHI_REG(i)0x0014 + n · 0x0024Таймер n: значение будильника, старшие 22 бита0x0000 0000
TIMG_TnLOADLO_REG(i)0x0018 + n · 0x0024Таймер n: значение перезагрузки, младшие 32 бита0x0000 0000
TIMG_TnLOADHI_REG(i)0x001C + n · 0x0024Таймер n: значение перезагрузки, старшие 22 бита0x0000 0000
TIMG_TnLOAD_REG(i)0x0020 + n · 0x0024Таймер n: загрузить значение перезагрузки сейчас0x0000 0000
TIMG_WDTCONFIG0_REG(i)0x0048Сторож: включение, действия стадий, длительности сброса0x0004 C000
TIMG_WDTCONFIG1_REG(i)0x004CСторож: предделитель0x0001 0000
TIMG_WDTCONFIG2_REG(i)0x0050Сторож: длительность стадии 00x018C BA80
TIMG_WDTCONFIG3_REG(i)0x0054Сторож: длительность стадии 10x07FF FFFF
TIMG_WDTCONFIG4_REG(i)0x0058Сторож: длительность стадии 20x000F FFFF
TIMG_WDTCONFIG5_REG(i)0x005CСторож: длительность стадии 30x000F FFFF
TIMG_WDTFEED_REG(i)0x0060Сторож: кормление0x0000 0000
TIMG_WDTWPROTECT_REG(i)0x0064Сторож: защита записи0x50D8 3AA1
TIMG_RTCCALICFG_REG(i)0x0068Измерение частоты RTC-генератора: запуск и выбор0x0001 3000
TIMG_RTCCALICFG1_REG(i)0x006CИзмерение частоты RTC-генератора: результат0x0000 0000
TIMG_INT_ENA_TIMERS_REG(i)0x0070Разрешение прерываний0x0000 0000
TIMG_INT_RAW_TIMERS_REG(i)0x0074Необработанные флаги прерываний0x0000 0000
TIMG_INT_ST_TIMERS_REG(i)0x0078Флаги прерываний после маски разрешения0x0000 0000
TIMG_INT_CLR_TIMERS_REG(i)0x007CСброс флагов прерываний записью 10x0000 0000
TIMG_RTCCALICFG2_REG(i)0x0080Измерение частоты RTC-генератора: таймаут0xFFFF FF98
TIMG_NTIMERS_DATE_REG(i)0x00F8Версия блока: дата ревизии аппаратуры0x0200 3071
TIMG_REGCLK_REG(i)0x00FCТактирование регистров0x0000 0000

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

TIMG_TnCONFIG_REG(i) — таймер n: включение, направление, делитель, будильник

2 копии, n = 0, 1: смещение 0x0000 + n · 0x0024, после сброса 0x6000 2000. TRM: регистр 12.1.

31302928272625242322212019181716
Tn_ENTn_INCREASETn_AUTORELOADTn_DIVIDER
1514131211109876543210
Tn_DIVIDER—Tn_ALARM_ENTn_USE_XTAL—
ПолеБитыДоступСбросНазначение
Tn_EN31R/W01 — счёт включён
Tn_INCREASE30R/W11 — считать вверх, 0 — вниз
Tn_AUTORELOAD29R/W11 — перезагрузка при срабатывании будильника
Tn_DIVIDER28:13R/W0x0001Делитель 2…65 536: значение 0 даёт 65 536, значение 1 — делитель 2; менять при Tn_EN = 0
Tn_ALARM_EN10R/W/SC01 — будильник включён; сбрасывается при срабатывании
Tn_USE_XTAL9R/W0Такт: 0 — APB_CLK, 1 — XTAL_CLK

TIMG_TnLO_REG(i) — таймер n: защёлкнутое значение, младшие 32 бита

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

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

TIMG_TnHI_REG(i) — таймер n: защёлкнутое значение, старшие 22 бита

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

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

TIMG_TnUPDATE_REG(i) — таймер n: защёлкнуть текущее значение

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

ПолеБитыДоступСбросНазначение
Tn_UPDATE31R/W/SC0Запись защёлкивает счётчик в TnLO и TnHI; бит сбрасывается по окончании

TIMG_TnALARMLO_REG(i) — таймер n: значение будильника, младшие 32 бита

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

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

TIMG_TnALARMHI_REG(i) — таймер n: значение будильника, старшие 22 бита

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

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

TIMG_TnLOADLO_REG(i) — таймер n: значение перезагрузки, младшие 32 бита

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

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

TIMG_TnLOADHI_REG(i) — таймер n: значение перезагрузки, старшие 22 бита

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

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

TIMG_TnLOAD_REG(i) — таймер n: загрузить значение перезагрузки сейчас

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

ПолеБитыДоступСбросНазначение
Tn_LOAD31:0WT0x0000 0000Любая запись загружает в счётчик LOADLO и LOADHI

TIMG_WDTCONFIG0_REG(i) — сторож: включение, действия стадий, длительности сброса

Смещение 0x0048, после сброса 0x0004 C000. TRM: регистр 12.10.

31302928272625242322212019181716
WDT_ENWDT_STG0WDT_STG1WDT_STG2WDT_STG3—WDT_CPU_RESET_LENGTHWDT_SYS_RESET_LENGTH
1514131211109876543210
WDT_SYS_RESET_LENGTHWDT_FLASHBOOT_MOD_ENWDT_PROCPU_RESET_ENWDT_APPCPU_RESET_EN—
ПолеБитыДоступСбросНазначение
WDT_EN31R/W01 — сторож включён
WDT_STG030:29R/W0x0Действие стадии 0: 0 — нет, 1 — прерывание, 2 — сброс процессора, 3 — сброс системы (в главе 13 TRM — core reset)
WDT_STG128:27R/W0x0Действие стадии 1, значения как у WDT_STG0
WDT_STG226:25R/W0x0Действие стадии 2, значения как у WDT_STG0
WDT_STG324:23R/W0x0Действие стадии 3, значения как у WDT_STG0
WDT_CPU_RESET_LENGTH20:18R/W0x1Длительность сброса процессора: 0 — 100 нс, 1 — 200, 2 — 300, 3 — 400, 4 — 500, 5 — 800 нс, 6 — 1,6 мкс, 7 — 3,2 мкс
WDT_SYS_RESET_LENGTH17:15R/W0x1Длительность сброса системы, значения как у CPU_RESET_LENGTH
WDT_FLASHBOOT_MOD_EN14R/W11 — защита загрузки из флеш-памяти
WDT_PROCPU_RESET_EN13R/W01 — сторож может сбросить процессор
WDT_APPCPU_RESET_EN12R/W0Зарезервировано

TIMG_WDTCONFIG1_REG(i) — сторож: предделитель

Смещение 0x004C, после сброса 0x0001 0000. TRM: регистр 12.11.

ПолеБитыДоступСбросНазначение
WDT_CLK_PRESCALE31:16R/W0x0001Предделитель: период такта сторожа = период источника · значение

TIMG_WDTCONFIG2_REG(i) — сторож: длительность стадии 0

Смещение 0x0050, после сброса 0x018C BA80. TRM: регистр 12.12.

ПолеБитыДоступСбросНазначение
WDT_STG0_HOLD31:0R/W0x018C BA80Длительность стадии 0 в тактах сторожа

TIMG_WDTCONFIG3_REG(i) — сторож: длительность стадии 1

Смещение 0x0054, после сброса 0x07FF FFFF. TRM: регистр 12.13.

ПолеБитыДоступСбросНазначение
WDT_STG1_HOLD31:0R/W0x07FF FFFFДлительность стадии 1 в тактах сторожа

TIMG_WDTCONFIG4_REG(i) — сторож: длительность стадии 2

Смещение 0x0058, после сброса 0x000F FFFF. TRM: регистр 12.14.

ПолеБитыДоступСбросНазначение
WDT_STG2_HOLD31:0R/W0x000F FFFFДлительность стадии 2 в тактах сторожа

TIMG_WDTCONFIG5_REG(i) — сторож: длительность стадии 3

Смещение 0x005C, после сброса 0x000F FFFF. TRM: регистр 12.15.

ПолеБитыДоступСбросНазначение
WDT_STG3_HOLD31:0R/W0x000F FFFFДлительность стадии 3 в тактах сторожа

TIMG_WDTFEED_REG(i) — сторож: кормление

Смещение 0x0060, после сброса 0x0000 0000. TRM: регистр 12.16.

ПолеБитыДоступСбросНазначение
WDT_FEED31:0WT0x0000 0000Любая запись кормит сторож: возврат к стадии 0 и обнуление счётчика

TIMG_WDTWPROTECT_REG(i) — сторож: защита записи

Смещение 0x0064, после сброса 0x50D8 3AA1. TRM: регистр 12.17.

ПолеБитыДоступСбросНазначение
WDT_WKEY31:0R/W0x50D8 3AA1Пока значение отличается от 0x50D83AA1, запись в регистры сторожа запрещена

TIMG_RTCCALICFG_REG(i) — измерение частоты RTC-генератора: запуск и выбор

Смещение 0x0068, после сброса 0x0001 3000. TRM: регистр 12.18.

31302928272625242322212019181716
RTC_CALI_STARTRTC_CALI_MAX
1514131211109876543210
RTC_CALI_RDYRTC_CALI_CLK_SELRTC_CALI_START_CYCLING—
ПолеБитыДоступСбросНазначение
RTC_CALI_START31R/W01 — запустить разовое измерение
RTC_CALI_MAX30:16R/W0x0001Время измерения в тактах RTC_SLOW_CLK
RTC_CALI_RDY15RO01 — разовое измерение закончено
RTC_CALI_CLK_SEL14:13R/W0x1Что измерять: 0 — RC_SLOW_CLK, 1 — RC_FAST_DIV_CLK, 2 — XTAL32K_CLK
RTC_CALI_START_CYCLING12R/W11 — периодическое измерение

TIMG_RTCCALICFG1_REG(i) — измерение частоты RTC-генератора: результат

Смещение 0x006C, после сброса 0x0000 0000. TRM: регистр 12.19.

31302928272625242322212019181716
RTC_CALI_VALUE
1514131211109876543210
RTC_CALI_VALUE—RTC_CALI_CYCLING_DATA_VLD
ПолеБитыДоступСбросНазначение
RTC_CALI_VALUE31:7RO0x0000000Результат в тактах XTAL_CLK
RTC_CALI_CYCLING_DATA_VLD0RO01 — периодическое измерение закончено

TIMG_INT_ENA_TIMERS_REG(i) — разрешение прерываний

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

1514131211109876543210
—WDT_INT_ENAT1_INT_ENAT0_INT_ENA
ПолеБитыДоступСбросНазначение
WDT_INT_ENA2R/W0Стадия сторожа MWDT, настроенная на прерывание
T1_INT_ENA1R/W0Сработал будильник таймера T1
T0_INT_ENA0R/W0Сработал будильник таймера T0

TIMG_INT_RAW_TIMERS_REG(i) — необработанные флаги прерываний

Смещение 0x0074, после сброса 0x0000 0000. TRM: регистр 12.22.

1514131211109876543210
—WDT_INT_RAWT1_INT_RAWT0_INT_RAW
ПолеБитыДоступСбросНазначение
WDT_INT_RAW2R/WTC/SS0Стадия сторожа MWDT, настроенная на прерывание
T1_INT_RAW1R/W0Сработал будильник таймера T1
T0_INT_RAW0R/W0Сработал будильник таймера T0

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

Смещение 0x0078, после сброса 0x0000 0000. TRM: регистр 12.23.

1514131211109876543210
—WDT_INT_STT1_INT_STT0_INT_ST
ПолеБитыДоступСбросНазначение
WDT_INT_ST2RO0Стадия сторожа MWDT, настроенная на прерывание
T1_INT_ST1RO0Сработал будильник таймера T1
T0_INT_ST0RO0Сработал будильник таймера T0

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

Смещение 0x007C, после сброса 0x0000 0000. TRM: регистр 12.24.

1514131211109876543210
—WDT_INT_CLRT1_INT_CLRT0_INT_CLR
ПолеБитыДоступСбросНазначение
WDT_INT_CLR2WT0Стадия сторожа MWDT, настроенная на прерывание
T1_INT_CLR1WO0Сработал будильник таймера T1
T0_INT_CLR0WO0Сработал будильник таймера T0

TIMG_RTCCALICFG2_REG(i) — измерение частоты RTC-генератора: таймаут

Смещение 0x0080, после сброса 0xFFFF FF98. TRM: регистр 12.20.

31302928272625242322212019181716
RTC_CALI_TIMEOUT_THRES
1514131211109876543210
RTC_CALI_TIMEOUT_THRESRTC_CALI_TIMEOUT_RST_CNT—RTC_CALI_TIMEOUT
ПолеБитыДоступСбросНазначение
RTC_CALI_TIMEOUT_THRES31:7R/W0x1FFFFFFПорог таймаута измерения
RTC_CALI_TIMEOUT_RST_CNT6:3R/W0x3Такты сброса таймаута
RTC_CALI_TIMEOUT0RO01 — измерение не уложилось в таймаут

TIMG_NTIMERS_DATE_REG(i) — версия блока: дата ревизии аппаратуры

Смещение 0x00F8, после сброса 0x0200 3071. TRM: регистр 12.25.

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

TIMG_REGCLK_REG(i) — тактирование регистров

Смещение 0x00FC, после сброса 0x0000 0000. TRM: регистр 12.26.

ПолеБитыДоступСбросНазначение
CLK_EN31R/W01 — такт регистров всегда включён, 0 — только на время обращения

Частые вопросы

Как прочитать значение таймера TIMG ESP32-S3?

Записать любое значение в TIMG_T0UPDATE_REG (для таймера T1 — в T1UPDATE), дождаться сброса бита T0_UPDATE и прочитать младшие 32 бита из TIMG_T0LO_REG, старшие 22 — из TIMG_T0HI_REG. Значения не меняются до следующей записи в UPDATE.

Как отключить сторож MWDT ESP32-S3 через регистры?

Записать 0x50D83AA1 в TIMG_WDTWPROTECT_REG, сбросить WDT_EN в TIMG_WDTCONFIG0_REG и записать в WDTWPROTECT любое другое значение. Бита применения настроек, как у ESP32-C3, в регистрах MWDT ESP32-S3 нет. Делитель таймера общего назначения меняют только при сброшенном Tx_EN, иначе результат непредсказуем.

Источники

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

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

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

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